@@ -2,7 +2,6 @@
2module Generate.JavaScript.Ports (incoming, outgoing) where
2module Generate.JavaScript.Ports (incoming, outgoing) where
4import Generate.JavaScript.Helpers
4import Generate.JavaScript.Helpers
5−import qualified AST.Helpers as Help
6import AST.Type as T
5import AST.Type as T
7import qualified AST.Variable as Var
6import qualified AST.Variable as Var
8import Language.ECMAScript3.Syntax
7import Language.ECMAScript3.Syntax
@@ -29,8 +28,8 @@ incoming tipe =
29 case tipe of
28 case tipe of
30 Aliased _ t -> incoming t
29 Aliased _ t -> incoming t
32− Data (Var.Canonical (Var.Module "Signal") "Signal") [t] ->
31+ App (Type v) [t]
33− obj "Native.Ports.incomingSignal" <| incoming t
32+ | Var.isSignal v -> obj "Native.Ports.incomingSignal" <| incoming t
35 _ -> ["v"] ==> inc tipe (ref "v")
34 _ -> ["v"] ==> inc tipe (ref "v")
@@ -42,42 +41,44 @@ inc tipe x =
42 Aliased _ t ->
41 Aliased _ t ->
45− Data (Var.Canonical (Var.Module "Json") "Value") [] ->
46− obj "Native.Json.fromJS" <| x
48− Data (Var.Canonical Var.BuiltIn ctor) []
44+ Type (Var.Canonical Var.BuiltIn name)
49− | ctor == "Int" -> from JSNumber
45+ | name == "Int" -> from JSNumber
50− | ctor == "Float" -> from JSNumber
46+ | name == "Float" -> from JSNumber
51− | ctor == "Bool" -> from JSBoolean
47+ | name == "Bool" -> from JSBoolean
52− | ctor == "String" -> from JSString
48+ | name == "String" -> from JSString
54 from checks = check x checks x
50 from checks = check x checks x
56− Data (Var.Canonical (Var.Module "Maybe") "Maybe") [t] ->
52+ Type name
57− CondExpr () (equal x (NullLit ()))
53+ | Var.isJson name -> obj "Native.Json.fromJS" <| x
58− (obj "Maybe.Nothing")
54+ | otherwise -> error "bad type got to incoming port generation code"
59− (obj "Maybe.Just" <| inc t x)
61− Data (Var.Canonical Var.BuiltIn ctor) [t]
56+ App f args ->
62− | ctor == "_List" ->
57+ case f : args of
63− check x JSArray (obj "_L.fromArray" <| array)
58+ Type name : [t]
59+ | Var.isMaybe name -> CondExpr () (equal x (NullLit ()))
60+ (obj "Maybe.Nothing")
61+ (obj "Maybe.Just" <| inc t x)
65− | ctor == "Array.Array" ->
66− check x JSArray (obj "_A.fromJSArray" <| array)
63+ | Var.isList name -> check x JSArray (obj "_L.fromArray" <| array)
65+ | Var.isArray name -> check x JSArray (obj "_A.fromJSArray" <| array)
69− array = DotRef () x (var "map") <| incoming t
67+ array = DotRef () x (var "map") <| incoming t
71− Data (Var.Canonical Var.BuiltIn ctor) ts
69+ Type name : ts
72− | Help.isTuple ctor -> check x JSArray tuple
70+ | Var.isTuple name -> check x JSArray tuple
74− tuple = ObjectLit () $ (prop "ctor", string ctor) : values
72+ tuple = ObjectLit () $ (prop "ctor", ctor) : values
74+ ctor = string ("_Tuple" ++ show (length ts))
75− values = zipWith convert [0..] ts
75+ values = zipWith convert [0..] ts
76− convert n t = ( prop ('_':show n)
77+ convert n t = ( prop ('_':show n)
77− , inc t (BracketRef () x (IntLit () n)))
78+ , inc t (BracketRef () x (IntLit () n))
80− error "bad ADT got to incoming port generation code"
81+ _ -> error "bad ADT got to incoming port generation code"
82 Record _ (Just _) ->
83 Record _ (Just _) ->
83 error "bad record got to incoming port generation code"
84 error "bad record got to incoming port generation code"
@@ -94,8 +95,8 @@ outgoing tipe =
94 case tipe of
95 case tipe of
95 Aliased _ t -> outgoing t
96 Aliased _ t -> outgoing t
97− Data (Var.Canonical (Var.Module "Signal") "Signal") [t] ->
98+ App (Type v) [t]
98− obj "Native.Ports.outgoingSignal" <| outgoing t
99+ | Var.isSignal v -> obj "Native.Ports.outgoingSignal" <| outgoing t
100 _ -> ["v"] ==> out tipe (ref "v")
101 _ -> ["v"] ==> out tipe (ref "v")
@@ -120,30 +121,33 @@ out tipe x =
121 Var _ -> error "type variables should not be allowed through input ports"
122 Var _ -> error "type variables should not be allowed through input ports"
123− Data (Var.Canonical Var.BuiltIn ctor) []
124+ Type (Var.Canonical Var.BuiltIn name)
124− | ctor `elem` ["Int","Float","Bool","String"] -> x
125+ | name `elem` ["Int","Float","Bool","String"] -> x
126− Data (Var.Canonical (Var.Module "Json") "Value") [] ->
127+ Type name
127− obj "Native.Json.toJS" <| x
128+ | Var.isJson name -> obj "Native.Json.toJS" <| x
129+ | otherwise -> error "bad type got to outgoing port generation code"
129− Data (Var.Canonical (Var.Module "Maybe") "Maybe") [t] ->
131+ App f args ->
134+ | Var.isMaybe name ->
130− CondExpr () (equal (DotRef () x (var "ctor")) (string "Nothing"))
135+ CondExpr () (equal (DotRef () x (var "ctor")) (string "Nothing"))
131− (NullLit ())
136+ (NullLit ())
132− (out t (DotRef () x (var "_0")))
137+ (out t (DotRef () x (var "_0")))
134− Data (Var.Canonical (Var.Module "Array") "Array") [t] ->
139+ | Var.isArray name ->
135− DotRef () (obj "_A.toJSArray" <| x) (var "map") <| outgoing t
140+ DotRef () (obj "_A.toJSArray" <| x) (var "map") <| outgoing t
137− Data (Var.Canonical Var.BuiltIn "_List") [t] ->
142+ | Var.isList name ->
138− DotRef () (obj "_L.toArray" <| x) (var "map") <| outgoing t
143+ DotRef () (obj "_L.toArray" <| x) (var "map") <| outgoing t
140− Data (Var.Canonical Var.BuiltIn ctor) ts
145+ Type name : ts
141− | Help.isTuple ctor ->
146+ | Var.isTuple name ->
142− let convert n t = out t $ DotRef () x $ var ('_':show n)
147+ let convert n t = out t $ DotRef () x $ var ('_':show n)
143− in ArrayLit () $ zipWith convert [0..] ts
148+ in ArrayLit () $ zipWith convert [0..] ts
146− error "bad ADT got to outgoing port generation code"
150+ _ -> error "bad ADT got to outgoing port generation code"
148 Record _ (Just _) ->
152 Record _ (Just _) ->
149 error "bad record got to outgoing port generation code"
153 error "bad record got to outgoing port generation code"