on d17d9fe help sign in
elk/src/Generate/JavaScript.hs
91 lines 2.5 kB history raw
1module Generate.JavaScript (generate) where
3import qualified Control.Monad.State as State
4import qualified Data.Text.Lazy as LazyText
5import qualified Language.ECMAScript3.Syntax as JS
7import qualified AST.Effects as Effects
8import qualified AST.Module as Module
9import qualified AST.Module.Name as ModuleName
10import qualified Elm.Package as Pkg
11import qualified Generate.JavaScript.Builder as Builder
12import qualified Generate.JavaScript.Expression as JS
13import qualified Generate.JavaScript.Helpers as JS
14import qualified Generate.JavaScript.Variable as Var
18-- GENERATE JAVASCRIPT
21generate :: Module.Optimized -> LazyText.Text
22generate (Module.Module moduleName _ info) =
23 let
24 genBody =
25 do defsList <- mapM JS.generateDef (Module.program info)
26 let managerStmts = generateEffectManager moduleName (Module.effects info)
27 return (concat (defsList ++ [managerStmts]))
29 body =
30 State.evalState genBody 0
31 in
32 Builder.stmtsToText body
36-- GENERATE EFFECT MANAGER
39generateEffectManager :: ModuleName.Canonical -> Effects.Canonical -> [JS.Statement ()]
40generateEffectManager moduleName effects =
41 case effects of
42 Effects.None ->
43 []
45 Effects.Port _ ->
46 []
48 Effects.Manager pkgName (Effects.Info _ _ _ _ managerType) ->
49 let
50 managers =
51 Var.coreNative "Platform" "effectManagers"
53 managerName =
54 JS.StringLit () (ModuleName.canonicalToString moduleName)
56 entry name =
57 ( JS.PropId () (JS.Id () name)
58 , JS.ref (Var.qualified moduleName name)
59 )
61 managerEntries =
62 [ "pkg" ==> Pkg.toString pkgName
63 , entry "init"
64 , entry "onEffects"
65 , entry "onSelfMsg"
66 ]
68 otherEntries =
69 case managerType of
70 Effects.CmdManager _ ->
71 [ "tag" ==> "cmd", entry "cmdMap" ]
73 Effects.SubManager _ ->
74 [ "tag" ==> "sub", entry "subMap" ]
76 Effects.FxManager _ _ ->
77 [ "tag" ==> "fx", entry "cmdMap", entry "subMap" ]
79 addManager =
80 JS.AssignExpr () JS.OpAssign
81 (JS.LBracket () managers managerName)
82 (JS.ObjectLit () (managerEntries ++ otherEntries))
83 in
84 [ JS.ExprStmt () addManager ]
87(==>) :: String -> String -> ( JS.Prop (), JS.Expression () )
88(==>) key value =
89 ( JS.PropId () (JS.Id () key)
90 , JS.StringLit () value
91 )