@@ -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,15 @@ module Streamly.Streams
105−import Control.Applicative (Alternative (..), liftA2)
106+import Control.Applicative (liftA2)
106−import Control.Monad (MonadPlus(..), ap)
107+import Control.Monad (ap)
107−import Control.Monad.Base (MonadBase (..))
108+import Control.Monad.Base (MonadBase (..), liftBaseDefault)
108−import Control.Monad.Catch (MonadThrow)
109+import Control.Monad.Catch (MonadThrow, throwM)
109import Control.Monad.Error.Class (MonadError(..))
110import Control.Monad.Error.Class (MonadError(..))
110import Control.Monad.IO.Class (MonadIO(..))
111import Control.Monad.IO.Class (MonadIO(..))
111import Control.Monad.Reader.Class (MonadReader(..))
112import Control.Monad.Reader.Class (MonadReader(..))
112import Control.Monad.State.Class (MonadState(..))
113import Control.Monad.State.Class (MonadState(..))
113−import Control.Monad.Trans.Class (MonadTrans)
114+import Control.Monad.Trans.Class (MonadTrans (lift))
114import Data.Semigroup (Semigroup(..))
115import Data.Semigroup (Semigroup(..))
115import Prelude hiding (zipWith)
116import Prelude hiding (zipWith)
116import Streamly.Core ( MonadParallel, Stream(Stream)
117import Streamly.Core ( MonadParallel, Stream(Stream)
@@ -266,6 +267,85 @@ async m = do
266 sv <- S.newStreamVar1 (SVarStyle Disjunction LIFO) (toStream m)
267 sv <- S.newStreamVar1 (SVarStyle Disjunction LIFO) (toStream m)
267 return $ fromSVar sv
268 return $ fromSVar sv
270+------------------------------------------------------------------------------
271+-- CPP macros for common instances
272+------------------------------------------------------------------------------
274+-- XXX use template haskell instead and include Monoid and IsStream instances
277+#define MONADPARALLEL , MonadParallel m
279+#define MONAD_APPLICATIVE_INSTANCE(STREAM,CONSTRAINT) \
280+instance (Monad m CONSTRAINT) => Applicative (STREAM m) where { \
281+ pure = STREAM . singleton; \
284+#define MONAD_COMMON_INSTANCES(STREAM,CONSTRAINT) \
285+instance (MonadBase b m, Monad m CONSTRAINT) => MonadBase b (STREAM m) where {\
286+ liftBase = liftBaseDefault }; \
288+instance (MonadIO m CONSTRAINT) => MonadIO (STREAM m) where { \
289+ liftIO = lift . liftIO }; \
291+instance (MonadThrow m CONSTRAINT) => MonadThrow (STREAM m) where { \
292+ 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) }; \
299+instance (MonadReader r m CONSTRAINT) => MonadReader r (STREAM m) where { \
301+ local f m = fromStream $ S.withLocal f (toStream m) }; \
303+instance (MonadState s m CONSTRAINT) => MonadState s (STREAM m) where { \
305+ put x = lift (put x); \
306+ state k = lift (state k) }
308+#define NUMERIC_COMMON_INSTANCES(STREAM,CONSTRAINT) \
309+instance (Monad m, Num a CONSTRAINT) => Num (STREAM m a) where { \
310+ fromInteger n = pure (fromInteger n); \
312+ negate = fmap negate; \
314+ signum = fmap signum; \
318+ (-) = liftA2 (-) }; \
320+instance (Monad m, Fractional a CONSTRAINT) => Fractional (STREAM m a) where {\
321+ fromRational n = pure (fromRational n); \
323+ recip = fmap recip; \
325+ (/) = liftA2 (/) }; \
327+instance (Monad m, Floating a CONSTRAINT) => Floating (STREAM m a) where { \
342+ asinh = fmap asinh; \
343+ atanh = fmap atanh; \
344+ acosh = fmap acosh; \
346+ (**) = liftA2 (**); \
347+ logBase = liftA2 logBase }
269------------------------------------------------------------------------------
349------------------------------------------------------------------------------
270-- SerialT
350-- SerialT
271------------------------------------------------------------------------------
351------------------------------------------------------------------------------
@@ -321,14 +401,7 @@ async m = do
321-- streams as it explores only one stream at a time.
401-- streams as it explores only one stream at a time.
323newtype SerialT m a = SerialT {getSerialT :: Stream m a}
403newtype SerialT m a = SerialT {getSerialT :: Stream m a}
324− deriving (Functor, Semigroup, Monoid, MonadTrans, MonadIO, MonadThrow)
404+ 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
406instance IsStream SerialT where
334 toStream = getSerialT
407 toStream = getSerialT
@@ -338,11 +411,6 @@ instance IsStream SerialT where
338{-# Deprecated StreamT "Please use SerialT instead." #-}
411{-# Deprecated StreamT "Please use SerialT instead." #-}
339type StreamT = SerialT
412type 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------------------------------------------------------------------------------
414------------------------------------------------------------------------------
347-- Semigroup
415-- Semigroup
348------------------------------------------------------------------------------
416------------------------------------------------------------------------------
@@ -367,56 +435,12 @@ instance Monad m => Monad (SerialT m) where
367 in m Nothing stp single yield
435 in m Nothing stp single yield
369------------------------------------------------------------------------------
437------------------------------------------------------------------------------
370−-- Applicative
438+-- Other instances
371−------------------------------------------------------------------------------
373−instance Monad m => Applicative (SerialT m) where
374− pure = SerialT . singleton
377−------------------------------------------------------------------------------
379------------------------------------------------------------------------------
439------------------------------------------------------------------------------
381−instance (Monad m, Num a) => Num (SerialT m a) where
441+MONAD_APPLICATIVE_INSTANCE(SerialT,)
382− fromInteger n = pure (fromInteger n)
442+MONAD_COMMON_INSTANCES(SerialT,)
383−
443+NUMERIC_COMMON_INSTANCES(SerialT,)
384− negate = fmap negate
386− signum = fmap signum
392−instance (Monad m, Fractional a) => Fractional (SerialT m a) where
393− fromRational n = pure (fromRational n)
399−instance (Monad m, Floating a) => Floating (SerialT m a) where
419− logBase = liftA2 logBase
421------------------------------------------------------------------------------
445------------------------------------------------------------------------------
422-- CoserialT
446-- CoserialT
@@ -453,14 +477,7 @@ instance (Monad m, Floating a) => Floating (SerialT m a) where
453-- streams as it needs to retain state for each unfinished stream.
477-- streams as it needs to retain state for each unfinished stream.
455newtype CoserialT m a = CoserialT {getCoserialT :: Stream m a}
479newtype CoserialT m a = CoserialT {getCoserialT :: Stream m a}
456− deriving (Functor, Monoid, MonadTrans, MonadIO, MonadThrow)
480+ deriving (Functor, MonadTrans)
458−deriving instance MonadParallel m => Alternative (CoserialT m)
459−deriving instance MonadParallel m => MonadPlus (CoserialT m)
460−deriving instance (MonadBase b m, Monad m) => MonadBase b (CoserialT m)
461−deriving instance MonadError e m => MonadError e (CoserialT m)
462−deriving instance MonadReader r m => MonadReader r (CoserialT m)
463−deriving instance MonadState s m => MonadState s (CoserialT m)
465{-# DEPRECATED InterleavedT "Please use 'CoserialT' instead." #-}
482{-# DEPRECATED InterleavedT "Please use 'CoserialT' instead." #-}
466type InterleavedT = CoserialT
483type InterleavedT = CoserialT
@@ -490,6 +507,14 @@ infixr 5 <=>
490(<=>) :: IsStream t => t m a -> t m a -> t m a
507(<=>) :: IsStream t => t m a -> t m a -> t m a
491(<=>) = coserial
508(<=>) = coserial
510+------------------------------------------------------------------------------
512+------------------------------------------------------------------------------
514+instance Monoid (CoserialT m a) where
493------------------------------------------------------------------------------
518------------------------------------------------------------------------------
495------------------------------------------------------------------------------
520------------------------------------------------------------------------------
@@ -503,56 +528,12 @@ instance Monad m => Monad (CoserialT m) where
503 in m Nothing stp single yield
528 in m Nothing stp single yield
505------------------------------------------------------------------------------
530------------------------------------------------------------------------------
506−-- Applicative
531+-- Other instances
507------------------------------------------------------------------------------
532------------------------------------------------------------------------------
509−instance Monad m => Applicative (CoserialT m) where
534+MONAD_APPLICATIVE_INSTANCE(CoserialT,)
510− pure = CoserialT . singleton
535+MONAD_COMMON_INSTANCES(CoserialT,)
511− (<*>) = ap
536+NUMERIC_COMMON_INSTANCES(CoserialT,)
513−------------------------------------------------------------------------------
515−------------------------------------------------------------------------------
517−instance (Monad m, Num a) => Num (CoserialT m a) where
518− fromInteger n = pure (fromInteger n)
520− negate = fmap negate
522− signum = fmap signum
528−instance (Monad m, Fractional a) => Fractional (CoserialT m a) where
529− fromRational n = pure (fromRational n)
535−instance (Monad m, Floating a) => Floating (CoserialT m a) where
555− logBase = liftA2 logBase
557------------------------------------------------------------------------------
538------------------------------------------------------------------------------
558-- CoparallelT
539-- CoparallelT
@@ -600,16 +581,6 @@ instance (Monad m, Floating a) => Floating (CoserialT m a) where
600newtype CoparallelT m a = CoparallelT {getCoparallelT :: Stream m a}
581newtype CoparallelT m a = CoparallelT {getCoparallelT :: Stream m a}
601 deriving (Functor, MonadTrans)
582 deriving (Functor, MonadTrans)
603−deriving instance MonadParallel m => Monoid (CoparallelT m a)
604−deriving instance MonadParallel m => Alternative (CoparallelT m)
605−deriving instance MonadParallel m => MonadPlus (CoparallelT m)
606−deriving instance MonadParallel m => MonadIO (CoparallelT m)
607−deriving instance MonadParallel m => MonadThrow (CoparallelT m)
608−deriving instance (MonadBase b m, MonadParallel m) => MonadBase b (CoparallelT m)
609−deriving instance (MonadError e m, MonadParallel m) => MonadError e (CoparallelT m)
610−deriving instance (MonadReader r m, MonadParallel m) => MonadReader r (CoparallelT m)
611−deriving instance (MonadState s m, MonadParallel m) => MonadState s (CoparallelT m)
613{-# DEPRECATED AsyncT "Please use 'CoparallelT' instead." #-}
584{-# DEPRECATED AsyncT "Please use 'CoparallelT' instead." #-}
614type AsyncT = CoparallelT
585type AsyncT = CoparallelT
@@ -637,6 +608,14 @@ instance MonadParallel m => Semigroup (CoparallelT m a) where
637(<|) :: (IsStream t, MonadParallel m) => t m a -> t m a -> t m a
608(<|) :: (IsStream t, MonadParallel m) => t m a -> t m a -> t m a
638(<|) = coparallel
609(<|) = coparallel
611+------------------------------------------------------------------------------
613+------------------------------------------------------------------------------
615+instance MonadParallel m => Monoid (CoparallelT m a) where
640------------------------------------------------------------------------------
619------------------------------------------------------------------------------
642------------------------------------------------------------------------------
621------------------------------------------------------------------------------
@@ -662,56 +641,12 @@ instance MonadParallel m => Monad (CoparallelT m) where
662 where par = S.joinStreamVar2 (SVarStyle Conjunction LIFO)
641 where par = S.joinStreamVar2 (SVarStyle Conjunction LIFO)
664------------------------------------------------------------------------------
643------------------------------------------------------------------------------
665−-- Applicative
644+-- Other instances
666------------------------------------------------------------------------------
645------------------------------------------------------------------------------
668−instance MonadParallel m => Applicative (CoparallelT m) where
647+MONAD_APPLICATIVE_INSTANCE(CoparallelT,MONADPARALLEL)
669− pure = CoparallelT . singleton
648+MONAD_COMMON_INSTANCES(CoparallelT, MONADPARALLEL)
670− (<*>) = ap
649+NUMERIC_COMMON_INSTANCES(CoparallelT, MONADPARALLEL)
672−------------------------------------------------------------------------------
674−------------------------------------------------------------------------------
676−instance (MonadParallel m, Num a) => Num (CoparallelT m a) where
677− fromInteger n = pure (fromInteger n)
679− negate = fmap negate
681− signum = fmap signum
687−instance (MonadParallel m, Fractional a) => Fractional (CoparallelT m a) where
688− fromRational n = pure (fromRational n)
694−instance (MonadParallel m, Floating a) => Floating (CoparallelT m a) where
714− logBase = liftA2 logBase
716------------------------------------------------------------------------------
651------------------------------------------------------------------------------
717-- ParallelT
652-- ParallelT
@@ -757,16 +692,6 @@ instance (MonadParallel m, Floating a) => Floating (CoparallelT m a) where
757newtype ParallelT m a = ParallelT {getParallelT :: Stream m a}
692newtype ParallelT m a = ParallelT {getParallelT :: Stream m a}
758 deriving (Functor, MonadTrans)
693 deriving (Functor, MonadTrans)
760−deriving instance MonadParallel m => Monoid (ParallelT m a)
761−deriving instance MonadParallel m => Alternative (ParallelT m)
762−deriving instance MonadParallel m => MonadPlus (ParallelT m)
763−deriving instance MonadParallel m => MonadIO (ParallelT m)
764−deriving instance MonadParallel m => MonadThrow (ParallelT m)
765−deriving instance (MonadBase b m, MonadParallel m) => MonadBase b (ParallelT m)
766−deriving instance (MonadError e m, MonadParallel m) => MonadError e (ParallelT m)
767−deriving instance (MonadReader r m, MonadParallel m) => MonadReader r (ParallelT m)
768−deriving instance (MonadState s m, MonadParallel m) => MonadState s (ParallelT m)
770instance IsStream ParallelT where
695instance IsStream ParallelT where
771 toStream = getParallelT
696 toStream = getParallelT
772 fromStream = ParallelT
697 fromStream = ParallelT
@@ -784,6 +709,14 @@ parallel m1 m2 = fromStream $ S.parallel (toStream m1) (toStream m2)
784instance MonadParallel m => Semigroup (ParallelT m a) where
709instance MonadParallel m => Semigroup (ParallelT m a) where
785 (<>) = parallel
710 (<>) = parallel
712+------------------------------------------------------------------------------
714+------------------------------------------------------------------------------
716+instance MonadParallel m => Monoid (ParallelT m a) where
787------------------------------------------------------------------------------
720------------------------------------------------------------------------------
789------------------------------------------------------------------------------
722------------------------------------------------------------------------------
@@ -794,56 +727,12 @@ instance MonadParallel m => Monad (ParallelT m) where
794 where par = S.joinStreamVar2 (SVarStyle Conjunction FIFO)
727 where par = S.joinStreamVar2 (SVarStyle Conjunction FIFO)
796------------------------------------------------------------------------------
729------------------------------------------------------------------------------
797−-- Applicative
730+-- Other instances
798------------------------------------------------------------------------------
731------------------------------------------------------------------------------
800−instance MonadParallel m => Applicative (ParallelT m) where
733+MONAD_APPLICATIVE_INSTANCE(ParallelT,MONADPARALLEL)
801− pure = ParallelT . singleton
734+MONAD_COMMON_INSTANCES(ParallelT, MONADPARALLEL)
802− (<*>) = ap
735+NUMERIC_COMMON_INSTANCES(ParallelT, MONADPARALLEL)
804−------------------------------------------------------------------------------
806−------------------------------------------------------------------------------
808−instance (MonadParallel m, Num a) => Num (ParallelT m a) where
809− fromInteger n = pure (fromInteger n)
811− negate = fmap negate
813− signum = fmap signum
819−instance (MonadParallel m, Fractional a) => Fractional (ParallelT m a) where
820− fromRational n = pure (fromRational n)
826−instance (MonadParallel m, Floating a) => Floating (ParallelT m a) where
846− logBase = liftA2 logBase
848------------------------------------------------------------------------------
737------------------------------------------------------------------------------
849-- Serially Zipping Streams
738-- Serially Zipping Streams
@@ -886,8 +775,6 @@ newtype ZipSerial m a = ZipSerial {getZipSerial :: Stream m a}
886-- | Same as ZipSerial.
775-- | Same as ZipSerial.
887type ZipStream = ZipSerial
776type ZipStream = ZipSerial
889−deriving instance MonadParallel m => Alternative (ZipSerial m)
891instance Monad m => Applicative (ZipSerial m) where
778instance Monad m => Applicative (ZipSerial m) where
892 pure = ZipSerial . S.repeat
779 pure = ZipSerial . S.repeat
893 (<*>) = zipWith id
780 (<*>) = zipWith id
@@ -896,45 +783,7 @@ instance IsStream ZipSerial where
896 toStream = getZipSerial
783 toStream = getZipSerial
897 fromStream = ZipSerial
784 fromStream = ZipSerial
899−instance (Monad m, Num a) => Num (ZipSerial m a) where
786+NUMERIC_COMMON_INSTANCES(ZipSerial,)
900− fromInteger n = pure (fromInteger n)
902− negate = fmap negate
904− signum = fmap signum
910−instance (Monad m, Fractional a) => Fractional (ZipSerial m a) where
911− fromRational n = pure (fromRational n)
917−instance (Monad m, Floating a) => Floating (ZipSerial m a) where
937− logBase = liftA2 logBase
939------------------------------------------------------------------------------
788------------------------------------------------------------------------------
940-- Parallely Zipping Streams
789-- Parallely Zipping Streams
@@ -976,8 +825,6 @@ newtype ZipParallel m a = ZipParallel {getZipParallel :: Stream m a}
976{-# DEPRECATED ZipAsync "Please use ZipParallel instead." #-}
825{-# DEPRECATED ZipAsync "Please use ZipParallel instead." #-}
977type ZipAsync = ZipParallel
826type ZipAsync = ZipParallel
979−deriving instance MonadParallel m => Alternative (ZipParallel m)
981instance MonadParallel m => Applicative (ZipParallel m) where
828instance MonadParallel m => Applicative (ZipParallel m) where
982 pure = ZipParallel . S.repeat
829 pure = ZipParallel . S.repeat
983 (<*>) = zipParallelWith id
830 (<*>) = zipParallelWith id
@@ -986,45 +833,7 @@ instance IsStream ZipParallel where
986 toStream = getZipParallel
833 toStream = getZipParallel
987 fromStream = ZipParallel
834 fromStream = ZipParallel
989−instance (MonadParallel m, Num a) => Num (ZipParallel m a) where
836+NUMERIC_COMMON_INSTANCES(ZipParallel,MONADPARALLEL)
990− fromInteger n = pure (fromInteger n)
992− negate = fmap negate
994− signum = fmap signum
1000−instance (MonadParallel m, Fractional a) => Fractional (ZipParallel m a) where
1001− fromRational n = pure (fromRational n)
1007−instance (MonadParallel m, Floating a) => Floating (ZipParallel m a) where
1027− logBase = liftA2 logBase
1029-------------------------------------------------------------------------------
838-------------------------------------------------------------------------------
1030-- Type adapting combinators
839-- Type adapting combinators