on 41df71f help sign in
139 lines 2.9 kB history raw
1module Generate.JavaScript.BuiltIn
2 ( character, string
3 , list, cons
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
26-- LITERALS
29character :: Char -> JS.Expression ()
30character char =
31 utils "chr" [ JS.StringLit () [char] ]
34string :: String -> JS.Expression ()
35string str =
36 JS.StringLit () str
40-- LISTS
43list :: [JS.Expression ()] -> JS.Expression ()
44list elements =
45 case elements of
46 [] ->
47 JS.ObjectLit () [ "ctor" ==> JS.StringLit () "[]" ]
49 front : back ->
50 cons front (list back)
53cons :: JS.Expression () -> JS.Expression () -> JS.Expression ()
54cons front back =
55 JS.ObjectLit ()
56 [ "ctor" ==> JS.StringLit () "::"
57 , "_0" ==> front
58 , "_1" ==> back
59 ]
63-- RECORDS
66recordUpdate :: JS.Expression () -> [(String, JS.Expression ())] -> JS.Expression ()
67recordUpdate record fields =
68 utils "update"
69 [ record
70 , JS.ObjectLit () (map (uncurry (==>)) fields)
71 ]
75-- COMPARISIONS
78eq :: JS.Expression () -> JS.Expression () -> JS.Expression ()
79eq left right =
80 utils "eq" [ left, right ]
83cmp :: JS.Expression () -> JS.Expression () -> JS.Expression ()
84cmp left right =
85 utils "cmp" [ left, right ]
89-- EFFECTS
92effect :: ModuleName.Canonical -> JS.Expression ()
93effect effectName =
94 Var.coreNative "Platform" "leaf" <|
95 JS.StringLit () (ModuleName.canonicalToString effectName)
98outgoingPort :: String -> JS.Expression () -> JS.Expression ()
99outgoingPort name converter =
100 Var.coreNative "Platform" "outgoingPort" `call` [ JS.StringLit () name, converter ]
103incomingPort :: String -> JS.Expression () -> JS.Expression ()
104incomingPort name converter =
105 Var.coreNative "Platform" "incomingPort" `call` [ JS.StringLit () name, converter ]
109-- CRASH
112crash :: ModuleName.Canonical -> R.Region -> Maybe (JS.Expression ()) -> JS.Expression ()
113crash home region maybeCaseCrashValue =
114 let
115 homeString =
116 JS.StringLit () (ModuleName.canonicalToString home)
117 in
118 case maybeCaseCrashValue of
119 Nothing ->
120 utils "crash" [ homeString, regionToJs region ]
122 Just crashValue ->
123 utils "crashCase" [ homeString, regionToJs region, crashValue ]
126regionToJs :: R.Region -> JS.Expression ()
127regionToJs (R.Region start end) =
128 JS.ObjectLit ()
129 [ "start" ==> positionToJs start
130 , "end" ==> positionToJs end
131 ]
134positionToJs :: R.Position -> JS.Expression ()
135positionToJs (R.Position line column) =
136 JS.ObjectLit ()
137 [ "line" ==> JS.IntLit () line
138 , "column" ==> JS.IntLit () column
139 ]