on bbb6583 help sign in
128 lines 2.6 kB history raw
1module Generate.JavaScript.BuiltIn
2 ( character, string
3 , list, range
4 , recordUpdate
5 , eq, cmp
6 , cmd, sub
7 , crash
8 )
9 where
11import Control.Arrow (first)
12import qualified Language.ECMAScript3.Syntax as JS
14import qualified AST.Module.Name as ModuleName
15import Generate.JavaScript.Helpers
16import qualified Reporting.Region as R
20utils :: String -> [JS.Expression ()] -> JS.Expression ()
21utils func args =
22 obj ["_elm_lang$core$Native_Utils", func] `call` args
25nativeList :: String -> [JS.Expression ()] -> JS.Expression ()
26nativeList func args =
27 obj ["_elm_lang$core$Native_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 (first prop) 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
88cmd :: ModuleName.Canonical -> JS.Expression ()
89cmd effectName =
90 utils "cmd" [ JS.StringLit () (ModuleName.canonicalToString effectName) ]
93sub :: ModuleName.Canonical -> JS.Expression ()
94sub effectName =
95 utils "sub" [ JS.StringLit () (ModuleName.canonicalToString effectName) ]
98-- CRASH
101crash :: ModuleName.Canonical -> R.Region -> Maybe (JS.Expression ()) -> JS.Expression ()
102crash home region maybeCaseCrashValue =
103 let
104 homeString =
105 JS.StringLit () (ModuleName.canonicalToString home)
106 in
107 case maybeCaseCrashValue of
108 Nothing ->
109 utils "crash" [ homeString, regionToJs region ]
111 Just crashValue ->
112 utils "crashCase" [ homeString, regionToJs region, crashValue ]
115regionToJs :: R.Region -> JS.Expression ()
116regionToJs (R.Region start end) =
117 JS.ObjectLit ()
118 [ ( prop "start", positionToJs start )
119 , ( prop "end", positionToJs end )
120 ]
123positionToJs :: R.Position -> JS.Expression ()
124positionToJs (R.Position line column) =
125 JS.ObjectLit ()
126 [ ( prop "line", JS.IntLit () line )
127 , ( prop "column", JS.IntLit () column )
128 ]