{-# LANGUAGE CPP #-} {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving#-} {-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE UndecidableInstances #-} -- XXX #if __GLASGOW_HASKELL__ >= 800 {-# OPTIONS_GHC -Wno-orphans #-} #endif #include "inline.h" -- | -- Module : Streamly.Streams.Prelude -- Copyright : (c) 2017 Harendra Kumar -- -- License : BSD3 -- Maintainer : harendra.kumar@gmail.com -- Stability : experimental -- Portability : GHC -- -- module Streamly.Streams.Prelude ( -- * Elimination runStream , runStreaming -- deprecated , runStreamT -- deprecated , runInterleavedT -- deprecated , runParallelT -- deprecated , runAsyncT -- deprecated , runZipStream -- deprecated , runZipAsync -- deprecated -- * Fold Utilities , foldWith , foldMapWith , forEachWith ) where import Streamly.Streams.StreamK (IsStream(..)) import Streamly.Streams.Serial (SerialT, WSerialT) import Streamly.Streams.Parallel (ParallelT) import Streamly.Streams.Async (AsyncT) import Streamly.Streams.Zip (ZipSerialM, ZipAsyncM) import qualified Streamly.Streams.StreamD as D import qualified Streamly.Streams.StreamK as K ------------------------------------------------------------------------------ -- Eliminating a stream ------------------------------------------------------------------------------ -- | Run a streaming composition, discard the results. By default it interprets -- the stream as 'SerialT', to run other types of streams use the type adapting -- combinators for example @runStream . 'asyncly'@. -- -- @since 0.2.0 {-# INLINE_EARLY runStream #-} runStream :: Monad m => SerialT m a -> m () runStream m = D.runStream $ D.fromStreamK (toStream m) {-# RULES "runStream fallback to CPS" [1] forall a. D.runStream (D.fromStreamK a) = K.runStream a #-} -- | Same as 'runStream' -- -- @since 0.1.0 {-# DEPRECATED runStreaming "Please use runStream instead." #-} runStreaming :: (Monad m, IsStream t) => t m a -> m () runStreaming = runStream . K.adapt -- | Same as @runStream@. -- -- @since 0.1.0 {-# DEPRECATED runStreamT "Please use runStream instead." #-} runStreamT :: Monad m => SerialT m a -> m () runStreamT = runStream -- | Same as @runStream . wSerially@. -- -- @since 0.1.0 {-# DEPRECATED runInterleavedT "Please use 'runStream . interleaving' instead." #-} runInterleavedT :: Monad m => WSerialT m a -> m () runInterleavedT = runStream . K.adapt -- | Same as @runStream . parallely@. -- -- @since 0.1.0 {-# DEPRECATED runParallelT "Please use 'runStream . parallely' instead." #-} runParallelT :: Monad m => ParallelT m a -> m () runParallelT = runStream . K.adapt -- | Same as @runStream . asyncly@. -- -- @since 0.1.0 {-# DEPRECATED runAsyncT "Please use 'runStream . asyncly' instead." #-} runAsyncT :: Monad m => AsyncT m a -> m () runAsyncT = runStream . K.adapt -- | Same as @runStream . zipping@. -- -- @since 0.1.0 {-# DEPRECATED runZipStream "Please use 'runStream . zipSerially instead." #-} runZipStream :: Monad m => ZipSerialM m a -> m () runZipStream = runStream . K.adapt -- | Same as @runStream . zippingAsync@. -- -- @since 0.1.0 {-# DEPRECATED runZipAsync "Please use 'runStream . zipAsyncly instead." #-} runZipAsync :: Monad m => ZipAsyncM m a -> m () runZipAsync = runStream . K.adapt ------------------------------------------------------------------------------ -- Fold Utilities ------------------------------------------------------------------------------ -- | A variant of 'Data.Foldable.fold' that allows you to fold a 'Foldable' -- container of streams using the specified stream sum operation. -- -- @foldWith 'async' $ map return [1..3]@ -- -- @since 0.1.0 {-# INLINABLE foldWith #-} foldWith :: (IsStream t, Foldable f) => (t m a -> t m a -> t m a) -> f (t m a) -> t m a foldWith f = foldr f K.nil -- | A variant of 'foldMap' that allows you to map a monadic streaming action -- on a 'Foldable' container and then fold it using the specified stream sum -- operation. -- -- @foldMapWith 'async' return [1..3]@ -- -- @since 0.1.0 {-# INLINABLE foldMapWith #-} foldMapWith :: (IsStream t, Foldable f) => (t m b -> t m b -> t m b) -> (a -> t m b) -> f a -> t m b foldMapWith f g = foldr (f . g) K.nil -- | Like 'foldMapWith' but with the last two arguments reversed i.e. the -- monadic streaming function is the last argument. -- -- @since 0.1.0 {-# INLINABLE forEachWith #-} forEachWith :: (IsStream t, Foldable f) => (t m b -> t m b -> t m b) -> f a -> (a -> t m b) -> t m b forEachWith f xs g = foldr (f . g) K.nil xs