on master help sign in
Allow adding new effects in Eff programs
7f9fba5Edwin Brady
idris.cabal+4
@@ -373,6 +373,10 @@ Extra-source-files:
373 test/effects003/*.idr
373 test/effects003/*.idr
374 test/effects003/expected
374 test/effects003/expected
375 test/effects003/input
375 test/effects003/input
376+ test/effects004/run
377+ test/effects004/*.idr
378+ test/effects004/expected
379+ test/effects004/input
376
380
377 test/error001/run
381 test/error001/run
378 test/error001/*.idr
382 test/error001/*.idr
libs/effects/Effects.idr+7
@@ -168,6 +168,11 @@ data EffM : (m : Type -> Type) -> (x : Type)
168 liftP : (prf : SubList ys xs) ->
168 liftP : (prf : SubList ys xs) ->
169 EffM m t ys ys' -> EffM m t xs (\v => updateWith (ys' v) xs prf)
169 EffM m t ys ys' -> EffM m t xs (\v => updateWith (ys' v) xs prf)
170
170
171+ new : Handler e' m => (e : EFFECT) -> resTy ->
172+ {auto prf : e = MkEff resTy e'} ->
173+ EffM m t (e :: es) (\v => e :: es) ->
174+ EffM m t es (\v => es)
175+
171 (:-) : (l : ty) ->
176 (:-) : (l : ty) ->
172 EffM m t [x] xs' -> -- [x] (\v => xs) ->
177 EffM m t [x] xs' -> -- [x] (\v => xs) ->
173 EffM m t [l ::: x] (\v => map (l :::) (xs' v))
178 EffM m t [l ::: x] (\v => map (l :::) (xs' v))
@@ -263,6 +268,8 @@ eff env (callP prf effP) k = execEff env prf effP k
263eff env (liftP prf effP) k
268eff env (liftP prf effP) k
264 = let env' = dropEnv env prf in
269 = let env' = dropEnv env prf in
265 eff env' effP (\p', envk => k p' (rebuildEnv envk prf env))
270 eff env' effP (\p', envk => k p' (rebuildEnv envk prf env))
271+eff env (new (MkEff resTy newEff) res {prf=Refl} effP) k
272+ = eff (res :: env) effP (\p', (val :: envk) => k p' envk)
266-- FIXME:
273-- FIXME:
267-- xs is needed explicitly because otherwise the pattern binding for
274-- xs is needed explicitly because otherwise the pattern binding for
268-- 'l' appears too late. Solution seems to be to reorder patterns at the
275-- 'l' appears too late. Solution seems to be to reorder patterns at the