Skip to content
This repository was archived by the owner on Apr 1, 2025. It is now read-only.

Commit 7221e71

Browse files
author
Patrick Thomson
committed
Fix Interpose
1 parent 3438e47 commit 7221e71

File tree

1 file changed

+10
-12
lines changed

1 file changed

+10
-12
lines changed

src/Control/Effect/Interpose.hs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,15 @@ newtype InterposeC (eff :: (* -> *) -> * -> *) m a = InterposeC
4242

4343
newtype Listener (eff :: (* -> *) -> * -> *) m = Listener (forall n x . eff n x -> m x)
4444

45-
-- -- TODO: Document the implementation of this, as it is extremely subtle.
46-
47-
-- runListener :: Listener eff (InterposeC eff m) -> eff (InterposeC eff m) (InterposeC eff m a) -> InterposeC eff m a
48-
-- runListener (Listener listen) = listen
45+
-- Normally we can't just extract the existentials out of the Listener type. In this case,
46+
-- we can constrain the foralled 'n' variable to be 'Interpose', which lets it by the typechecker.
47+
runListener :: Listener eff (InterposeC eff m) -> eff (InterposeC eff m) a -> InterposeC eff m a
48+
runListener (Listener listen) = listen
4949

5050
instance (Carrier sig m, Member eff sig) => Carrier (Interpose eff :+: sig) (InterposeC eff m) where
51-
eff = undefined
52-
-- eff (L (Interpose m h k)) =
53-
-- InterposeC (local (const (Just (Listener h))) (runInterposeC m)) >>= _ k
54-
-- eff (R other) = do
55-
-- listener <- InterposeC ask
56-
-- case (listener, prj other) of
57-
-- (Just listener, Just eff) -> runListener listener eff
58-
-- _ -> InterposeC (eff (R (handleCoercible other)))
51+
eff (L (Interpose m h k)) = InterposeC (local (const (Just (Listener h))) (runInterposeC m)) >>= k
52+
eff (R other) = do
53+
listener <- InterposeC ask
54+
case (listener, prj other) of
55+
(Just listener, Just eff) -> runListener listener eff
56+
_ -> InterposeC (eff (R (handleCoercible other)))

0 commit comments

Comments
 (0)