{-# LANGUAGE DerivingVia #-}
module Language.Fortran.Repr.Value.Machine where
import Language.Fortran.Repr.Value.Scalar.Real
import Language.Fortran.Repr.Value.Scalar.Int.Machine
import Language.Fortran.Repr.Value.Scalar.Machine
import Language.Fortran.Repr.Type
import GHC.Generics ( Generic )
import Data.Data ( Data )
import Data.Binary ( Binary )
import Text.PrettyPrint.GenericPretty ( Out )
data FValue = MkFScalarValue FScalarValue
deriving stock (Int -> FValue -> ShowS
[FValue] -> ShowS
FValue -> String
(Int -> FValue -> ShowS)
-> (FValue -> String) -> ([FValue] -> ShowS) -> Show FValue
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FValue -> ShowS
showsPrec :: Int -> FValue -> ShowS
$cshow :: FValue -> String
show :: FValue -> String
$cshowList :: [FValue] -> ShowS
showList :: [FValue] -> ShowS
Show, (forall x. FValue -> Rep FValue x)
-> (forall x. Rep FValue x -> FValue) -> Generic FValue
forall x. Rep FValue x -> FValue
forall x. FValue -> Rep FValue x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. FValue -> Rep FValue x
from :: forall x. FValue -> Rep FValue x
$cto :: forall x. Rep FValue x -> FValue
to :: forall x. Rep FValue x -> FValue
Generic, Typeable FValue
Typeable FValue =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> FValue -> c FValue)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c FValue)
-> (FValue -> Constr)
-> (FValue -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c FValue))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c FValue))
-> ((forall b. Data b => b -> b) -> FValue -> FValue)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> FValue -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> FValue -> r)
-> (forall u. (forall d. Data d => d -> u) -> FValue -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> FValue -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> FValue -> m FValue)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> FValue -> m FValue)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> FValue -> m FValue)
-> Data FValue
FValue -> Constr
FValue -> DataType
(forall b. Data b => b -> b) -> FValue -> FValue
forall a.
Typeable a =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> FValue -> u
forall u. (forall d. Data d => d -> u) -> FValue -> [u]
forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> FValue -> r
forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> FValue -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> FValue -> m FValue
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> FValue -> m FValue
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c FValue
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> FValue -> c FValue
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c FValue)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c FValue)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> FValue -> c FValue
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> FValue -> c FValue
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c FValue
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c FValue
$ctoConstr :: FValue -> Constr
toConstr :: FValue -> Constr
$cdataTypeOf :: FValue -> DataType
dataTypeOf :: FValue -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c FValue)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c FValue)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c FValue)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c FValue)
$cgmapT :: (forall b. Data b => b -> b) -> FValue -> FValue
gmapT :: (forall b. Data b => b -> b) -> FValue -> FValue
$cgmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> FValue -> r
gmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> FValue -> r
$cgmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> FValue -> r
gmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> FValue -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> FValue -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> FValue -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> FValue -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> FValue -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> FValue -> m FValue
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> FValue -> m FValue
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> FValue -> m FValue
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> FValue -> m FValue
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> FValue -> m FValue
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> FValue -> m FValue
Data, FValue -> FValue -> Bool
(FValue -> FValue -> Bool)
-> (FValue -> FValue -> Bool) -> Eq FValue
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FValue -> FValue -> Bool
== :: FValue -> FValue -> Bool
$c/= :: FValue -> FValue -> Bool
/= :: FValue -> FValue -> Bool
Eq)
deriving anyclass (Get FValue
[FValue] -> Put
FValue -> Put
(FValue -> Put) -> Get FValue -> ([FValue] -> Put) -> Binary FValue
forall t. (t -> Put) -> Get t -> ([t] -> Put) -> Binary t
$cput :: FValue -> Put
put :: FValue -> Put
$cget :: Get FValue
get :: Get FValue
$cputList :: [FValue] -> Put
putList :: [FValue] -> Put
Binary, Int -> FValue -> Doc
[FValue] -> Doc
FValue -> Doc
(Int -> FValue -> Doc)
-> (FValue -> Doc) -> ([FValue] -> Doc) -> Out FValue
forall a. (Int -> a -> Doc) -> (a -> Doc) -> ([a] -> Doc) -> Out a
$cdocPrec :: Int -> FValue -> Doc
docPrec :: Int -> FValue -> Doc
$cdoc :: FValue -> Doc
doc :: FValue -> Doc
$cdocList :: [FValue] -> Doc
docList :: [FValue] -> Doc
Out)
fValueType :: FValue -> FType
fValueType :: FValue -> FType
fValueType = \case
MkFScalarValue FScalarValue
a -> FScalarType -> FType
MkFScalarType (FScalarType -> FType) -> FScalarType -> FType
forall a b. (a -> b) -> a -> b
$ FScalarValue -> FScalarType
fScalarValueType FScalarValue
a
fromConstInt :: FValue -> Maybe Integer
fromConstInt :: FValue -> Maybe Integer
fromConstInt (MkFScalarValue (FSVInt FInt
a)) = Integer -> Maybe Integer
forall a. a -> Maybe a
Just (Integer -> Maybe Integer) -> Integer -> Maybe Integer
forall a b. (a -> b) -> a -> b
$ FInt -> Integer
forall a. Num a => FInt -> a
withFInt FInt
a
fromConstInt FValue
_ = Maybe Integer
forall a. Maybe a
Nothing
fromConstReal :: FValue -> Maybe Double
fromConstReal :: FValue -> Maybe Double
fromConstReal (MkFScalarValue (FSVReal (FReal4 Float
a))) = Double -> Maybe Double
forall a. a -> Maybe a
Just (Double -> Maybe Double) -> Double -> Maybe Double
forall a b. (a -> b) -> a -> b
$ Float -> Double
floatToDouble Float
a
where
floatToDouble :: Float -> Double
floatToDouble :: Float -> Double
floatToDouble = Float -> Double
forall a b. (Real a, Fractional b) => a -> b
realToFrac
fromConstReal (MkFScalarValue (FSVReal (FReal8 Double
a))) = Double -> Maybe Double
forall a. a -> Maybe a
Just (Double -> Maybe Double) -> Double -> Maybe Double
forall a b. (a -> b) -> a -> b
$ Double
a
fromConstReal FValue
_ = Maybe Double
forall a. Maybe a
Nothing