on master help sign in
Remove type applications from listen
commitf35e3924e9594282f27bf01a5c0d299a26af889a authorAndrzej Rybczak <andrzej@rybczak.net> dateMon 28 Jun 2021, 21:52 (5 years ago) parentb9c42c9
3 files changed+6−24
src/Effectful/Writer.hs+2−9 src/Effectful/Writer/Dynamic.hs+1−5 src/Effectful/Writer/MVar.hs+3−10
src/Effectful/Writer.hs+2−9
@@ -32,10 +32,7 @@ execWriter m = do
3232tell :: (Writer w :> es, Monoid w) => w -> Eff es ()
3333tell w = stateEffect $ \(IdE (Writer w0)) -> ((), IdE (Writer (w0 <> w)))
3434
35−listen
36− :: forall w es a. (Writer w :> es, Monoid w)
37− => Eff es a
38− -> Eff es (a, w)
35+listen :: (Writer w :> es, Monoid w) => Eff es a -> Eff es (a, w)
3936listen m = unsafeEff $ \es -> mask $ \restore -> do
4037 w0 <- unsafeStateEnv (\(IdE (Writer w)) -> (w, IdE (Writer mempty))) es
4138 a <- restore (unEff m es) `onException` merge es w0
@@ -45,11 +42,7 @@ listen m = unsafeEff $ \es -> mask $ \restore -> do
4542 -- If an exception is thrown, restore w0 and keep parts of w1.
4643 unsafeStateEnv (\(IdE (Writer w1)) -> (w1, IdE (Writer (w0 <> w1)))) es
4744
48−listens
49− :: (Writer w :> es, Monoid w)
50− => (w -> b)
51− -> Eff es a
52− -> Eff es (a, b)
45+listens :: (Writer w :> es, Monoid w) => (w -> b) -> Eff es a -> Eff es (a, b)
5346listens f m = do
5447 (a, w) <- listen m
5548 pure (a, f w)
src/Effectful/Writer/Dynamic.hs+1−5
@@ -71,11 +71,7 @@ tell = send . Tell
7171listen :: (Writer w :> es, Monoid w) => Eff es a -> Eff es (a, w)
7272listen = send . Listen
7373
74−listens
75− :: (Writer w :> es, Monoid w)
76− => (w -> b)
77− -> Eff es a
78− -> Eff es (a, b)
74+listens :: (Writer w :> es, Monoid w) => (w -> b) -> Eff es a -> Eff es (a, b)
7975listens f m = do
8076 (a, w) <- listen m
8177 pure (a, f w)
src/Effectful/Writer/MVar.hs+3−10
@@ -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)