@@ -25,22 +25,12 @@ module Asyncly.AsyncT
26-- , makeAsync
26-- , makeAsync
37 -- internal
28 -- internal
42import Control.Applicative (Alternative (..))
33import Control.Applicative (Alternative (..))
43−import Data.Maybe (maybe)
44import Control.Monad (ap, mzero, when)
34import Control.Monad (ap, mzero, when)
45import Control.Monad.Base (MonadBase (..), liftBaseDefault)
35import Control.Monad.Base (MonadBase (..), liftBaseDefault)
46import Control.Monad.Catch (MonadThrow, throwM)
36import Control.Monad.Catch (MonadThrow, throwM)
@@ -52,6 +42,7 @@ import Control.Monad.Trans.Control (ComposeSt, MonadBaseControl (..),
52 MonadTransControl (..),
42 MonadTransControl (..),
53 defaultLiftBaseWith,
43 defaultLiftBaseWith,
54 defaultRestoreM, liftBaseWith)
44 defaultRestoreM, liftBaseWith)
45+import Data.Maybe (maybe)
55import Data.IORef (newIORef, readIORef, writeIORef)
46import Data.IORef (newIORef, readIORef, writeIORef)
56import Unsafe.Coerce (unsafeCoerce)
47import Unsafe.Coerce (unsafeCoerce)
@@ -213,50 +204,6 @@ instance (MonadAsync m, MonadRecorder m) => MonadRecorder (AsyncT m) where
213 putJournal = lift . putJournal
204 putJournal = lift . putJournal
214 play = lift . play
205 play = lift . play
216−------------------------------------------------------------------------------
217−-- Special compositions
218−------------------------------------------------------------------------------
221−-- | Run @m a@ before running @m b@. The result of @m a@ is discarded.
222−before :: MonadAsync m => AsyncT m a -> AsyncT m b -> AsyncT m b
223−before ma mb = AsyncT $ \stp yld ->
224− (runAsyncT ma) ((runAsyncT mb) stp yld) yld
227−-- | Same as 'before'.
228−(*>>) :: MonadAsync m => AsyncT m a -> AsyncT m b -> AsyncT m b
231−-- | Run @m b@ after running @m a@. The result of @m b@ is discarded.
232−thereafter :: MonadAsync m => AsyncT m a -> AsyncT m b -> AsyncT m a
233−thereafter ma mb = AsyncT $ do
235− _ <- runAsyncT (mb >> mzero)
239−-- | Same as 'thereafter'.
240−(>>*) :: MonadAsync m => AsyncT m a -> AsyncT m b -> AsyncT m a
243−-- XXX This can be moved to utility functions as it is purely app level
244−-- | Run @m b@ right after the first event in @m a@ is generated but before it
245−-- is yielded. The result of @m b@ is discarded.
246−afterfirst :: MonadAsync m => AsyncT m a -> AsyncT m b -> AsyncT m a
247−afterfirst ma mb = do
248− ref <- liftIO $ newIORef False
250− done <- liftIO $ readIORef ref
251− when (not done) $ (liftIO $ writeIORef ref True) >>* mb
255−-- | Same as 'afterfirst'.
256−(>>|) :: MonadAsync m => AsyncT m a -> AsyncT m b -> AsyncT m a
260------------------------------------------------------------------------------
207------------------------------------------------------------------------------
261-- Async primitives
208-- Async primitives
262------------------------------------------------------------------------------
209------------------------------------------------------------------------------