content: {- | Machine Fortran LOGICAL values.
  
  Fortran compilers usually store LOGICALs as INTEGERs (they former is tied to the
  latter in the specifications). To more accurately simulate their behaviour, we
  represent them directly as integers, and simply provide a handful of definitions
  for using them as booleans.
  -}
  
  module Language.Fortran.Repr.Value.Scalar.Logical.Machine where
  
  import Language.Fortran.Repr.Value.Scalar.Int.Machine
  
  -- | Retrieve the boolean value stored by a @LOGICAL(x)@.
  fLogicalToBool :: FInt -> Bool
  fLogicalToBool = fIntUOp $ consumeFLogicalNumeric True False
  
  -- | Convert a bool to its Fortran machine representation in any numeric type.
  fLogicalNumericFromBool :: Num a => Bool -> a
  fLogicalNumericFromBool = \case True -> 1; False -> 0
  
  -- | Consume some Fortran logical stored using an integer.
  consumeFLogicalNumeric :: (Num a, Eq a) => r -> r -> a -> r
  consumeFLogicalNumeric whenTrue whenFalse bi =
      if bi == 1 then whenTrue else whenFalse
  
  fLogicalNot :: FInt -> FInt
  fLogicalNot = fIntUOpInplace (consumeFLogicalNumeric 0 1)
  