module Language.Drasil.Code.Code (
Code(..),
spaceToCodeType
) where
import qualified Language.Drasil as S (Space(..))
import GOOL.Drasil (CodeType(..))
import Text.PrettyPrint.HughesPJ (Doc)
import Data.List.NonEmpty (toList)
newtype Code = Code { Code -> [(FilePath, Doc)]
unCode :: [(FilePath, Doc)]}
spaceToCodeType :: S.Space -> [CodeType]
spaceToCodeType :: Space -> [CodeType]
spaceToCodeType S.Integer = [CodeType
Integer]
spaceToCodeType S.Natural = [CodeType
Integer]
spaceToCodeType S.Radians = [CodeType
Double, CodeType
Float]
spaceToCodeType S.Real = [CodeType
Double, CodeType
Float]
spaceToCodeType S.Rational = [CodeType
Double, CodeType
Float]
spaceToCodeType S.Boolean = [CodeType
Boolean]
spaceToCodeType S.Char = [CodeType
Char]
spaceToCodeType S.String = [CodeType
String]
spaceToCodeType (S.Vect s :: Space
s) = (CodeType -> CodeType) -> [CodeType] -> [CodeType]
forall a b. (a -> b) -> [a] -> [b]
map CodeType -> CodeType
List (Space -> [CodeType]
spaceToCodeType Space
s)
spaceToCodeType (S.Array s :: Space
s) = (CodeType -> CodeType) -> [CodeType] -> [CodeType]
forall a b. (a -> b) -> [a] -> [b]
map CodeType -> CodeType
Array (Space -> [CodeType]
spaceToCodeType Space
s)
spaceToCodeType (S.Actor s :: FilePath
s) = [FilePath -> CodeType
Object FilePath
s]
spaceToCodeType (S.DiscreteD _) = (CodeType -> CodeType) -> [CodeType] -> [CodeType]
forall a b. (a -> b) -> [a] -> [b]
map CodeType -> CodeType
List (Space -> [CodeType]
spaceToCodeType Space
S.Rational)
spaceToCodeType (S.DiscreteS _) = (CodeType -> CodeType) -> [CodeType] -> [CodeType]
forall a b. (a -> b) -> [a] -> [b]
map CodeType -> CodeType
List (Space -> [CodeType]
spaceToCodeType Space
S.String)
spaceToCodeType S.Void = [CodeType
Void]
spaceToCodeType (S.Function i :: NonEmpty Space
i t :: Space
t) = [[CodeType] -> CodeType -> CodeType
Func [CodeType]
is CodeType
ts | [CodeType]
is <- [[CodeType]]
ins, CodeType
ts <- [CodeType]
trgs]
where trgs :: [CodeType]
trgs = Space -> [CodeType]
spaceToCodeType Space
t
ins :: [[CodeType]]
ins = (Space -> [CodeType]) -> [Space] -> [[CodeType]]
forall a b. (a -> b) -> [a] -> [b]
map Space -> [CodeType]
spaceToCodeType (NonEmpty Space -> [Space]
forall a. NonEmpty a -> [a]
toList NonEmpty Space
i)