on 02a9c48 help sign in
144 lines 3.1 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
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 case elements of
51 [] ->
52 JS.ObjectLit () [ "ctor" ==> JS.StringLit () "[]" ]
54 front : back ->
55 cons front (list back)
58cons :: JS.Expression () -> JS.Expression () -> JS.Expression ()
59cons front back =
60 JS.ObjectLit ()
61 [ "ctor" ==> JS.StringLit () "::"
62 , "_0" ==> front
63 , "_1" ==> back
64 ]
68-- RECORDS
71recordUpdate :: JS.Expression () -> [(String, JS.Expression ())] -> JS.Expression ()
72recordUpdate record fields =
73 utils "update"
74 [ record
75 , JS.ObjectLit () (map (uncurry (==>)) fields)
76 ]
80-- COMPARISIONS
83eq :: JS.Expression () -> JS.Expression () -> JS.Expression ()
84eq left right =
85 utils "eq" [ left, right ]
88cmp :: JS.Expression () -> JS.Expression () -> JS.Expression ()
89cmp left right =
90 utils "cmp" [ left, right ]
94-- EFFECTS
97effect :: ModuleName.Canonical -> JS.Expression ()
98effect effectName =
99 Var.coreNative "Platform" "leaf" <|
100 JS.StringLit () (ModuleName.canonicalToString effectName)
103outgoingPort :: String -> JS.Expression () -> JS.Expression ()
104outgoingPort name converter =
105 Var.coreNative "Platform" "outgoingPort" `call` [ JS.StringLit () name, converter ]
108incomingPort :: String -> JS.Expression () -> JS.Expression ()
109incomingPort name converter =
110 Var.coreNative "Platform" "incomingPort" `call` [ JS.StringLit () name, converter ]
114-- CRASH
117crash :: ModuleName.Canonical -> R.Region -> Maybe (JS.Expression ()) -> JS.Expression ()
118crash home region maybeCaseCrashValue =
119 let
120 homeString =
121 JS.StringLit () (ModuleName.canonicalToString home)
122 in
123 case maybeCaseCrashValue of
124 Nothing ->
125 utils "crash" [ homeString, regionToJs region ]
127 Just crashValue ->
128 utils "crashCase" [ homeString, regionToJs region, crashValue ]
131regionToJs :: R.Region -> JS.Expression ()
132regionToJs (R.Region start end) =
133 JS.ObjectLit ()
134 [ "start" ==> positionToJs start
135 , "end" ==> positionToJs end
136 ]
139positionToJs :: R.Position -> JS.Expression ()
140positionToJs (R.Position line column) =
141 JS.ObjectLit ()
142 [ "line" ==> JS.IntLit () line
143 , "column" ==> JS.IntLit () column
144 ]