diff options
Diffstat (limited to 'Generate.hs')
-rw-r--r-- | Generate.hs | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/Generate.hs b/Generate.hs index 8bc725f..3b5bb0e 100644 --- a/Generate.hs +++ b/Generate.hs | |||
@@ -9,6 +9,7 @@ import Data.Text (Text) | |||
9 | import qualified Data.Map as Map | 9 | import qualified Data.Map as Map |
10 | 10 | ||
11 | import Data.Time.Clock | 11 | import Data.Time.Clock |
12 | import Control.Monad.Writer | ||
12 | 13 | ||
13 | import Definitions | 14 | import Definitions |
14 | import Language | 15 | import Language |
@@ -21,31 +22,36 @@ instance Unquote Type | |||
21 | 22 | ||
22 | main :: IO () | 23 | main :: IO () |
23 | main = do | 24 | main = do |
24 | irHs <- eitherParseFile "templates/data.hs.ede" | 25 | dataHpp <- eitherParseFile "templates/data.hpp.ede" |
25 | irPs <- eitherParseFile "templates/data.purs.ede" | 26 | dataCpp <- eitherParseFile "templates/data.cpp.ede" |
26 | let generate name def = do | 27 | dataHs <- eitherParseFile "templates/data.hs.ede" |
28 | dataPs <- eitherParseFile "templates/data.purs.ede" | ||
29 | let generate (ModuleDef name imports def) = do | ||
27 | dt <- getCurrentTime | 30 | dt <- getCurrentTime |
28 | let env = fromPairs | 31 | let env = fromPairs |
29 | [ "dataAndType" .= def | 32 | [ "dataAndType" .= def |
30 | , "definitions" .= [a | a@DataDef{} <- def ] | 33 | , "definitions" .= [a | a@DataDef{} <- def ] |
31 | , "moduleName" .= name | 34 | , "moduleName" .= name |
32 | , "dateTime" .= dt | 35 | , "dateTime" .= dt |
36 | , "imports" .= imports | ||
33 | ] | 37 | ] |
34 | aliasMap = Map.fromList [(n,t) | TypeAlias n t <- def] | 38 | aliasMap = Map.fromList [(n,t) | TypeAlias n t <- def] |
35 | mylib :: HashMap Text Term | 39 | mylib :: HashMap Text Term |
36 | mylib = HashMap.fromList | 40 | mylib = HashMap.fromList |
37 | -- boolean | 41 | [ "hasFieldNames" @: hasFieldNames |
38 | [ "hasFieldNames" @: hasFieldNames | 42 | , "parens" @: parens |
39 | , "parens" @: parens | 43 | , "constType" @: constType |
40 | , "constType" @: constType | 44 | , "hsType" @: hsType aliasMap |
41 | , "hsType" @: hsType aliasMap | 45 | , "psType" @: psType aliasMap |
42 | , "psType" @: psType aliasMap | 46 | , "cppType" @: cppType aliasMap |
47 | , "mangleTypeName" @: mangleTypeName aliasMap | ||
43 | ] | 48 | ] |
44 | 49 | ||
45 | -- Haskell | 50 | -- Haskell |
46 | either error (\x -> writeFile ("out/" ++ name ++ ".hs") $ LText.unpack x) $ irHs >>= (\t -> eitherRenderWith mylib t env) | 51 | either error (\x -> writeFile ("out/" ++ name ++ ".hs") $ LText.unpack x) $ dataHs >>= (\t -> eitherRenderWith mylib t env) |
47 | -- Purescript | 52 | -- Purescript |
48 | either error (\x -> writeFile ("out/" ++ name ++ ".purs") $ LText.unpack x) $ irPs >>= (\t -> eitherRenderWith mylib t env) | 53 | either error (\x -> writeFile ("out/" ++ name ++ ".purs") $ LText.unpack x) $ dataPs >>= (\t -> eitherRenderWith mylib t env) |
49 | generate "IR" ir | 54 | -- C++ |
50 | generate "Mesh" mesh | 55 | either error (\x -> writeFile ("out/" ++ name ++ ".hpp") $ LText.unpack x) $ dataHpp >>= (\t -> eitherRenderWith mylib t env) |
51 | generate "TypeInfo" typeInfo | 56 | either error (\x -> writeFile ("out/" ++ name ++ ".cpp") $ LText.unpack x) $ dataCpp >>= (\t -> eitherRenderWith mylib t env) |
57 | mapM_ generate $ execWriter modules | ||