on cd62e81 help sign in
86 lines 1.9 kB history raw
1module Generate.JavaScript.BuiltIn where
3import Control.Arrow (first)
4import qualified Language.ECMAScript3.Syntax as JS
6import Generate.JavaScript.Helpers
7import qualified Reporting.Region as R
10utils :: String -> [JS.Expression ()] -> JS.Expression ()
11utils func args =
12 obj ["_U", func] `call` args
15-- LITERALS
17character :: Char -> JS.Expression ()
18character char =
19 utils "chr" [ JS.StringLit () [char] ]
22string :: String -> JS.Expression ()
23string str =
24 JS.StringLit () str
27-- LISTS
29list :: [JS.Expression ()] -> JS.Expression ()
30list elements =
31 utils "list" [ JS.ArrayLit () elements ]
34range :: JS.Expression () -> JS.Expression () -> JS.Expression ()
35range low high =
36 utils "range" [ low, high ]
39-- RECORDS
41recordUpdate :: JS.Expression () -> [(String, JS.Expression ())] -> JS.Expression ()
42recordUpdate record fields =
43 utils "update"
44 [ record
45 , JS.ObjectLit () (map (first prop) fields)
46 ]
49-- COMPARISIONS
51eq :: JS.Expression () -> JS.Expression () -> JS.Expression ()
52eq left right =
53 utils "eq" [ left, right ]
56cmp :: JS.Expression () -> JS.Expression () -> JS.Expression ()
57cmp left right =
58 utils "cmp" [ left, right ]
61-- CRASH
63crash :: R.Region -> Maybe String -> JS.Expression ()
64crash region maybeCaseCrashValue =
65 case maybeCaseCrashValue of
66 Nothing ->
67 utils "crash" [ regionToJs region ]
69 Just crashValue ->
70 utils "caseCrash" [ regionToJs region, ref crashValue ]
73regionToJs :: R.Region -> JS.Expression ()
74regionToJs (R.Region start end) =
75 JS.ObjectLit ()
76 [ ( prop "start", positionToJs start )
77 , ( prop "end", positionToJs end )
78 ]
81positionToJs :: R.Position -> JS.Expression ()
82positionToJs (R.Position line column) =
83 JS.ObjectLit ()
84 [ ( prop "line", JS.IntLit () line )
85 , ( prop "column", JS.IntLit () column )
86 ]