on master help sign in
Remove type applications from listen
f35e392Andrzej Rybczak
src/Effectful/Writer.hs+2−9
@@ -32,10 +32,7 @@ execWriter m = do
32tell :: (Writer w :> es, Monoid w) => w -> Eff es ()
32tell :: (Writer w :> es, Monoid w) => w -> Eff es ()
33tell w = stateEffect $ \(IdE (Writer w0)) -> ((), IdE (Writer (w0 <> w)))
33tell w = stateEffect $ \(IdE (Writer w0)) -> ((), IdE (Writer (w0 <> w)))
34
34
35−listen
36− :: forall w es a. (Writer w :> es, Monoid w)
35+listen :: (Writer w :> es, Monoid w) => Eff es a -> Eff es (a, w)
37− => Eff es a
38− -> Eff es (a, w)
39listen m = unsafeEff $ \es -> mask $ \restore -> do
36listen m = unsafeEff $ \es -> mask $ \restore -> do
40 w0 <- unsafeStateEnv (\(IdE (Writer w)) -> (w, IdE (Writer mempty))) es
37 w0 <- unsafeStateEnv (\(IdE (Writer w)) -> (w, IdE (Writer mempty))) es
41 a <- restore (unEff m es) `onException` merge es w0
38 a <- restore (unEff m es) `onException` merge es w0
@@ -45,11 +42,7 @@ listen m = unsafeEff $ \es -> mask $ \restore -> do
45 -- If an exception is thrown, restore w0 and keep parts of w1.
42 -- If an exception is thrown, restore w0 and keep parts of w1.
46 unsafeStateEnv (\(IdE (Writer w1)) -> (w1, IdE (Writer (w0 <> w1)))) es
43 unsafeStateEnv (\(IdE (Writer w1)) -> (w1, IdE (Writer (w0 <> w1)))) es
47
44
48−listens
49− :: (Writer w :> es, Monoid w)
45+listens :: (Writer w :> es, Monoid w) => (w -> b) -> Eff es a -> Eff es (a, b)
50− => (w -> b)
51− -> Eff es a
52− -> Eff es (a, b)
53listens f m = do
46listens f m = do
54 (a, w) <- listen m
47 (a, w) <- listen m
55 pure (a, f w)
48 pure (a, f w)
src/Effectful/Writer/Dynamic.hs+1−5
@@ -71,11 +71,7 @@ tell = send . Tell
71listen :: (Writer w :> es, Monoid w) => Eff es a -> Eff es (a, w)
71listen :: (Writer w :> es, Monoid w) => Eff es a -> Eff es (a, w)
72listen = send . Listen
72listen = send . Listen
73
73
74−listens
75− :: (Writer w :> es, Monoid w)
74+listens :: (Writer w :> es, Monoid w) => (w -> b) -> Eff es a -> Eff es (a, b)
76− => (w -> b)
77− -> Eff es a
78− -> Eff es (a, b)
79listens f m = do
75listens f m = do
80 (a, w) <- listen m
76 (a, w) <- listen m
81 pure (a, f w)
77 pure (a, f w)
src/Effectful/Writer/MVar.hs+3−10
@@ -35,10 +35,7 @@ tell w1 = do
35 IdE (Writer v) <- getEffect
35 IdE (Writer v) <- getEffect
36 unsafeEff_ . modifyMVar_ v $ \w0 -> let w = w0 <> w1 in w `seq` pure w
36 unsafeEff_ . modifyMVar_ v $ \w0 -> let w = w0 <> w1 in w `seq` pure w
37
37
38−listen
39− :: forall w es a. (Writer w :> es, Monoid w)
38+listen :: (Writer w :> es, Monoid w) => Eff es a -> Eff es (a, w)
40− => Eff es a
41− -> Eff es (a, w)
42listen m = unsafeEff $ \es -> uninterruptibleMask $ \restore -> do
39listen m = unsafeEff $ \es -> uninterruptibleMask $ \restore -> do
43 v1 <- newMVar mempty
40 v1 <- newMVar mempty
44 -- Replace thread local MVar with a fresh one for isolated listening.
41 -- Replace thread local MVar with a fresh one for isolated listening.
@@ -49,18 +46,14 @@ listen m = unsafeEff $ \es -> uninterruptibleMask $ \restore -> do
49 -- Merge results accumulated in the local MVar with the mainline. If an
46 -- Merge results accumulated in the local MVar with the mainline. If an
50 -- exception was received while listening, merge results recorded so far.
47 -- exception was received while listening, merge results recorded so far.
51 merge es v0 v1 = do
48 merge es v0 v1 = do
52− unsafePutEnv @(Writer w) (IdE (Writer v0)) es
49+ unsafePutEnv (IdE (Writer v0)) es
53 w1 <- readMVar v1
50 w1 <- readMVar v1
54 -- The mask is uninterruptible because modifyMVar_ v0 might block and if
51 -- The mask is uninterruptible because modifyMVar_ v0 might block and if
55 -- we get an async exception while waiting, w1 will be lost.
52 -- we get an async exception while waiting, w1 will be lost.
56 modifyMVar_ v0 $ \w0 -> let w = w0 <> w1 in w `seq` pure w
53 modifyMVar_ v0 $ \w0 -> let w = w0 <> w1 in w `seq` pure w
57 pure w1
54 pure w1
58
55
59−listens
60− :: (Writer w :> es, Monoid w)
56+listens :: (Writer w :> es, Monoid w) => (w -> b) -> Eff es a -> Eff es (a, b)
61− => (w -> b)
62− -> Eff es a
63− -> Eff es (a, b)
64listens f m = do
57listens f m = do
65 (a, w) <- listen m
58 (a, w) <- listen m
66 pure (a, f w)
59 pure (a, f w)