@@ -2,7 +2,6 @@
22module Generate.JavaScript.Ports (incoming, outgoing) where
33
44import Generate.JavaScript.Helpers
5−import qualified AST.Helpers as Help
65import AST.Type as T
76import qualified AST.Variable as Var
87import Language.ECMAScript3.Syntax
@@ -29,8 +28,8 @@ incoming tipe =
2928 case tipe of
3029 Aliased _ t -> incoming t
3130
32− Data (Var.Canonical (Var.Module "Signal") "Signal") [t] ->
33− obj "Native.Ports.incomingSignal" <| incoming t
31+ App (Type v) [t]
32+ | Var.isSignal v -> obj "Native.Ports.incomingSignal" <| incoming t
3433
3534 _ -> ["v"] ==> inc tipe (ref "v")
3635
@@ -42,42 +41,44 @@ inc tipe x =
4241 Aliased _ t ->
4342 inc t x
4443
45− Data (Var.Canonical (Var.Module "Json") "Value") [] ->
46− obj "Native.Json.fromJS" <| x
47−
48− Data (Var.Canonical Var.BuiltIn ctor) []
49− | ctor == "Int" -> from JSNumber
50− | ctor == "Float" -> from JSNumber
51− | ctor == "Bool" -> from JSBoolean
52− | ctor == "String" -> from JSString
44+ Type (Var.Canonical Var.BuiltIn name)
45+ | name == "Int" -> from JSNumber
46+ | name == "Float" -> from JSNumber
47+ | name == "Bool" -> from JSBoolean
48+ | name == "String" -> from JSString
5349 where
5450 from checks = check x checks x
5551
56− Data (Var.Canonical (Var.Module "Maybe") "Maybe") [t] ->
57− CondExpr () (equal x (NullLit ()))
58− (obj "Maybe.Nothing")
59− (obj "Maybe.Just" <| inc t x)
52+ Type name
53+ | Var.isJson name -> obj "Native.Json.fromJS" <| x
54+ | otherwise -> error "bad type got to incoming port generation code"
6055
61− Data (Var.Canonical Var.BuiltIn ctor) [t]
62− | ctor == "_List" ->
63− check x JSArray (obj "_L.fromArray" <| array)
56+ App f args ->
57+ case f : args of
58+ Type name : [t]
59+ | Var.isMaybe name -> CondExpr () (equal x (NullLit ()))
60+ (obj "Maybe.Nothing")
61+ (obj "Maybe.Just" <| inc t x)
6462
65− | ctor == "Array.Array" ->
66− check x JSArray (obj "_A.fromJSArray" <| array)
63+ | Var.isList name -> check x JSArray (obj "_L.fromArray" <| array)
6764
68− where
69− array = DotRef () x (var "map") <| incoming t
65+ | Var.isArray name -> check x JSArray (obj "_A.fromJSArray" <| array)
66+ where
67+ array = DotRef () x (var "map") <| incoming t
7068
71− Data (Var.Canonical Var.BuiltIn ctor) ts
72− | Help.isTuple ctor -> check x JSArray tuple
73− where
74− tuple = ObjectLit () $ (prop "ctor", string ctor) : values
75− values = zipWith convert [0..] ts
76− convert n t = ( prop ('_':show n)
77− , inc t (BracketRef () x (IntLit () n)))
69+ Type name : ts
70+ | Var.isTuple name -> check x JSArray tuple
71+ where
72+ tuple = ObjectLit () $ (prop "ctor", ctor) : values
73+
74+ ctor = string ("_Tuple" ++ show (length ts))
75+ values = zipWith convert [0..] ts
76+
77+ convert n t = ( prop ('_':show n)
78+ , inc t (BracketRef () x (IntLit () n))
79+ )
7880
79− Data _ _ ->
80− error "bad ADT got to incoming port generation code"
81+ _ -> error "bad ADT got to incoming port generation code"
8182
8283 Record _ (Just _) ->
8384 error "bad record got to incoming port generation code"
@@ -94,8 +95,8 @@ outgoing tipe =
9495 case tipe of
9596 Aliased _ t -> outgoing t
9697
97− Data (Var.Canonical (Var.Module "Signal") "Signal") [t] ->
98− obj "Native.Ports.outgoingSignal" <| outgoing t
98+ App (Type v) [t]
99+ | Var.isSignal v -> obj "Native.Ports.outgoingSignal" <| outgoing t
99100
100101 _ -> ["v"] ==> out tipe (ref "v")
101102
@@ -120,30 +121,33 @@ out tipe x =
120121
121122 Var _ -> error "type variables should not be allowed through input ports"
122123
123− Data (Var.Canonical Var.BuiltIn ctor) []
124− | ctor `elem` ["Int","Float","Bool","String"] -> x
124+ Type (Var.Canonical Var.BuiltIn name)
125+ | name `elem` ["Int","Float","Bool","String"] -> x
125126
126− Data (Var.Canonical (Var.Module "Json") "Value") [] ->
127− obj "Native.Json.toJS" <| x
127+ Type name
128+ | Var.isJson name -> obj "Native.Json.toJS" <| x
129+ | otherwise -> error "bad type got to outgoing port generation code"
128130
129− Data (Var.Canonical (Var.Module "Maybe") "Maybe") [t] ->
130− CondExpr () (equal (DotRef () x (var "ctor")) (string "Nothing"))
131− (NullLit ())
132− (out t (DotRef () x (var "_0")))
131+ App f args ->
132+ case f : args of
133+ Type name : [t]
134+ | Var.isMaybe name ->
135+ CondExpr () (equal (DotRef () x (var "ctor")) (string "Nothing"))
136+ (NullLit ())
137+ (out t (DotRef () x (var "_0")))
133138
134− Data (Var.Canonical (Var.Module "Array") "Array") [t] ->
135− DotRef () (obj "_A.toJSArray" <| x) (var "map") <| outgoing t
139+ | Var.isArray name ->
140+ DotRef () (obj "_A.toJSArray" <| x) (var "map") <| outgoing t
136141
137− Data (Var.Canonical Var.BuiltIn "_List") [t] ->
138− DotRef () (obj "_L.toArray" <| x) (var "map") <| outgoing t
142+ | Var.isList name ->
143+ DotRef () (obj "_L.toArray" <| x) (var "map") <| outgoing t
139144
140− Data (Var.Canonical Var.BuiltIn ctor) ts
141− | Help.isTuple ctor ->
142− let convert n t = out t $ DotRef () x $ var ('_':show n)
143− in ArrayLit () $ zipWith convert [0..] ts
145+ Type name : ts
146+ | Var.isTuple name ->
147+ let convert n t = out t $ DotRef () x $ var ('_':show n)
148+ in ArrayLit () $ zipWith convert [0..] ts
144149
145− Data _ _ ->
146− error "bad ADT got to outgoing port generation code"
150+ _ -> error "bad ADT got to outgoing port generation code"
147151
148152 Record _ (Just _) ->
149153 error "bad record got to outgoing port generation code"