@@ -41,7 +41,7 @@ namespace Env
41 data Env : (m : Type -> Type) -> List EFFECT -> Type where
41 data Env : (m : Type -> Type) -> List EFFECT -> Type where
42 Nil : Env m Nil
42 Nil : Env m Nil
43 (::) : Handler eff m => a -> Env m xs -> Env m (MkEff a eff :: xs)
43 (::) : Handler eff m => a -> Env m xs -> Env m (MkEff a eff :: xs)
45data EffElem : Effect -> Type ->
45data EffElem : Effect -> Type ->
46 List EFFECT -> Type where
46 List EFFECT -> Type where
47 Here : EffElem x a (MkEff a x :: xs)
47 Here : EffElem x a (MkEff a x :: xs)
@@ -96,12 +96,28 @@ reflectSubList (x :: xs)
96reflectSubList (x ++ y) = Refine "subListId" `Seq` Solve
96reflectSubList (x ++ y) = Refine "subListId" `Seq` Solve
97reflectSubList _ = Refine "subListId" `Seq` Solve
97reflectSubList _ = Refine "subListId" `Seq` Solve
100+reflectDefaultList : List a -> Tactic
101+reflectDefaultList [] = Refine "enil" `Seq` Solve
102+reflectDefaultList (x :: xs)
103+ = Refine "econs" `Seq`
106+ (Refine "default" `Seq`
109+ (reflectDefaultList xs))))))
110+reflectDefaultList (x ++ y) = Refine "Nil" `Seq` Solve
111+reflectDefaultList _ = Refine "Nil" `Seq` Solve
99%reflection
113%reflection
100reflectEff : (P : Type) -> Tactic
114reflectEff : (P : Type) -> Tactic
101reflectEff (EffElem m a xs)
115reflectEff (EffElem m a xs)
102 = reflectListEffElem xs `Seq` Solve
116 = reflectListEffElem xs `Seq` Solve
103reflectEff (SubList xs ys)
117reflectEff (SubList xs ys)
104 = reflectSubList ys `Seq` Solve
118 = reflectSubList ys `Seq` Solve
119+reflectEff (Env m xs)
120+ = reflectDefaultList xs `Seq` Solve
106updateResTy : (val : t) ->
122updateResTy : (val : t) ->
107 (xs : List EFFECT) -> EffElem e a xs -> e t a b ->
123 (xs : List EFFECT) -> EffElem e a xs -> e t a b ->
@@ -232,10 +248,8 @@ eff {xs = [l ::: x]} env (l :- prog) k
232 = let env' = unlabel env in
248 = let env' = unlabel env in
233 eff env' prog (\p', envk => k p' (relabel l envk))
249 eff env' prog (\p', envk => k p' (relabel l envk))
235−run : Applicative m => Env m xs -> Eff m a xs xs' -> m a
251+-- yuck :) Haven't got type class instances working nicely in tactic
236−run env prog = eff env prog (\r, env => pure r)
252+-- proofs yet, so just brute force it.
239syntax MkDefaultEnv = (| [], [default], [default, default],
253syntax MkDefaultEnv = (| [], [default], [default, default],
240 [default, default, default],
254 [default, default, default],
241 [default, default, default, default],
255 [default, default, default, default],
@@ -244,19 +258,25 @@ syntax MkDefaultEnv = (| [], [default], [default, default],
244 [default, default, default, default, default, default, default],
258 [default, default, default, default, default, default, default],
245 [default, default, default, default, default, default, default, default] |)
259 [default, default, default, default, default, default, default, default] |)
247−run' : Applicative m => {default MkDefaultEnv env : Env m xs} -> Eff m a xs xs' -> m a
261+run : Applicative m => {default MkDefaultEnv env : Env m xs} -> Eff m a xs xs' -> m a
248−run' {env} prog = eff env prog (\r, env => pure r)
262+run {env} prog = eff env prog (\r, env => pure r)
264+runPure : {default MkDefaultEnv env : Env id xs} -> Eff id a xs xs' -> a
265+runPure {env} prog = eff env prog (\r, env => r)
250−runEnv : Applicative m => Env m xs -> Eff m a xs xs' ->
267+runInit : Applicative m => Env m xs -> Eff m a xs xs' -> m a
251− m (x : a ** Env m (xs' x))
252−runEnv env prog = eff env prog (\r, env => pure (r ** env))
268+runInit env prog = eff env prog (\r, env => pure r)
254−runPure : Env id xs -> Eff id a xs xs' -> a
270+runPureInit : Env id xs -> Eff id a xs xs' -> a
255−runPure env prog = eff env prog (\r, env => r)
271+runPureInit env prog = eff env prog (\r, env => r)
257runWith : (a -> m a) -> Env m xs -> Eff m a xs xs' -> m a
273runWith : (a -> m a) -> Env m xs -> Eff m a xs xs' -> m a
258runWith inj env prog = eff env prog (\r, env => inj r)
274runWith inj env prog = eff env prog (\r, env => inj r)
276+runEnv : Applicative m => Env m xs -> Eff m a xs xs' ->
277+ m (x : a ** Env m (xs' x))
278+runEnv env prog = eff env prog (\r, env => pure (r ** env))
260-- some higher order things
280-- some higher order things
262mapE : Applicative m => (a -> {xs} Eff m b) -> List a -> {xs} Eff m (List b)
282mapE : Applicative m => (a -> {xs} Eff m b) -> List a -> {xs} Eff m (List b)