-- | Defines the 'Code' data type.
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)

-- | Represents the generated code as a list of file names and rendered code pairs.
newtype Code = Code { Code -> [(FilePath, Doc)]
unCode :: [(FilePath, Doc)]}

-- | Default mapping between 'Space' and 'CodeType'.
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)