0 | module Web.Async.Widget.Types
2 | import Derive.Prelude
5 | import Web.Async.Util
6 | import Web.Internal.Types
9 | %language ElabReflection
10 | %hide Data.Linear.(.)
11 | %hide Text.HTML.Node.a
21 | data EditRes : Type -> Type where
23 | Invalid : (err : String) -> EditRes t
24 | Valid : (val : t) -> EditRes t
26 | %runElab derive "EditRes" [Show,Eq]
29 | toEither : EditRes t -> Either String ()
30 | toEither (Invalid s) = Left s
31 | toEither _ = Right ()
34 | toMaybe : EditRes t -> Maybe t
35 | toMaybe (Valid v) = Just v
39 | isValid : EditRes t -> Bool
40 | isValid (Valid _) = True
44 | Functor EditRes where
45 | map f Missing = Missing
46 | map f (Invalid v) = Invalid v
47 | map f (Valid v) = Valid $
f v
50 | Applicative EditRes where
52 | Valid f <*> v = map f v
53 | Invalid x <*> _ = Invalid x
54 | Missing <*> _ = Missing
58 | Missing >>= _ = Missing
59 | Invalid x >>= _ = Invalid x
62 | validityTag : EditRes s -> String
63 | validityTag Missing = "missing"
64 | validityTag (Invalid _) = "invalid"
65 | validityTag (Valid _) = "valid"
68 | validity : EditRes s -> Attribute t
69 | validity = Str "data-validity" . validityTag
78 | record Widget e where
84 | adjNodes : (HTMLNodes -> HTMLNodes) -> Widget e -> Widget e
85 | adjNodes f = {nodes $= f}
90 | constant : t -> Widget t
91 | constant = W [] . fill
97 | empty = W [] (pure ())
102 | once : t -> Widget t
106 | Functor Widget where
107 | map f (W ns p) = W ns $
mapOutput f p
114 | record FileEv where
123 | parameters {auto ff : Functor f}
124 | {auto fg : Functor g}
127 | map2 : (x -> y) -> f (g x) -> f (g y)
131 | map3 : Functor h => (x -> y) -> f (g (h x)) -> f (g (h y))
132 | map3 = map . map . map
156 | record Editor (t : Type) where
159 | widget : Maybe t -> Act (Widget $
EditRes t)
163 | (Maybe a -> Maybe b)
164 | -> (Widget (EditRes b) -> Widget (EditRes a))
167 | adjWidget adjm adjw ed = E $
map adjw . ed.widget . adjm
170 | edNodes : (HTMLNodes -> HTMLNodes) -> Editor t -> Editor t
171 | edNodes = adjWidget id . adjNodes
175 | (Maybe a -> Maybe b)
176 | -> (EditRes b -> EditRes a)
179 | adjEditor adjm adjres =
180 | adjWidget adjm $
{events $= P.mapOutput adjres}
184 | editI : Iso' t1 t2 -> Editor t1 -> Editor t2
185 | editI i (E f) = E $
map3 i.get_ . f . map i.reverseGet
189 | editP : Prism' t2 t1 -> Editor t1 -> Editor t2
190 | editP p (E f) = E $
map3 p.reverseGet . f . (>>= first p)
196 | -> (refine : t1 -> EditRes t2)
199 | refineEdit ini f (E w) = E $
\m => map (>>= f) <$> w (m >>= ini)
202 | mapEvents : (JSStream (EditRes t) -> JSStream (EditRes t)) -> Editor t -> Editor t
203 | mapEvents f (E w) = E $
map {events $= f} . w
209 | dummy : t -> Editor t
210 | dummy v = E $
\_ => pure (once (Valid v))