@@ -35,10 +35,7 @@ tell w1 = do
3535 IdE (Writer v) <- getEffect
3636 unsafeEff_ . modifyMVar_ v $ \w0 -> let w = w0 <> w1 in w `seq` pure w
3737
38−listen
39− :: forall w es a. (Writer w :> es, Monoid w)
40− => Eff es a
41− -> Eff es (a, w)
38+listen :: (Writer w :> es, Monoid w) => Eff es a -> Eff es (a, w)
4239listen m = unsafeEff $ \es -> uninterruptibleMask $ \restore -> do
4340 v1 <- newMVar mempty
4441 -- Replace thread local MVar with a fresh one for isolated listening.
@@ -49,18 +46,14 @@ listen m = unsafeEff $ \es -> uninterruptibleMask $ \restore -> do
4946 -- Merge results accumulated in the local MVar with the mainline. If an
5047 -- exception was received while listening, merge results recorded so far.
5148 merge es v0 v1 = do
52− unsafePutEnv @(Writer w) (IdE (Writer v0)) es
49+ unsafePutEnv (IdE (Writer v0)) es
5350 w1 <- readMVar v1
5451 -- The mask is uninterruptible because modifyMVar_ v0 might block and if
5552 -- we get an async exception while waiting, w1 will be lost.
5653 modifyMVar_ v0 $ \w0 -> let w = w0 <> w1 in w `seq` pure w
5754 pure w1
5855
59−listens
60− :: (Writer w :> es, Monoid w)
61− => (w -> b)
62− -> Eff es a
63− -> Eff es (a, b)
56+listens :: (Writer w :> es, Monoid w) => (w -> b) -> Eff es a -> Eff es (a, b)
6457listens f m = do
6558 (a, w) <- listen m
6659 pure (a, f w)