@@ -161,6 +161,11 @@ field name decoder =
161 to "field" <== [ Opt.Literal (Literal.Str name), decoder ]
161 to "field" <== [ Opt.Literal (Literal.Str name), decoder ]
164+index :: Int -> Opt.Expr -> Opt.Expr
165+index index decoder =
166+ to "index" <== [ Opt.Literal (Literal.IntNum index), decoder ]
164(<==) :: Opt.Expr -> [Opt.Expr] -> Opt.Expr
169(<==) :: Opt.Expr -> [Opt.Expr] -> Opt.Expr
165(<==) func args =
170(<==) func args =
166 Opt.Call func args
171 Opt.Call func args
@@ -195,13 +200,23 @@ toTuple types =
196 length types
201 length types
199− map (\n -> 'x' : show n) [ 1 .. size ]
204+ zipWith (,) [ 0 .. size - 1] types
201 makeTuple =
209 makeTuple =
202− Opt.Function args (Opt.Data ("_Tuple" ++ show size) (map (Opt.Var . Var.local) args))
210+ to "succeed" <==
212+ ("_Tuple" ++ show size)
213+ (map (Opt.Var . Var.local . toVar . fst) pairs)
216+ andThen (i, tipe) decoder =
217+ to "andThen" <== [ Opt.Function [toVar i] decoder, index i (decode tipe) ]
204− to ("tuple" ++ show size) <== (makeTuple : map decode types)
219+ List.foldr andThen makeTuple pairs
207toRecord :: [(String, T.Canonical)] -> Opt.Expr
222toRecord :: [(String, T.Canonical)] -> Opt.Expr