@@ -71,8 +71,8 @@ import Asyncly.AsyncT
71------------------------------------------------------------------------------
71------------------------------------------------------------------------------
73newtype StreamT m a = StreamT {getStreamT :: Stream m a}
73newtype StreamT m a = StreamT {getStreamT :: Stream m a}
74− deriving (Functor, Applicative, Monad, Semigroup, Monoid, Num, Fractional,
74+ deriving (Functor, Applicative, Monad, Semigroup, Monoid,
75− Floating, MonadTrans, MonadIO, MonadThrow)
75+ MonadTrans, MonadIO, MonadThrow)
77deriving instance MonadAsync m => Alternative (StreamT m)
77deriving instance MonadAsync m => Alternative (StreamT m)
78deriving instance MonadAsync m => MonadPlus (StreamT m)
78deriving instance MonadAsync m => MonadPlus (StreamT m)
@@ -85,15 +85,63 @@ instance Streaming StreamT where
85 toStream = getStreamT
85 toStream = getStreamT
86 fromStream = StreamT
86 fromStream = StreamT
88+-- XXX The Functor/Applicative/Num instances for all the types are exactly the
89+-- same, how can we reduce this boilerplate (use TH)? We cannot derive them
90+-- from a single base type because they depend on the Monad instance which is
91+-- different for each type.
93+------------------------------------------------------------------------------
95+------------------------------------------------------------------------------
97+instance (Monad m, Num a) => Num (StreamT m a) where
98+ fromInteger n = pure (fromInteger n)
100+ negate = fmap negate
102+ signum = fmap signum
108+instance (Monad m, Fractional a) => Fractional (StreamT m a) where
109+ fromRational n = pure (fromRational n)
115+instance (Monad m, Floating a) => Floating (StreamT m a) where
135+ logBase = liftA2 logBase
88------------------------------------------------------------------------------
137------------------------------------------------------------------------------
89-- InterleavedT interleaves the iterations in the Monad and Applicative
138-- InterleavedT interleaves the iterations in the Monad and Applicative
90-- compositions. It does not make much sense for infinite streams.
139-- compositions. It does not make much sense for infinite streams.
91------------------------------------------------------------------------------
140------------------------------------------------------------------------------
93−-- XXX the applicative, functor and num instances may not be correct
94newtype InterleavedT m a = InterleavedT {getInterleavedT :: Stream m a}
142newtype InterleavedT m a = InterleavedT {getInterleavedT :: Stream m a}
95− deriving (Functor, Applicative, Semigroup, Monoid, Num, Fractional,
143+ deriving (Functor, Applicative, Semigroup, Monoid,
96− Floating, MonadTrans, MonadIO, MonadThrow)
144+ MonadTrans, MonadIO, MonadThrow)
98deriving instance MonadAsync m => Alternative (InterleavedT m)
146deriving instance MonadAsync m => Alternative (InterleavedT m)
99deriving instance MonadAsync m => MonadPlus (InterleavedT m)
147deriving instance MonadAsync m => MonadPlus (InterleavedT m)
@@ -106,9 +154,9 @@ instance Streaming InterleavedT where
106 toStream = getInterleavedT
154 toStream = getInterleavedT
107 fromStream = InterleavedT
155 fromStream = InterleavedT
157+-- | Execute a monadic action for each element in the stream, in a fairly
158+-- interleaved manner i.e. iterations yield alternately.
109instance Monad m => Monad (InterleavedT m) where
159instance Monad m => Monad (InterleavedT m) where
110− -- | Execute a monadic action for each element in the stream, in a fairly
111− -- interleaved manner i.e. iterations yield alternately.
112 (InterleavedT (Stream m)) >>= f = InterleavedT $ Stream $ \_ stp yld ->
160 (InterleavedT (Stream m)) >>= f = InterleavedT $ Stream $ \_ stp yld ->
113 let run x = (runStream x) Nothing stp yld
161 let run x = (runStream x) Nothing stp yld
114 yield a Nothing = run $ getInterleavedT (f a)
162 yield a Nothing = run $ getInterleavedT (f a)
@@ -117,6 +165,50 @@ instance Monad m => Monad (InterleavedT m) where
117 getInterleavedT ((InterleavedT r) >>= f)
165 getInterleavedT ((InterleavedT r) >>= f)
118 in m Nothing stp yield
166 in m Nothing stp yield
168+------------------------------------------------------------------------------
170+------------------------------------------------------------------------------
172+instance (Monad m, Num a) => Num (InterleavedT m a) where
173+ fromInteger n = pure (fromInteger n)
175+ negate = fmap negate
177+ signum = fmap signum
183+instance (Monad m, Fractional a) => Fractional (InterleavedT m a) where
184+ fromRational n = pure (fromRational n)
190+instance (Monad m, Floating a) => Floating (InterleavedT m a) where
210+ logBase = liftA2 logBase
120------------------------------------------------------------------------------
212------------------------------------------------------------------------------
121-- AsyncT runs the iterations asynchronously in the Monad and Applicative
213-- AsyncT runs the iterations asynchronously in the Monad and Applicative
122-- compositions. More iterations are started in parallel on demand. It can work
214-- compositions. More iterations are started in parallel on demand. It can work
@@ -124,8 +216,7 @@ instance Monad m => Monad (InterleavedT m) where
124------------------------------------------------------------------------------
216------------------------------------------------------------------------------
126newtype AsyncT m a = AsyncT {getAsyncT :: Stream m a}
218newtype AsyncT m a = AsyncT {getAsyncT :: Stream m a}
127− deriving (Functor, Applicative, Semigroup, Monoid, Num, Fractional,
219+ deriving (Functor, Applicative, Semigroup, Monoid, MonadTrans)
128− Floating, MonadTrans)
130deriving instance MonadAsync m => MonadIO (AsyncT m)
221deriving instance MonadAsync m => MonadIO (AsyncT m)
131deriving instance MonadAsync m => MonadThrow (AsyncT m)
222deriving instance MonadAsync m => MonadThrow (AsyncT m)
@@ -155,14 +246,58 @@ parbind k m f = go m
155 yield a (Just r) = run $ f a `k` (go r)
246 yield a (Just r) = run $ f a `k` (go r)
156 in g Nothing stp yield
247 in g Nothing stp yield
249+-- | Execute a monadic action for each element in the stream, running
250+-- iterations in parallel, but giving preference to iterations started
158instance MonadAsync m => Monad (AsyncT m) where
252instance MonadAsync m => Monad (AsyncT m) where
159− -- | Execute a monadic action for each element in the stream, running
160− -- iterations in parallel, but giving preference to iterations started
162 (AsyncT m) >>= f = AsyncT $ parbind par m g
253 (AsyncT m) >>= f = AsyncT $ parbind par m g
163 where g x = getAsyncT (f x)
254 where g x = getAsyncT (f x)
164 par = parallel (CtxType Conjunction LIFO)
255 par = parallel (CtxType Conjunction LIFO)
257+------------------------------------------------------------------------------
259+------------------------------------------------------------------------------
261+instance (Monad m, Num a) => Num (AsyncT m a) where
262+ fromInteger n = pure (fromInteger n)
264+ negate = fmap negate
266+ signum = fmap signum
272+instance (Monad m, Fractional a) => Fractional (AsyncT m a) where
273+ fromRational n = pure (fromRational n)
279+instance (Monad m, Floating a) => Floating (AsyncT m a) where
299+ logBase = liftA2 logBase
166------------------------------------------------------------------------------
301------------------------------------------------------------------------------
167-- ParallelT runs all iterations in parallel in the Monad and Applicative
302-- ParallelT runs all iterations in parallel in the Monad and Applicative
168-- compositions. Iterations are scheduled in a round-robin fashion. It cannot
303-- compositions. Iterations are scheduled in a round-robin fashion. It cannot
@@ -170,8 +305,7 @@ instance MonadAsync m => Monad (AsyncT m) where
170------------------------------------------------------------------------------
305------------------------------------------------------------------------------
172newtype ParallelT m a = ParallelT {getParallelT :: Stream m a}
307newtype ParallelT m a = ParallelT {getParallelT :: Stream m a}
173− deriving (Functor, Applicative, Semigroup, Monoid, Num, Fractional,
308+ deriving (Functor, Applicative, Semigroup, Monoid, MonadTrans)
174− Floating, MonadTrans)
176deriving instance MonadAsync m => MonadIO (ParallelT m)
310deriving instance MonadAsync m => MonadIO (ParallelT m)
177deriving instance MonadAsync m => MonadThrow (ParallelT m)
311deriving instance MonadAsync m => MonadThrow (ParallelT m)
@@ -186,14 +320,58 @@ instance Streaming ParallelT where
186 toStream = getParallelT
320 toStream = getParallelT
187 fromStream = ParallelT
321 fromStream = ParallelT
323+-- | Execute a monadic action for each element in the stream, running
324+-- iterations in a fairly parallel manner, i.e. all iterations are equally
189instance MonadAsync m => Monad (ParallelT m) where
326instance MonadAsync m => Monad (ParallelT m) where
190− -- | Execute a monadic action for each element in the stream, running
191− -- iterations in a fairly parallel manner, i.e. all iterations are equally
193 (ParallelT m) >>= f = ParallelT $ parbind par m g
327 (ParallelT m) >>= f = ParallelT $ parbind par m g
194 where g x = getParallelT (f x)
328 where g x = getParallelT (f x)
195 par = parallel (CtxType Conjunction FIFO)
329 par = parallel (CtxType Conjunction FIFO)
331+------------------------------------------------------------------------------
333+------------------------------------------------------------------------------
335+instance (Monad m, Num a) => Num (ParallelT m a) where
336+ fromInteger n = pure (fromInteger n)
338+ negate = fmap negate
340+ signum = fmap signum
346+instance (Monad m, Fractional a) => Fractional (ParallelT m a) where
347+ fromRational n = pure (fromRational n)
353+instance (Monad m, Floating a) => Floating (ParallelT m a) where
373+ logBase = liftA2 logBase
197------------------------------------------------------------------------------
375------------------------------------------------------------------------------
198-- Serially Zipping Streams
376-- Serially Zipping Streams
199------------------------------------------------------------------------------
377------------------------------------------------------------------------------