9 | data Handler : (fs : List (Type -> Type)) -> (m : Type -> Type) -> Type where
11 | (::) : (h : forall x . f x -> m x) -> Handler fs m -> Handler (f :: fs) m
16 | data Union : (fs : List (Type -> Type)) -> (t : Type) -> Type where
17 | U : (ix : Has f fs) -> (val : f t) -> Union fs t
20 | Uninhabited (Union [] t) where
21 | uninhabited (U ix v) = absurd ix
24 | public export %inline
25 | inj : (prf : Has f fs) => f t -> Union fs t
30 | prj : (prf : Has f fs) => Union fs t -> Maybe (f t)
31 | prj {prf = Z} (U Z v) = Just v
32 | prj {prf = S ix} (U (S x) v) = prj {prf = ix} (U x v)
37 | prj1 : Union [f] t -> f t
38 | prj1 (U Z val) = val
39 | prj1 (U (S x) val) impossible
44 | handleAll : Handler fs m -> Union fs t -> m t
45 | handleAll [] y = absurd y
46 | handleAll (h :: t) (U Z val) = h val
47 | handleAll (h :: t) (U (S y) val) = handleAll t (U y val)
51 | weaken1 : Union fs a -> Union (f :: fs) a
52 | weaken1 (U ix val) = U (S ix) val
55 | weaken : Subset fs fs' => Union fs a -> Union fs' a
56 | weaken @{subset} (U ix val) = U (lemma_subset subset ix) val
65 | {auto prf : Has f fs}
67 | -> Either (Union (fs - f) a) (f a)
68 | decomp {prf = Z} (U Z val) = Right $
val
69 | decomp {prf = Z} (U (S x) val) = Left $
U x val
70 | decomp {prf = S y} {fs = f :: h :: t} (U Z val) = Left $
U Z val
71 | decomp {prf = S y} {fs = f :: h :: t} (U (S x) val) =
72 | mapFst weaken1 $
decomp (U x val)
80 | {auto prf : Has f fs}
83 | -> Either (Union (fs - f) a) res
84 | handle g = map g . decomp