@@ -42,17 +42,15 @@ newtype InterposeC (eff :: (* -> *) -> * -> *) m a = InterposeC
4242
4343newtype 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
5050instance (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