@@ -41,7 +41,7 @@ namespace Env
4141 data Env : (m : Type -> Type) -> List EFFECT -> Type where
4242 Nil : Env m Nil
4343 (::) : Handler eff m => a -> Env m xs -> Env m (MkEff a eff :: xs)
44−
44+
4545data EffElem : Effect -> Type ->
4646 List EFFECT -> Type where
4747 Here : EffElem x a (MkEff a x :: xs)
@@ -96,12 +96,28 @@ reflectSubList (x :: xs)
9696reflectSubList (x ++ y) = Refine "subListId" `Seq` Solve
9797reflectSubList _ = Refine "subListId" `Seq` Solve
9898
99+%reflection
100+reflectDefaultList : List a -> Tactic
101+reflectDefaultList [] = Refine "enil" `Seq` Solve
102+reflectDefaultList (x :: xs)
103+ = Refine "econs" `Seq`
104+ (Solve `Seq`
105+ (Instance `Seq`
106+ (Refine "default" `Seq`
107+ (Solve `Seq`
108+ (Instance `Seq`
109+ (reflectDefaultList xs))))))
110+reflectDefaultList (x ++ y) = Refine "Nil" `Seq` Solve
111+reflectDefaultList _ = Refine "Nil" `Seq` Solve
112+
99113%reflection
100114reflectEff : (P : Type) -> Tactic
101115reflectEff (EffElem m a xs)
102116 = reflectListEffElem xs `Seq` Solve
103117reflectEff (SubList xs ys)
104118 = reflectSubList ys `Seq` Solve
119+reflectEff (Env m xs)
120+ = reflectDefaultList xs `Seq` Solve
105121
106122updateResTy : (val : t) ->
107123 (xs : List EFFECT) -> EffElem e a xs -> e t a b ->
@@ -232,10 +248,8 @@ eff {xs = [l ::: x]} env (l :- prog) k
232248 = let env' = unlabel env in
233249 eff env' prog (\p', envk => k p' (relabel l envk))
234250
235−run : Applicative m => Env m xs -> Eff m a xs xs' -> m a
236−run env prog = eff env prog (\r, env => pure r)
237−
238−-- yuck :)
251+-- yuck :) Haven't got type class instances working nicely in tactic
252+-- proofs yet, so just brute force it.
239253syntax MkDefaultEnv = (| [], [default], [default, default],
240254 [default, default, default],
241255 [default, default, default, default],
@@ -244,19 +258,25 @@ syntax MkDefaultEnv = (| [], [default], [default, default],
244258 [default, default, default, default, default, default, default],
245259 [default, default, default, default, default, default, default, default] |)
246260
247−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)
261+run : Applicative m => {default MkDefaultEnv env : Env m xs} -> Eff m a xs xs' -> m a
262+run {env} prog = eff env prog (\r, env => pure r)
249263
250−runEnv : Applicative m => Env m xs -> Eff m a xs xs' ->
251− m (x : a ** Env m (xs' x))
252−runEnv env prog = eff env prog (\r, env => pure (r ** env))
264+runPure : {default MkDefaultEnv env : Env id xs} -> Eff id a xs xs' -> a
265+runPure {env} prog = eff env prog (\r, env => r)
266+
267+runInit : Applicative m => Env m xs -> Eff m a xs xs' -> m a
268+runInit env prog = eff env prog (\r, env => pure r)
253269
254−runPure : Env id xs -> Eff id a xs xs' -> a
255−runPure env prog = eff env prog (\r, env => r)
270+runPureInit : Env id xs -> Eff id a xs xs' -> a
271+runPureInit env prog = eff env prog (\r, env => r)
256272
257273runWith : (a -> m a) -> Env m xs -> Eff m a xs xs' -> m a
258274runWith inj env prog = eff env prog (\r, env => inj r)
259275
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))
279+
260280-- some higher order things
261281
262282mapE : Applicative m => (a -> {xs} Eff m b) -> List a -> {xs} Eff m (List b)