on master help sign in
Fix decoders for bringing tuples through ports
commit215251f61aa6d8849f5424fdb948f81779a04d91 authorEvan Czaplicki <evancz@users.noreply.github.com> dateMon 10 Oct 2016, 17:30 (10 years ago) parente9cfb68
1 file changed+19−4
src/Generate/JavaScript/Foreign.hs+19−4
src/Generate/JavaScript/Foreign.hs+19−4
@@ -161,6 +161,11 @@ field name decoder =
161161 to "field" <== [ Opt.Literal (Literal.Str name), decoder ]
162162
163163
164+index :: Int -> Opt.Expr -> Opt.Expr
165+index index decoder =
166+ to "index" <== [ Opt.Literal (Literal.IntNum index), decoder ]
167+
168+
164169(<==) :: Opt.Expr -> [Opt.Expr] -> Opt.Expr
165170(<==) func args =
166171 Opt.Call func args
@@ -195,13 +200,23 @@ toTuple types =
195200 size =
196201 length types
197202
198− args =
199− map (\n -> 'x' : show n) [ 1 .. size ]
203+ pairs =
204+ zipWith (,) [ 0 .. size - 1] types
205+
206+ toVar i =
207+ 'x' : show i
200208
201209 makeTuple =
202− Opt.Function args (Opt.Data ("_Tuple" ++ show size) (map (Opt.Var . Var.local) args))
210+ to "succeed" <==
211+ [ Opt.Data
212+ ("_Tuple" ++ show size)
213+ (map (Opt.Var . Var.local . toVar . fst) pairs)
214+ ]
215+
216+ andThen (i, tipe) decoder =
217+ to "andThen" <== [ Opt.Function [toVar i] decoder, index i (decode tipe) ]
203218 in
204− to ("tuple" ++ show size) <== (makeTuple : map decode types)
219+ List.foldr andThen makeTuple pairs
205220
206221
207222toRecord :: [(String, T.Canonical)] -> Opt.Expr