@@ -1,3 +1,4 @@
1{-# LANGUAGE ConstraintKinds #-}
2{-# LANGUAGE ConstraintKinds #-}
2{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE FlexibleInstances #-}
4{-# LANGUAGE FlexibleInstances #-}
@@ -102,15 +103,14 @@ module Streamly.Streams
105−import Control.Applicative (Alternative (..), liftA2)
106+import Control.Monad (ap)
106−import Control.Monad (MonadPlus(..), ap)
107−import Control.Monad.Base (MonadBase (..))
107+import Control.Monad.Base (MonadBase (..), liftBaseDefault)
108−import Control.Monad.Catch (MonadThrow)
108+import Control.Monad.Catch (MonadThrow, throwM)
109−import Control.Monad.Error.Class (MonadError(..))
109+-- import Control.Monad.Error.Class (MonadError(..))
110import Control.Monad.IO.Class (MonadIO(..))
110import Control.Monad.IO.Class (MonadIO(..))
111import Control.Monad.Reader.Class (MonadReader(..))
111import Control.Monad.Reader.Class (MonadReader(..))
112import Control.Monad.State.Class (MonadState(..))
112import Control.Monad.State.Class (MonadState(..))
113−import Control.Monad.Trans.Class (MonadTrans)
113+import Control.Monad.Trans.Class (MonadTrans (lift))
114import Data.Semigroup (Semigroup(..))
114import Data.Semigroup (Semigroup(..))
115import Prelude hiding (zipWith)
115import Prelude hiding (zipWith)
116import Streamly.Core ( MonadParallel, Stream(Stream)
116import Streamly.Core ( MonadParallel, Stream(Stream)
@@ -266,6 +266,46 @@ async m = do
266 sv <- S.newStreamVar1 (SVarStyle Disjunction LIFO) (toStream m)
266 sv <- S.newStreamVar1 (SVarStyle Disjunction LIFO) (toStream m)
267 return $ fromSVar sv
267 return $ fromSVar sv
269+------------------------------------------------------------------------------
270+-- CPP macros for common instances
271+------------------------------------------------------------------------------
273+-- XXX use template haskell instead and include Monoid and IsStream instances
276+#define MONADPARALLEL , MonadParallel m
278+#define MONAD_APPLICATIVE_INSTANCE(STREAM,CONSTRAINT) \
279+instance (Monad m CONSTRAINT) => Applicative (STREAM m) where { \
280+ pure = STREAM . singleton; \
283+#define MONAD_COMMON_INSTANCES(STREAM,CONSTRAINT) \
284+instance (MonadBase b m, Monad m CONSTRAINT) => MonadBase b (STREAM m) where {\
285+ liftBase = liftBaseDefault }; \
287+instance (MonadIO m CONSTRAINT) => MonadIO (STREAM m) where { \
288+ liftIO = lift . liftIO }; \
290+instance (MonadThrow m CONSTRAINT) => MonadThrow (STREAM m) where { \
291+ throwM = lift . throwM }; \
294+instance (MonadError e m CONSTRAINT) => MonadError e (STREAM m) where { \
295+ throwError = lift . throwError; \
297+ fromStream $ S.withCatchError (toStream m) (\e -> toStream $ h e) }; \
300+instance (MonadReader r m CONSTRAINT) => MonadReader r (STREAM m) where { \
302+ local f m = fromStream $ S.withLocal f (toStream m) }; \
304+instance (MonadState s m CONSTRAINT) => MonadState s (STREAM m) where { \
306+ put x = lift (put x); \
307+ state k = lift (state k) }
269------------------------------------------------------------------------------
309------------------------------------------------------------------------------
270-- SerialT
310-- SerialT
271------------------------------------------------------------------------------
311------------------------------------------------------------------------------
@@ -321,14 +361,7 @@ async m = do
321-- streams as it explores only one stream at a time.
361-- streams as it explores only one stream at a time.
323newtype SerialT m a = SerialT {getSerialT :: Stream m a}
363newtype SerialT m a = SerialT {getSerialT :: Stream m a}
324− deriving (Semigroup, Monoid, MonadTrans, MonadIO, MonadThrow)
364+ deriving (Semigroup, Monoid, Functor, MonadTrans)
326−deriving instance MonadParallel m => Alternative (SerialT m)
327−deriving instance MonadParallel m => MonadPlus (SerialT m)
328−deriving instance (MonadBase b m, Monad m) => MonadBase b (SerialT m)
329−deriving instance MonadError e m => MonadError e (SerialT m)
330−deriving instance MonadReader r m => MonadReader r (SerialT m)
331−deriving instance MonadState s m => MonadState s (SerialT m)
333instance IsStream SerialT where
366instance IsStream SerialT where
334 toStream = getSerialT
367 toStream = getSerialT
@@ -338,11 +371,6 @@ instance IsStream SerialT where
338{-# Deprecated StreamT "Please use SerialT instead." #-}
371{-# Deprecated StreamT "Please use SerialT instead." #-}
339type StreamT = SerialT
372type StreamT = SerialT
341−-- XXX The Functor/Applicative/Num instances for all the types are exactly the
342−-- same, how can we reduce this boilerplate (use TH)? We cannot derive them
343−-- from a single base type because they depend on the Monad instance which is
344−-- different for each type.
346------------------------------------------------------------------------------
374------------------------------------------------------------------------------
347-- Semigroup
375-- Semigroup
348------------------------------------------------------------------------------
376------------------------------------------------------------------------------
@@ -367,66 +395,11 @@ instance Monad m => Monad (SerialT m) where
367 in m Nothing stp single yield
395 in m Nothing stp single yield
369------------------------------------------------------------------------------
397------------------------------------------------------------------------------
370−-- Applicative
398+-- Other instances
371−------------------------------------------------------------------------------
373−instance Monad m => Applicative (SerialT m) where
374− pure = SerialT . singleton
377−------------------------------------------------------------------------------
379−------------------------------------------------------------------------------
381−instance Monad m => Functor (SerialT m) where
382− fmap f m = fromStream $ Stream $ \_ stp sng yld ->
383− let single = sng . f
384− yield a r = yld (f a) (toStream $ fmap f (SerialT r))
385− in (S.runStream (toStream m)) Nothing stp single yield
387−------------------------------------------------------------------------------
389------------------------------------------------------------------------------
399------------------------------------------------------------------------------
391−instance (Monad m, Num a) => Num (SerialT m a) where
401+MONAD_APPLICATIVE_INSTANCE(SerialT,)
392− fromInteger n = pure (fromInteger n)
402+MONAD_COMMON_INSTANCES(SerialT,)
394− negate = fmap negate
396− signum = fmap signum
402−instance (Monad m, Fractional a) => Fractional (SerialT m a) where
403− fromRational n = pure (fromRational n)
409−instance (Monad m, Floating a) => Floating (SerialT m a) where
429− logBase = liftA2 logBase
431------------------------------------------------------------------------------
404------------------------------------------------------------------------------
432-- CoserialT
405-- CoserialT
@@ -463,14 +436,7 @@ instance (Monad m, Floating a) => Floating (SerialT m a) where
463-- streams as it needs to retain state for each unfinished stream.
436-- streams as it needs to retain state for each unfinished stream.
465newtype CoserialT m a = CoserialT {getCoserialT :: Stream m a}
438newtype CoserialT m a = CoserialT {getCoserialT :: Stream m a}
466− deriving (Monoid, MonadTrans, MonadIO, MonadThrow)
439+ deriving (Functor, MonadTrans)
468−deriving instance MonadParallel m => Alternative (CoserialT m)
469−deriving instance MonadParallel m => MonadPlus (CoserialT m)
470−deriving instance (MonadBase b m, Monad m) => MonadBase b (CoserialT m)
471−deriving instance MonadError e m => MonadError e (CoserialT m)
472−deriving instance MonadReader r m => MonadReader r (CoserialT m)
473−deriving instance MonadState s m => MonadState s (CoserialT m)
475{-# DEPRECATED InterleavedT "Please use 'CoserialT' instead." #-}
441{-# DEPRECATED InterleavedT "Please use 'CoserialT' instead." #-}
476type InterleavedT = CoserialT
442type InterleavedT = CoserialT
@@ -500,6 +466,14 @@ infixr 5 <=>
500(<=>) :: IsStream t => t m a -> t m a -> t m a
466(<=>) :: IsStream t => t m a -> t m a -> t m a
501(<=>) = coserial
467(<=>) = coserial
469+------------------------------------------------------------------------------
471+------------------------------------------------------------------------------
473+instance Monoid (CoserialT m a) where
503------------------------------------------------------------------------------
477------------------------------------------------------------------------------
505------------------------------------------------------------------------------
479------------------------------------------------------------------------------
@@ -513,66 +487,11 @@ instance Monad m => Monad (CoserialT m) where
513 in m Nothing stp single yield
487 in m Nothing stp single yield
515------------------------------------------------------------------------------
489------------------------------------------------------------------------------
516−-- Applicative
490+-- Other instances
517−------------------------------------------------------------------------------
519−instance Monad m => Applicative (CoserialT m) where
520− pure = CoserialT . singleton
523−------------------------------------------------------------------------------
525−------------------------------------------------------------------------------
527−instance Monad m => Functor (CoserialT m) where
528− fmap f m = fromStream $ Stream $ \_ stp sng yld ->
529− let single = sng . f
530− yield a r = yld (f a) (toStream $ fmap f (CoserialT r))
531− in (S.runStream (toStream m)) Nothing stp single yield
533−------------------------------------------------------------------------------
535------------------------------------------------------------------------------
491------------------------------------------------------------------------------
537−instance (Monad m, Num a) => Num (CoserialT m a) where
493+MONAD_APPLICATIVE_INSTANCE(CoserialT,)
538− fromInteger n = pure (fromInteger n)
494+MONAD_COMMON_INSTANCES(CoserialT,)
540− negate = fmap negate
542− signum = fmap signum
548−instance (Monad m, Fractional a) => Fractional (CoserialT m a) where
549− fromRational n = pure (fromRational n)
555−instance (Monad m, Floating a) => Floating (CoserialT m a) where
575− logBase = liftA2 logBase
577------------------------------------------------------------------------------
496------------------------------------------------------------------------------
578-- CoparallelT
497-- CoparallelT
@@ -618,17 +537,7 @@ instance (Monad m, Floating a) => Floating (CoserialT m a) where
618-- as it explores only a bounded number of streams at a time.
537-- as it explores only a bounded number of streams at a time.
620newtype CoparallelT m a = CoparallelT {getCoparallelT :: Stream m a}
539newtype CoparallelT m a = CoparallelT {getCoparallelT :: Stream m a}
621− deriving (MonadTrans)
540+ deriving (Functor, MonadTrans)
623−deriving instance MonadParallel m => Monoid (CoparallelT m a)
624−deriving instance MonadParallel m => Alternative (CoparallelT m)
625−deriving instance MonadParallel m => MonadPlus (CoparallelT m)
626−deriving instance MonadParallel m => MonadIO (CoparallelT m)
627−deriving instance MonadParallel m => MonadThrow (CoparallelT m)
628−deriving instance (MonadBase b m, MonadParallel m) => MonadBase b (CoparallelT m)
629−deriving instance (MonadError e m, MonadParallel m) => MonadError e (CoparallelT m)
630−deriving instance (MonadReader r m, MonadParallel m) => MonadReader r (CoparallelT m)
631−deriving instance (MonadState s m, MonadParallel m) => MonadState s (CoparallelT m)
633{-# DEPRECATED AsyncT "Please use 'CoparallelT' instead." #-}
542{-# DEPRECATED AsyncT "Please use 'CoparallelT' instead." #-}
634type AsyncT = CoparallelT
543type AsyncT = CoparallelT
@@ -657,6 +566,14 @@ instance MonadParallel m => Semigroup (CoparallelT m a) where
657(<|) :: (IsStream t, MonadParallel m) => t m a -> t m a -> t m a
566(<|) :: (IsStream t, MonadParallel m) => t m a -> t m a -> t m a
658(<|) = coparallel
567(<|) = coparallel
569+------------------------------------------------------------------------------
571+------------------------------------------------------------------------------
573+instance MonadParallel m => Monoid (CoparallelT m a) where
660------------------------------------------------------------------------------
577------------------------------------------------------------------------------
662------------------------------------------------------------------------------
579------------------------------------------------------------------------------
@@ -682,66 +599,11 @@ instance MonadParallel m => Monad (CoparallelT m) where
682 where par = S.joinStreamVar2 (SVarStyle Conjunction LIFO)
599 where par = S.joinStreamVar2 (SVarStyle Conjunction LIFO)
684------------------------------------------------------------------------------
601------------------------------------------------------------------------------
685−-- Applicative
602+-- Other instances
686------------------------------------------------------------------------------
603------------------------------------------------------------------------------
688−instance MonadParallel m => Applicative (CoparallelT m) where
605+MONAD_APPLICATIVE_INSTANCE(CoparallelT,MONADPARALLEL)
689− pure = CoparallelT . singleton
606+MONAD_COMMON_INSTANCES(CoparallelT, MONADPARALLEL)
692−------------------------------------------------------------------------------
694−------------------------------------------------------------------------------
696−instance Monad m => Functor (CoparallelT m) where
697− fmap f m = fromStream $ Stream $ \_ stp sng yld ->
698− let single = sng . f
699− yield a r = yld (f a) (toStream $ fmap f (CoparallelT r))
700− in (S.runStream (toStream m)) Nothing stp single yield
702−------------------------------------------------------------------------------
704−------------------------------------------------------------------------------
706−instance (MonadParallel m, Num a) => Num (CoparallelT m a) where
707− fromInteger n = pure (fromInteger n)
709− negate = fmap negate
711− signum = fmap signum
717−instance (MonadParallel m, Fractional a) => Fractional (CoparallelT m a) where
718− fromRational n = pure (fromRational n)
724−instance (MonadParallel m, Floating a) => Floating (CoparallelT m a) where
744− logBase = liftA2 logBase
746------------------------------------------------------------------------------
608------------------------------------------------------------------------------
747-- ParallelT
609-- ParallelT
@@ -785,17 +647,7 @@ instance (MonadParallel m, Floating a) => Floating (CoparallelT m a) where
785-- streams as it needs to retain state for each unfinished stream.
647-- streams as it needs to retain state for each unfinished stream.
787newtype ParallelT m a = ParallelT {getParallelT :: Stream m a}
649newtype ParallelT m a = ParallelT {getParallelT :: Stream m a}
788− deriving (MonadTrans)
650+ deriving (Functor, MonadTrans)
790−deriving instance MonadParallel m => Monoid (ParallelT m a)
791−deriving instance MonadParallel m => Alternative (ParallelT m)
792−deriving instance MonadParallel m => MonadPlus (ParallelT m)
793−deriving instance MonadParallel m => MonadIO (ParallelT m)
794−deriving instance MonadParallel m => MonadThrow (ParallelT m)
795−deriving instance (MonadBase b m, MonadParallel m) => MonadBase b (ParallelT m)
796−deriving instance (MonadError e m, MonadParallel m) => MonadError e (ParallelT m)
797−deriving instance (MonadReader r m, MonadParallel m) => MonadReader r (ParallelT m)
798−deriving instance (MonadState s m, MonadParallel m) => MonadState s (ParallelT m)
800instance IsStream ParallelT where
652instance IsStream ParallelT where
801 toStream = getParallelT
653 toStream = getParallelT
@@ -814,6 +666,14 @@ parallel m1 m2 = fromStream $ S.parallel (toStream m1) (toStream m2)
814instance MonadParallel m => Semigroup (ParallelT m a) where
666instance MonadParallel m => Semigroup (ParallelT m a) where
815 (<>) = parallel
667 (<>) = parallel
669+------------------------------------------------------------------------------
671+------------------------------------------------------------------------------
673+instance MonadParallel m => Monoid (ParallelT m a) where
817------------------------------------------------------------------------------
677------------------------------------------------------------------------------
819------------------------------------------------------------------------------
679------------------------------------------------------------------------------
@@ -824,66 +684,11 @@ instance MonadParallel m => Monad (ParallelT m) where
824 where par = S.joinStreamVar2 (SVarStyle Conjunction FIFO)
684 where par = S.joinStreamVar2 (SVarStyle Conjunction FIFO)
826------------------------------------------------------------------------------
686------------------------------------------------------------------------------
827−-- Applicative
687+-- Other instances
828−------------------------------------------------------------------------------
830−instance MonadParallel m => Applicative (ParallelT m) where
831− pure = ParallelT . singleton
834−------------------------------------------------------------------------------
836------------------------------------------------------------------------------
688------------------------------------------------------------------------------
838−instance Monad m => Functor (ParallelT m) where
690+MONAD_APPLICATIVE_INSTANCE(ParallelT,MONADPARALLEL)
839− fmap f m = fromStream $ Stream $ \_ stp sng yld ->
691+MONAD_COMMON_INSTANCES(ParallelT, MONADPARALLEL)
840− let single = sng . f
841− yield a r = yld (f a) (toStream $ fmap f (ParallelT r))
842− in (S.runStream (toStream m)) Nothing stp single yield
844−------------------------------------------------------------------------------
846−------------------------------------------------------------------------------
848−instance (MonadParallel m, Num a) => Num (ParallelT m a) where
849− fromInteger n = pure (fromInteger n)
851− negate = fmap negate
853− signum = fmap signum
859−instance (MonadParallel m, Fractional a) => Fractional (ParallelT m a) where
860− fromRational n = pure (fromRational n)
866−instance (MonadParallel m, Floating a) => Floating (ParallelT m a) where
886− logBase = liftA2 logBase
888------------------------------------------------------------------------------
693------------------------------------------------------------------------------
889-- Serially Zipping Streams
694-- Serially Zipping Streams
@@ -920,20 +725,12 @@ zipWith f m1 m2 = fromStream $ go (toStream m1) (toStream m2)
920-- 'SerialT'.
725-- 'SerialT'.
922newtype ZipSerial m a = ZipSerial {getZipSerial :: Stream m a}
727newtype ZipSerial m a = ZipSerial {getZipSerial :: Stream m a}
923− deriving (Semigroup, Monoid)
728+ deriving (Functor, Semigroup, Monoid)
925{-# Deprecated ZipStream "Please use ZipSerial instead." #-}
730{-# Deprecated ZipStream "Please use ZipSerial instead." #-}
926-- | Same as ZipSerial.
731-- | Same as ZipSerial.
927type ZipStream = ZipSerial
732type ZipStream = ZipSerial
929−deriving instance MonadParallel m => Alternative (ZipSerial m)
931−instance Monad m => Functor (ZipSerial m) where
932− fmap f m = fromStream $ Stream $ \_ stp sng yld ->
933− let single = sng . f
934− yield a r = yld (f a) (toStream $ fmap f (ZipSerial r))
935− in (S.runStream (toStream m)) Nothing stp single yield
937instance Monad m => Applicative (ZipSerial m) where
734instance Monad m => Applicative (ZipSerial m) where
938 pure = ZipSerial . S.repeat
735 pure = ZipSerial . S.repeat
939 (<*>) = zipWith id
736 (<*>) = zipWith id
@@ -942,46 +739,6 @@ instance IsStream ZipSerial where
942 toStream = getZipSerial
739 toStream = getZipSerial
943 fromStream = ZipSerial
740 fromStream = ZipSerial
945−instance (Monad m, Num a) => Num (ZipSerial m a) where
946− fromInteger n = pure (fromInteger n)
948− negate = fmap negate
950− signum = fmap signum
956−instance (Monad m, Fractional a) => Fractional (ZipSerial m a) where
957− fromRational n = pure (fromRational n)
963−instance (Monad m, Floating a) => Floating (ZipSerial m a) where
983− logBase = liftA2 logBase
985------------------------------------------------------------------------------
742------------------------------------------------------------------------------
986-- Parallely Zipping Streams
743-- Parallely Zipping Streams
987------------------------------------------------------------------------------
744------------------------------------------------------------------------------
@@ -1017,19 +774,11 @@ zipAsyncWith = zipParallelWith
1017-- 'SerialT'.
774-- 'SerialT'.
1019newtype ZipParallel m a = ZipParallel {getZipParallel :: Stream m a}
776newtype ZipParallel m a = ZipParallel {getZipParallel :: Stream m a}
1020− deriving (Semigroup, Monoid)
777+ deriving (Functor, Semigroup, Monoid)
1022{-# DEPRECATED ZipAsync "Please use ZipParallel instead." #-}
779{-# DEPRECATED ZipAsync "Please use ZipParallel instead." #-}
1023type ZipAsync = ZipParallel
780type ZipAsync = ZipParallel
1025−deriving instance MonadParallel m => Alternative (ZipParallel m)
1027−instance Monad m => Functor (ZipParallel m) where
1028− fmap f m = fromStream $ Stream $ \_ stp sng yld ->
1029− let single = sng . f
1030− yield a r = yld (f a) (toStream $ fmap f (ZipParallel r))
1031− in (S.runStream (toStream m)) Nothing stp single yield
1033instance MonadParallel m => Applicative (ZipParallel m) where
782instance MonadParallel m => Applicative (ZipParallel m) where
1034 pure = ZipParallel . S.repeat
783 pure = ZipParallel . S.repeat
1035 (<*>) = zipParallelWith id
784 (<*>) = zipParallelWith id
@@ -1038,46 +787,6 @@ instance IsStream ZipParallel where
1038 toStream = getZipParallel
787 toStream = getZipParallel
1039 fromStream = ZipParallel
788 fromStream = ZipParallel
1041−instance (MonadParallel m, Num a) => Num (ZipParallel m a) where
1042− fromInteger n = pure (fromInteger n)
1044− negate = fmap negate
1046− signum = fmap signum
1052−instance (MonadParallel m, Fractional a) => Fractional (ZipParallel m a) where
1053− fromRational n = pure (fromRational n)
1059−instance (MonadParallel m, Floating a) => Floating (ZipParallel m a) where
1079− logBase = liftA2 logBase
1081-------------------------------------------------------------------------------
790-------------------------------------------------------------------------------
1082-- Type adapting combinators
791-- Type adapting combinators
1083-------------------------------------------------------------------------------
792-------------------------------------------------------------------------------