@@ -54,7 +54,7 @@ module Asyncly.Prelude
56import Control.Applicative (Alternative (..), liftA2)
56import Control.Applicative (Alternative (..), liftA2)
57−import Control.Monad (MonadPlus(..))
57+import Control.Monad (MonadPlus(..), ap, liftM)
58import Control.Monad.Base (MonadBase (..))
58import Control.Monad.Base (MonadBase (..))
59import Control.Monad.Catch (MonadThrow)
59import Control.Monad.Catch (MonadThrow)
60import Control.Monad.Error.Class (MonadError(..))
60import Control.Monad.Error.Class (MonadError(..))
@@ -140,8 +140,7 @@ instance (Monad m, Floating a) => Floating (StreamT m a) where
140------------------------------------------------------------------------------
140------------------------------------------------------------------------------
142newtype InterleavedT m a = InterleavedT {getInterleavedT :: Stream m a}
142newtype InterleavedT m a = InterleavedT {getInterleavedT :: Stream m a}
143− deriving (Functor, Applicative, Semigroup, Monoid,
144− MonadTrans, MonadIO, MonadThrow)
143+ deriving (Semigroup, Monoid, MonadTrans, MonadIO, MonadThrow)
146deriving instance MonadAsync m => Alternative (InterleavedT m)
145deriving instance MonadAsync m => Alternative (InterleavedT m)
147deriving instance MonadAsync m => MonadPlus (InterleavedT m)
146deriving instance MonadAsync m => MonadPlus (InterleavedT m)
@@ -157,6 +156,7 @@ instance Streaming InterleavedT where
157-- | Execute a monadic action for each element in the stream, in a fairly
156-- | Execute a monadic action for each element in the stream, in a fairly
158-- interleaved manner i.e. iterations yield alternately.
157-- interleaved manner i.e. iterations yield alternately.
159instance Monad m => Monad (InterleavedT m) where
158instance Monad m => Monad (InterleavedT m) where
160 (InterleavedT (Stream m)) >>= f = InterleavedT $ Stream $ \_ stp yld ->
160 (InterleavedT (Stream m)) >>= f = InterleavedT $ Stream $ \_ stp yld ->
161 let run x = (runStream x) Nothing stp yld
161 let run x = (runStream x) Nothing stp yld
162 yield a Nothing = run $ getInterleavedT (f a)
162 yield a Nothing = run $ getInterleavedT (f a)
@@ -165,6 +165,21 @@ instance Monad m => Monad (InterleavedT m) where
165 getInterleavedT ((InterleavedT r) >>= f)
165 getInterleavedT ((InterleavedT r) >>= f)
166 in m Nothing stp yield
166 in m Nothing stp yield
168+------------------------------------------------------------------------------
170+------------------------------------------------------------------------------
172+instance Monad m => Functor (InterleavedT m) where
175+------------------------------------------------------------------------------
177+------------------------------------------------------------------------------
179+instance Monad m => Applicative (InterleavedT m) where
180+ pure = InterleavedT . yielding
168------------------------------------------------------------------------------
183------------------------------------------------------------------------------
170------------------------------------------------------------------------------
185------------------------------------------------------------------------------
@@ -216,7 +231,7 @@ instance (Monad m, Floating a) => Floating (InterleavedT m a) where
216------------------------------------------------------------------------------
231------------------------------------------------------------------------------
218newtype AsyncT m a = AsyncT {getAsyncT :: Stream m a}
233newtype AsyncT m a = AsyncT {getAsyncT :: Stream m a}
219− deriving (Functor, Applicative, Semigroup, Monoid, MonadTrans)
234+ deriving (Semigroup, Monoid, MonadTrans)
221deriving instance MonadAsync m => MonadIO (AsyncT m)
236deriving instance MonadAsync m => MonadIO (AsyncT m)
222deriving instance MonadAsync m => MonadThrow (AsyncT m)
237deriving instance MonadAsync m => MonadThrow (AsyncT m)
@@ -250,15 +265,31 @@ parbind k m f = go m
250-- iterations in parallel, but giving preference to iterations started
265-- iterations in parallel, but giving preference to iterations started
251-- earlier.
266-- earlier.
252instance MonadAsync m => Monad (AsyncT m) where
267instance MonadAsync m => Monad (AsyncT m) where
253 (AsyncT m) >>= f = AsyncT $ parbind par m g
269 (AsyncT m) >>= f = AsyncT $ parbind par m g
254 where g x = getAsyncT (f x)
270 where g x = getAsyncT (f x)
255 par = parallel (CtxType Conjunction LIFO)
271 par = parallel (CtxType Conjunction LIFO)
273+------------------------------------------------------------------------------
275+------------------------------------------------------------------------------
277+instance MonadAsync m => Functor (AsyncT m) where
280+------------------------------------------------------------------------------
282+------------------------------------------------------------------------------
284+instance MonadAsync m => Applicative (AsyncT m) where
285+ pure = AsyncT . yielding
257------------------------------------------------------------------------------
288------------------------------------------------------------------------------
259------------------------------------------------------------------------------
290------------------------------------------------------------------------------
261−instance (Monad m, Num a) => Num (AsyncT m a) where
292+instance (MonadAsync m, Num a) => Num (AsyncT m a) where
262 fromInteger n = pure (fromInteger n)
293 fromInteger n = pure (fromInteger n)
264 negate = fmap negate
295 negate = fmap negate
@@ -269,14 +300,14 @@ instance (Monad m, Num a) => Num (AsyncT m a) where
269 (*) = liftA2 (*)
300 (*) = liftA2 (*)
270 (-) = liftA2 (-)
301 (-) = liftA2 (-)
272−instance (Monad m, Fractional a) => Fractional (AsyncT m a) where
303+instance (MonadAsync m, Fractional a) => Fractional (AsyncT m a) where
273 fromRational n = pure (fromRational n)
304 fromRational n = pure (fromRational n)
275 recip = fmap recip
306 recip = fmap recip
277 (/) = liftA2 (/)
308 (/) = liftA2 (/)
279−instance (Monad m, Floating a) => Floating (AsyncT m a) where
310+instance (MonadAsync m, Floating a) => Floating (AsyncT m a) where
280 pi = pure pi
311 pi = pure pi
282 exp = fmap exp
313 exp = fmap exp
@@ -305,7 +336,7 @@ instance (Monad m, Floating a) => Floating (AsyncT m a) where
305------------------------------------------------------------------------------
336------------------------------------------------------------------------------
307newtype ParallelT m a = ParallelT {getParallelT :: Stream m a}
338newtype ParallelT m a = ParallelT {getParallelT :: Stream m a}
308− deriving (Functor, Applicative, Semigroup, Monoid, MonadTrans)
339+ deriving (Semigroup, Monoid, MonadTrans)
310deriving instance MonadAsync m => MonadIO (ParallelT m)
341deriving instance MonadAsync m => MonadIO (ParallelT m)
311deriving instance MonadAsync m => MonadThrow (ParallelT m)
342deriving instance MonadAsync m => MonadThrow (ParallelT m)
@@ -324,15 +355,31 @@ instance Streaming ParallelT where
324-- iterations in a fairly parallel manner, i.e. all iterations are equally
355-- iterations in a fairly parallel manner, i.e. all iterations are equally
325-- likely to run.
356-- likely to run.
326instance MonadAsync m => Monad (ParallelT m) where
357instance MonadAsync m => Monad (ParallelT m) where
327 (ParallelT m) >>= f = ParallelT $ parbind par m g
359 (ParallelT m) >>= f = ParallelT $ parbind par m g
328 where g x = getParallelT (f x)
360 where g x = getParallelT (f x)
329 par = parallel (CtxType Conjunction FIFO)
361 par = parallel (CtxType Conjunction FIFO)
363+------------------------------------------------------------------------------
365+------------------------------------------------------------------------------
367+instance MonadAsync m => Functor (ParallelT m) where
370+------------------------------------------------------------------------------
372+------------------------------------------------------------------------------
374+instance MonadAsync m => Applicative (ParallelT m) where
375+ pure = ParallelT . yielding
331------------------------------------------------------------------------------
378------------------------------------------------------------------------------
333------------------------------------------------------------------------------
380------------------------------------------------------------------------------
335−instance (Monad m, Num a) => Num (ParallelT m a) where
382+instance (MonadAsync m, Num a) => Num (ParallelT m a) where
336 fromInteger n = pure (fromInteger n)
383 fromInteger n = pure (fromInteger n)
338 negate = fmap negate
385 negate = fmap negate
@@ -343,14 +390,14 @@ instance (Monad m, Num a) => Num (ParallelT m a) where
343 (*) = liftA2 (*)
390 (*) = liftA2 (*)
344 (-) = liftA2 (-)
391 (-) = liftA2 (-)
346−instance (Monad m, Fractional a) => Fractional (ParallelT m a) where
393+instance (MonadAsync m, Fractional a) => Fractional (ParallelT m a) where
347 fromRational n = pure (fromRational n)
394 fromRational n = pure (fromRational n)
349 recip = fmap recip
396 recip = fmap recip
351 (/) = liftA2 (/)
398 (/) = liftA2 (/)
353−instance (Monad m, Floating a) => Floating (ParallelT m a) where
400+instance (MonadAsync m, Floating a) => Floating (ParallelT m a) where
354 pi = pure pi
401 pi = pure pi
356 exp = fmap exp
403 exp = fmap exp