on 5b5230c help sign in
135 lines 2.9 kB history raw
1module Generate.JavaScript.BuiltIn
2 ( character, string
3 , list, range
4 , recordUpdate
5 , eq, cmp
6 , effect, outgoingPort, incomingPort
7 , crash
8 )
9 where
11import qualified Language.ECMAScript3.Syntax as JS
13import qualified AST.Module.Name as ModuleName
14import Generate.JavaScript.Helpers ((<|), (==>), call)
15import qualified Generate.JavaScript.Variable as Var
16import qualified Reporting.Region as R
20utils :: String -> [JS.Expression ()] -> JS.Expression ()
21utils func args =
22 Var.coreNative "Utils" func `call` args
25nativeList :: String -> [JS.Expression ()] -> JS.Expression ()
26nativeList func args =
27 Var.coreNative "List" func `call` args
31-- LITERALS
34character :: Char -> JS.Expression ()
35character char =
36 utils "chr" [ JS.StringLit () [char] ]
39string :: String -> JS.Expression ()
40string str =
41 JS.StringLit () str
45-- LISTS
48list :: [JS.Expression ()] -> JS.Expression ()
49list elements =
50 nativeList "fromArray" [ JS.ArrayLit () elements ]
53range :: JS.Expression () -> JS.Expression () -> JS.Expression ()
54range low high =
55 nativeList "range" [ low, high ]
59-- RECORDS
62recordUpdate :: JS.Expression () -> [(String, JS.Expression ())] -> JS.Expression ()
63recordUpdate record fields =
64 utils "update"
65 [ record
66 , JS.ObjectLit () (map (uncurry (==>)) fields)
67 ]
71-- COMPARISIONS
74eq :: JS.Expression () -> JS.Expression () -> JS.Expression ()
75eq left right =
76 utils "eq" [ left, right ]
79cmp :: JS.Expression () -> JS.Expression () -> JS.Expression ()
80cmp left right =
81 utils "cmp" [ left, right ]
85-- EFFECTS
88effect :: ModuleName.Canonical -> JS.Expression ()
89effect effectName =
90 Var.coreNative "Platform" "leaf" <|
91 JS.StringLit () (ModuleName.canonicalToString effectName)
94outgoingPort :: String -> JS.Expression () -> JS.Expression ()
95outgoingPort name converter =
96 Var.coreNative "Platform" "outgoingPort" `call` [ JS.StringLit () name, converter ]
99incomingPort :: String -> JS.Expression () -> JS.Expression ()
100incomingPort name converter =
101 Var.coreNative "Platform" "incomingPort" `call` [ JS.StringLit () name, converter ]
105-- CRASH
108crash :: ModuleName.Canonical -> R.Region -> Maybe (JS.Expression ()) -> JS.Expression ()
109crash home region maybeCaseCrashValue =
110 let
111 homeString =
112 JS.StringLit () (ModuleName.canonicalToString home)
113 in
114 case maybeCaseCrashValue of
115 Nothing ->
116 utils "crash" [ homeString, regionToJs region ]
118 Just crashValue ->
119 utils "crashCase" [ homeString, regionToJs region, crashValue ]
122regionToJs :: R.Region -> JS.Expression ()
123regionToJs (R.Region start end) =
124 JS.ObjectLit ()
125 [ "start" ==> positionToJs start
126 , "end" ==> positionToJs end
127 ]
130positionToJs :: R.Position -> JS.Expression ()
131positionToJs (R.Position line column) =
132 JS.ObjectLit ()
133 [ "line" ==> JS.IntLit () line
134 , "column" ==> JS.IntLit () column
135 ]