@@ -17,12 +17,13 @@ check x jsType continue =
17 jsFold op checks value = foldl1 (InfixExpr () op) (map ($value) checks)
17 jsFold op checks value = foldl1 (InfixExpr () op) (map ($value) checks)
18 throw = obj ["_E","raise"] <| InfixExpr () OpAdd msg x
18 throw = obj ["_E","raise"] <| InfixExpr () OpAdd msg x
19 msg = string ("invalid input, expecting " ++ show jsType ++ " but got ")
19 msg = string ("invalid input, expecting " ++ show jsType ++ " but got ")
20− checks = case jsType of
21+ case jsType of
21− JSNumber -> [typeof "number"]
22+ JSNumber -> [typeof "number"]
22− JSBoolean -> [typeof "boolean"]
23+ JSBoolean -> [typeof "boolean"]
23− JSString -> [typeof "string", instanceof "String"]
24+ JSString -> [typeof "string", instanceof "String"]
24− JSArray -> [(obj ["_U","isJSArray"] <|)]
25+ JSArray -> [(obj ["_U","isJSArray"] <|)]
25− JSObject fields -> [jsFold OpLAnd (typeof "object" : map member fields)]
26+ JSObject fields -> [jsFold OpLAnd (typeof "object" : map member fields)]
27incoming :: CanonicalType -> Expression ()
28incoming :: CanonicalType -> Expression ()
28incoming tipe =
29incoming tipe =
@@ -58,13 +59,17 @@ inc tipe x =
58 App f args ->
59 App f args ->
59 case f : args of
60 case f : args of
60 Type name : [t]
61 Type name : [t]
61− | Var.isMaybe name -> CondExpr () (equal x (NullLit ()))
62+ | Var.isMaybe name ->
64+ (equal x (NullLit ()))
62− (V.value "Maybe" "Nothing")
65+ (V.value "Maybe" "Nothing")
63− (V.value "Maybe" "Just" <| inc t x)
66+ (V.value "Maybe" "Just" <| inc t x)
65− | Var.isList name -> check x JSArray (obj ["_L","fromArray"] <| array)
69+ check x JSArray (obj ["_L","fromArray"] <| array)
71+ | Var.isArray name ->
67− | Var.isArray name -> check x JSArray (obj ["_A","fromJSArray"] <| array)
72+ check x JSArray (obj ["_A","fromJSArray"] <| array)
69 array = DotRef () x (var "map") <| incoming t
74 array = DotRef () x (var "map") <| incoming t
@@ -120,10 +125,11 @@ out tipe x =
120 numArgs = length ts - 1
125 numArgs = length ts - 1
121 args = map (\n -> '_' : show n) [0..]
126 args = map (\n -> '_' : show n) [0..]
122 values = zipWith inc (init ts) (map ref args)
127 values = zipWith inc (init ts) (map ref args)
123− func body = function (take numArgs args)
129+ function (take numArgs args)
124− [ VarDeclStmt () [VarDecl () (var "_r") (Just body)]
130+ [ VarDeclStmt () [VarDecl () (var "_r") (Just body)]
125− , ret (out (last ts) (ref "_r"))
131+ , ret (out (last ts) (ref "_r"))
128 Var _ -> error "type variables should not be allowed through input ports"
134 Var _ -> error "type variables should not be allowed through input ports"
@@ -139,9 +145,10 @@ out tipe x =
139 case f : args of
145 case f : args of
140 Type name : [t]
146 Type name : [t]
141 | Var.isMaybe name ->
147 | Var.isMaybe name ->
142− CondExpr () (equal (DotRef () x (var "ctor")) (string "Nothing"))
149+ (equal (DotRef () x (var "ctor")) (string "Nothing"))
143− (NullLit ())
150+ (NullLit ())
144− (out t (DotRef () x (var "_0")))
151+ (out t (DotRef () x (var "_0")))
146 | Var.isArray name ->
153 | Var.isArray name ->
147 DotRef () (obj ["_A","toJSArray"] <| x) (var "map") <| outgoing t
154 DotRef () (obj ["_A","toJSArray"] <| x) (var "map") <| outgoing t