0 | module Web.MVC.Controller.Form
2 | import Data.List.Quantifiers.Extra
4 | import Web.MVC.Controller
11 | data Editors : (i : Type) -> (sts,evs,news : List Type) -> Type where
12 | Nil : Editors i [] [] []
15 | -> Editors i ss es ns
16 | -> Editors i (s::ss) (e::es) (n::ns)
20 | toProgs : Editors i ss es ns -> i -> Progs es ss
22 | toProgs (x::xs) vi = x.ctrl vi :: toProgs xs vi
27 | toInit : Editors i ss es ns -> i -> HList ss -> Cmd (HSum es)
28 | toInit [] vi [] = neutral
29 | toInit (x::xs) vi (y::ys) =
30 | map Here (x.init vi y) <+> map There (toInit xs vi ys)
32 | toNew : Editors i ss es ns -> HList ss -> Either String (HList ns)
33 | toNew [] [] = Right []
34 | toNew (x::xs) (y::ys) = [| stToNew x y :: toNew xs ys |]
36 | toStNothing : Editors i ss es ns -> HList ss
38 | toStNothing (x::xs) = x.toState Nothing :: toStNothing xs
40 | toSt : Editors i ss es ns -> HList ns -> HList ss
42 | toSt (x::xs) (y::ys) = x.toState (Just y) :: toSt xs ys
44 | views : Editors i ss es ns -> i -> HList ss -> List (Node $
HSum es)
46 | views (x::xs) vi (y::ys) =
47 | Prelude.map Here (view x vi y) :: map (Prelude.map There) (views xs vi ys)
53 | (List (Node $
HSum es) -> Node (HSum es))
54 | -> Editors i ss es ns
55 | -> Editor i (HList ss) (HSum es) (HList ns)
56 | form wrapNodes eds =
57 | E { ctrl = progs . toProgs eds
58 | , view = \vi => wrapNodes . views eds vi
60 | , stToNew = toNew eds
61 | , toState = maybe (toStNothing eds) (toSt eds)