summaryrefslogtreecommitdiff
path: root/Generate.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Generate.hs')
-rw-r--r--Generate.hs34
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)
9import qualified Data.Map as Map 9import qualified Data.Map as Map
10 10
11import Data.Time.Clock 11import Data.Time.Clock
12import Control.Monad.Writer
12 13
13import Definitions 14import Definitions
14import Language 15import Language
@@ -21,31 +22,36 @@ instance Unquote Type
21 22
22main :: IO () 23main :: IO ()
23main = do 24main = 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