-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | an elementary streaming prelude and general stream type. -- -- Streaming.Prelude exports an elementary streaming prelude -- focused on a simple "source" or "producer" type, namely Stream (Of -- a) m r. This is a sort of effectful version of ([a],r) -- in which monadic action is interleaved between successive elements. -- The main module, Streaming, exports a much more general type, -- Stream f m r, which can be used to stream successive distinct -- steps characterized by any functor f, though we are -- here interested only in a limited range of cases. -- -- The streaming-IO libraries have various devices for dealing with -- effectful variants of [a] or ([a],r). But it is only -- with the general type Stream f m r, or some equivalent, that -- one can envisage (for example) the connected streaming of their sorts -- of stream -- as one makes lists of lists in the Haskell -- Prelude and Data.List. One needs some such type if -- we are to express properly streaming equivalents of e.g. -- --
-- group :: Ord a => [a] -> [[a]] -- chunksOf :: Int -> [a] -> [[a]] -- lines :: [Char] -> [[Char]] -- but similarly with bytestring, etc. ---- -- to mention a few obviously desirable operations. But once one grasps -- the iterable stream concept needed to express those functions - to -- wit, Stream f m r or some equivalent - then one will also see -- that, with it, one is already in possession of a complete elementary -- streaming library - since one possesses Stream ((,) a) m r or -- equivalently Stream (Of a) m r. This is the type of a -- 'generator' or 'producer' or whatever you call an effectful stream of -- items. The present Streaming.Prelude is thus the simplest -- streaming library that can replicate anything like the API of the -- Prelude and Data.List. -- -- The emphasis of the library is on interoperation; for the rest its -- advantages are: extreme simplicity and re-use of intuitions the user -- has gathered from mastery of Prelude and Data.List. -- The two conceptual pre-requisites are some comprehension of monad -- transformers and some familiarity with 'rank 2 types'. -- -- See the readme below for an explanation, including the examples -- linked there. Elementary usage can be divined from the ghci examples -- in Streaming.Prelude and perhaps from this rough beginning of -- a tutorial. Note also the streaming bytestring and -- streaming utils packages. Questions about usage can be put -- raised on StackOverflow with the tag [haskell-streaming], or -- as an issue on Github, or on the pipes list (the package -- understands itself as part of the pipes 'ecosystem'.) -- -- The simplest form of interoperation with pipes is accomplished -- with this isomorphism: -- --
-- Pipes.unfoldr Streaming.next :: Stream (Of a) m r -> Producer a m r -- Streaming.unfoldr Pipes.next :: Producer a m r -> Stream (Of a) m r ---- -- Interoperation with io-streams is thus: -- --
-- Streaming.reread IOStreams.read :: InputStream a -> Stream (Of a) IO () -- IOStreams.unfoldM Streaming.uncons :: Stream (Of a) IO () -> IO (InputStream a) ---- -- With conduit one might use, e.g.: -- --
-- Conduit.unfoldM Streaming.uncons :: Stream (Of a) m () -> Source m a -- Streaming.mapM_ Conduit.yield . hoist lift :: Stream (Of o) m r -> ConduitM i o m r -- ($$ Conduit.mapM_ Streaming.yield) . hoist lift :: Source m a -> Stream (Of a) m () ---- -- These conversions should never be more expensive than a single -- >-> or =$=. -- -- Here is a simple example (conceptually it is a bit advanced, maybe) -- that runs a single underlying stream with several streaming-io -- libraries at once, superimposing their effects without any -- accumulation: -- --
-- module Main (main) where -- import Streaming -- import Pipes -- import Data.Conduit -- import qualified Streaming.Prelude as S -- import qualified Data.Conduit.List as CL -- import qualified Pipes.Prelude as P -- import qualified System.IO.Streams as IOS -- import Data.ByteString.Char8 (pack) -- import Data.Function ((&)) -- -- mkConduit = CL.unfoldM S.uncons -- mkPipe = P.unfoldr S.next -- mkIOStream = IOS.unfoldM S.uncons -- -- main = iostreamed where -- urstream = S.take 3 S.readLn :: Stream (Of Int) IO () -- streamed = S.copy urstream & S.map (\n -> "streaming says: " ++ show n) -- & S.stdoutLn -- piped = runEffect $ -- mkPipe (S.copy streamed) >-> P.map (\n -> "pipes says: " ++ show n) -- >-> P.stdoutLn -- conduited = -- mkConduit (S.copy piped) $$ CL.map (\n -> "conduit says: " ++ show n) -- =$ CL.mapM_ (liftIO . putStrLn) -- iostreamed = do -- str0 <- mkIOStream conduited -- str1 <- IOS.map (\n -> pack $ "io-streams says: " ++ show n ++ "\n") str0 -- IOS.supply str1 IOS.stdout ---- -- This program successively parses three Ints from standard -- input, and simulaneously passes them to (here trivial) -- stream-consuming processes from four different libraries, using the -- copy function from Streaming.Prelude. I mark my own -- input with <Enter> below: -- --
-- >>> main -- 1 <Enter> -- streaming says: 1 -- pipes says: 1 -- conduit says: 1 -- io-streams says: 1 -- 2 <Enter> -- streaming says: 2 -- pipes says: 2 -- conduit says: 2 -- io-streams says: 2 -- 3 <Enter> -- streaming says: 3 -- pipes says: 3 -- conduit says: 3 -- io-streams says: 3 -- >>> ---- -- Of course, I could as well have passed the stream to several -- independent conduits; and I might have derived the original stream -- from a conduit Source or pipes Producer etc., using -- one of the 'conversion' functions above. Further points of comparison -- with the going streaming-IO libraries are discussed in the -- readme below. -- -- Here are the results of some microbenchmarks based on the -- benchmarks included in the machines package: -- -- -- Because these are microbenchmarks for individual functions, they -- represent a sort of "worst case"; many other factors can influence the -- speed of a complex program. @package streaming @version 0.1.4.1 module Streaming.Internal data Stream f m r Step :: !(f (Stream f m r)) -> Stream f m r Effect :: (m (Stream f m r)) -> Stream f m r Return :: r -> Stream f m r -- | Build a Stream by unfolding steps starting from a seed. See -- also the specialized unfoldr in the prelude. -- --
-- unfold inspect = id -- modulo the quotient we work with -- unfold Pipes.next :: Monad m => Producer a m r -> Stream ((,) a) m r -- unfold (curry (:>) . Pipes.next) :: Monad m => Producer a m r -> Stream (Of a) m r --unfold :: (Monad m, Functor f) => (s -> m (Either r (f s))) -> s -> Stream f m r -- | Repeat a functorial layer, command or instruction a fixed number of -- times. -- --
-- replicates n = takes n . repeats --replicates :: (Monad m, Functor f) => Int -> f () -> Stream f m () -- | Repeat a functorial layer (a "command" or "instruction") forever. repeats :: (Monad m, Functor f) => f () -> Stream f m r -- | Repeat an effect containing a functorial layer, command or instruction -- forever. repeatsM :: (Monad m, Functor f) => m (f ()) -> Stream f m r -- | Wrap an effect that returns a stream -- --
-- effect = join . lift --effect :: (Monad m, Functor f) => m (Stream f m r) -> Stream f m r wrap :: (Monad m, Functor f) => f (Stream f m r) -> Stream f m r -- | yields is like lift for items in the streamed -- functor. It makes a singleton or one-layer succession. -- --
-- lift :: (Monad m, Functor f) => m r -> Stream f m r -- yields :: (Monad m, Functor f) => f r -> Stream f m r ---- -- Viewed in another light, it is like a functor-general version of -- yield: -- --
-- S.yield a = yields (a :> ()) --yields :: (Monad m, Functor f) => f r -> Stream f m r -- | Reflect a church-encoded stream; cp. GHC.Exts.build -- --
-- streamFold return_ effect_ step_ (streamBuild psi) = psi return_ effect_ step_ --streamBuild :: (forall b. (r -> b) -> (m b -> b) -> (f b -> b) -> b) -> Stream f m r -- | Construct an infinite stream by cycling a finite one -- --
-- cycles = forever ---- --
-- >>> --cycles :: (Monad m, Functor f) => Stream f m () -> Stream f m r delays :: (MonadIO m, Applicative f) => Double -> Stream f m r -- | never interleaves the pure applicative action with the return -- of the monad forever. It is the empty of the Alternative -- instance, thus -- --
-- never <|> a = a -- a <|> never = a ---- -- and so on. If w is a monoid then never :: Stream (Of w) m r -- is the infinite sequence of mempty, and str1 <|> -- str2 appends the elements monoidally until one of streams ends. -- Thus we have, e.g. -- --
-- >>> S.stdoutLn $ S.take 2 $ S.stdinLn <|> S.repeat " " <|> S.stdinLn <|> S.repeat " " <|> S.stdinLn -- 1<Enter> -- 2<Enter> -- 3<Enter> -- 1 2 3 -- 4<Enter> -- 5<Enter> -- 6<Enter> -- 4 5 6 ---- -- This is equivalent to -- --
-- >>> S.stdoutLn $ S.take 2 $ foldr (<|>) never [S.stdinLn, S.repeat " ", S.stdinLn, S.repeat " ", S.stdinLn ] ---- -- Where f is a monad, (<|>) sequences the -- conjoined streams stepwise. See the definition of paste -- here, where the separate steps are bytestreams corresponding to -- the lines of a file. -- -- Given, say, -- --
-- data Branch r = Branch r r deriving Functor -- add obvious applicative instance ---- -- then never :: Stream Branch Identity r is the pure infinite -- binary tree with (inaccessible) rs in its leaves. Given two -- binary trees, tree1 <|> tree2 intersects them, -- preserving the leaves that came first, so tree1 <|> never = -- tree1 -- -- Stream Identity m r is an action in m that is -- indefinitely delayed. Such an action can be constructed with e.g. -- untilJust. -- --
-- untilJust :: (Monad m, Applicative f) => m (Maybe r) -> Stream f m r ---- -- Given two such items, <|> instance races them. It is -- thus the iterative monad transformer specially defined in -- Control.Monad.Trans.Iter -- -- So, for example, we might write -- --
-- >>> let justFour str = if length str == 4 then Just str else Nothing -- -- >>> let four = untilJust (liftM justFour getLine) -- -- >>> run four -- one<Enter> -- two<Enter> -- three<Enter> -- four<Enter> -- "four" ---- -- The Alternative instance in Control.Monad.Trans.Free is -- avowedly wrong, though no explanation is given for this. never :: (Monad m, Applicative f) => Stream f m r -- | Repeat a untilJust :: (Monad m, Applicative f) => m (Maybe r) -> Stream f m r -- | Interpolate a layer at each segment. This specializes to e.g. -- --
-- intercalates :: (Monad m, Functor f) => Stream f m () -> Stream (Stream f m) m r -> Stream f m r --intercalates :: (Monad m, Monad (t m), MonadTrans t) => t m x -> Stream (t m) m r -> t m r -- | Dissolves the segmentation into layers of Stream f m layers. concats :: (Monad m, Functor f) => Stream (Stream f m) m r -> Stream f m r -- | Specialized fold following the usage of -- Control.Monad.Trans.Free -- --
-- iterT alg = streamFold return join alg --iterT :: (Functor f, Monad m) => (f (m a) -> m a) -> Stream f m a -> m a -- | Specialized fold following the usage of -- Control.Monad.Trans.Free -- --
-- iterTM alg = streamFold return (join . lift) --iterTM :: (Functor f, Monad m, MonadTrans t, Monad (t m)) => (f (t m a) -> t m a) -> Stream f m a -> t m a -- | Map a stream directly to its church encoding; compare -- Data.List.foldr destroy :: (Functor f, Monad m) => Stream f m r -> (f b -> b) -> (m b -> b) -> (r -> b) -> b -- | streamFold reorders the arguments of destroy to be more -- akin to foldr It is more convenient to query in ghci to -- figure out what kind of 'algebra' you need to write. -- --
-- >>> :t streamFold return join -- (Monad m, Functor f) => -- (f (m a) -> m a) -> Stream f m a -> m a -- iterT ---- --
-- >>> :t streamFold return (join . lift) -- (Monad m, Monad (t m), Functor f, MonadTrans t) => -- (f (t m a) -> t m a) -> Stream f m a -> t m a -- iterTM ---- --
-- >>> :t streamFold return effect -- (Monad m, Functor f, Functor g) => -- (f (Stream g m r) -> Stream g m r) -> Stream f m r -> Stream g m r ---- --
-- >>> :t \f -> streamFold return effect (wrap . f) -- (Monad m, Functor f, Functor g) => -- (f (Stream g m a) -> g (Stream g m a)) -- -> Stream f m a -> Stream g m a -- maps ---- --
-- >>> :t \f -> streamFold return effect (effect . liftM wrap . f) -- (Monad m, Functor f, Functor g) => -- (f (Stream g m a) -> m (g (Stream g m a))) -- -> Stream f m a -> Stream g m a -- mapped --streamFold :: (Functor f, Monad m) => (r -> b) -> (m b -> b) -> (f b -> b) -> Stream f m r -> b -- | Inspect the first stage of a freely layered sequence. Compare -- Pipes.next and the replica Streaming.Prelude.next. -- This is the uncons for the general unfold. -- --
-- unfold inspect = id -- Streaming.Prelude.unfoldr StreamingPrelude.next = id --inspect :: (Functor f, Monad m) => Stream f m r -> m (Either r (f (Stream f m r))) -- | Map layers of one functor to another with a transformation. Compare -- hoist, which has a similar effect on the monadic parameter. -- --
-- maps id = id -- maps f . maps g = maps (f . g) --maps :: (Monad m, Functor f) => (forall x. f x -> g x) -> Stream f m r -> Stream g m r -- | Map layers of one functor to another with a transformation involving -- the base monad maps is more fundamental than mapsM, -- which is best understood as a convenience for effecting this frequent -- composition: -- --
-- mapsM phi = decompose . maps (Compose . phi) ---- -- The streaming prelude exports the same function under the better name -- mapped, which overlaps with the lens libraries. mapsM :: (Monad m, Functor f) => (forall x. f x -> m (g x)) -> Stream f m r -> Stream g m r -- | Rearrange a succession of layers of the form Compose m (f x). -- -- we could as well define decompose by mapsM: -- --
-- decompose = mapped getCompose ---- -- but mapped is best understood as: -- --
-- mapped phi = decompose . maps (Compose . phi) ---- -- since maps and hoist are the really fundamental -- operations that preserve the shape of the stream: -- --
-- maps :: (Monad m, Functor f) => (forall x. f x -> g x) -> Stream f m r -> Stream g m r -- hoist :: (Monad m, Functor f) => (forall a. m a -> n a) -> Stream f m r -> Stream f n r --decompose :: (Monad m, Functor f) => Stream (Compose m f) m r -> Stream f m r -- | Map each layer to an effect, and run them all. mapsM_ :: (Functor f, Monad m) => (forall x. f x -> m x) -> Stream f m r -> m r -- | Run the effects in a stream that merely layers effects. run :: Monad m => Stream m m r -> m r -- | Make it possible to 'run' the underlying transformed monad. distribute :: (Monad m, Functor f, MonadTrans t, MFunctor t, Monad (t (Stream f m))) => Stream f (t m) r -> t (Stream f m) r -- | Group layers in an alternating stream into adjoining sub-streams of -- one type or another. groups :: (Monad m, Functor f, Functor g) => Stream (Sum f g) m r -> Stream (Sum (Stream f m) (Stream g m)) m r -- | Break a stream into substreams each with n functorial layers. -- --
-- >>> S.print $ mapped S.sum $ chunksOf 2 $ each [1,1,1,1,1] -- 2 -- 2 -- 1 --chunksOf :: (Monad m, Functor f) => Int -> Stream f m r -> Stream (Stream f m) m r -- | Split a succession of layers after some number, returning a streaming -- or effectful pair. -- --
-- >>> rest <- S.print $ S.splitAt 1 $ each [1..3] -- 1 -- -- >>> S.print rest -- 2 -- 3 ---- --
-- splitAt 0 = return -- splitAt n >=> splitAt m = splitAt (m+n) ---- -- Thus, e.g. -- --
-- >>> rest <- S.print $ splitsAt 2 >=> splitsAt 2 $ each [1..5] -- 1 -- 2 -- 3 -- 4 -- -- >>> S.print rest -- 5 --splitsAt :: (Monad m, Functor f) => Int -> Stream f m r -> Stream f m (Stream f m r) takes :: (Monad m, Functor f) => Int -> Stream f m r -> Stream f m () cutoff :: (Monad m, Functor f) => Int -> Stream f m r -> Stream f m (Maybe r) zipsWith :: (Monad m, Functor h) => (forall x y. f x -> g y -> h (x, y)) -> Stream f m r -> Stream g m r -> Stream h m r zips :: (Monad m, Functor f, Functor g) => Stream f m r -> Stream g m r -> Stream (Compose f g) m r unzips :: (Monad m, Functor f, Functor g) => Stream (Compose f g) m r -> Stream f (Stream g m) r -- | Interleave functor layers, with the effects of the first preceding the -- effects of the second. -- --
-- interleaves = zipsWith (liftA2 (,)) ---- --
-- >>> let paste = \a b -> interleaves (Q.lines a) (maps (Q.cons' '\t') (Q.lines b)) -- -- >>> Q.stdout $ Q.unlines $ paste "hello\nworld\n" "goodbye\nworld\n" -- hello goodbye -- world world --interleaves :: (Monad m, Applicative h) => Stream h m r -> Stream h m r -> Stream h m r -- | Given a stream on a sum of functors, make it a stream on the left -- functor, with the streaming on the other functor as the governing -- monad. This is useful for acting on one or the other functor with a -- fold. It generalizes partitionEithers massively, but actually -- streams properly. -- --
-- >>> let odd_even = S.maps (S.distinguish even) $ S.each [1..10::Int] -- -- >>> :t separate odd_even -- separate odd_even -- :: Monad m => Stream (Of Int) (Stream (Of Int) m) () ---- -- Now, for example, it is convenient to fold on the left and right -- values separately: -- --
-- >>> S.toList $ S.toList $ separate odd_even -- [2,4,6,8,10] :> ([1,3,5,7,9] :> ()) ---- -- Or we can write them to separate files or whatever: -- --
-- >>> runResourceT $ S.writeFile "even.txt" . S.show $ S.writeFile "odd.txt" . S.show $ S.separate odd_even -- -- >>> :! cat even.txt -- 2 -- 4 -- 6 -- 8 -- 10 -- -- >>> :! cat odd.txt -- 1 -- 3 -- 5 -- 7 -- 9 ---- -- Of course, in the special case of Stream (Of a) m r, we can -- achieve the above effects more simply by using copy -- --
-- >>> S.toList . S.filter even $ S.toList . S.filter odd $ S.copy $ each [1..10::Int] -- [2,4,6,8,10] :> ([1,3,5,7,9] :> ()) ---- -- But separate and unseparate are functor-general. separate :: (Monad m, Functor f, Functor g) => Stream (Sum f g) m r -> Stream f (Stream g m) r unseparate :: (Monad m, Functor f, Functor g) => Stream f (Stream g m) r -> Stream (Sum f g) m r -- | Swap the order of functors in a sum of functors. -- --
-- >>> S.toListM' $ S.print $ separate $ maps S.switch $ maps (S.distinguish (=='a')) $ S.each "banana" -- 'a' -- 'a' -- 'a' -- "bnn" :> () -- -- >>> S.toListM' $ S.print $ separate $ maps (S.distinguish (=='a')) $ S.each "banana" -- 'b' -- 'n' -- 'n' -- "aaa" :> () --switch :: Sum f g r -> Sum g f r bracketStream :: (Functor f, MonadResource m) => IO a -> (a -> IO ()) -> (a -> Stream f m b) -> Stream f m b -- | This is akin to the observe of Pipes.Internal . It -- reeffects the layering in instances of Stream f m r so that -- it replicates that of FreeT. unexposed :: (Functor f, Monad m) => Stream f m r -> Stream f m r hoistExposed :: (Monad m1, Functor f) => (m1 (Stream f m r) -> m (Stream f m r)) -> Stream f m1 r -> Stream f m r mapsExposed :: (Monad m, Functor f) => (forall x. f x -> g x) -> Stream f m r -> Stream g m r mapsMExposed :: (Monad m, Functor f1) => (f1 (Stream f m r) -> m (f (Stream f m r))) -> Stream f1 m r -> Stream f m r destroyExposed :: (Monad m, Functor f) => Stream f m t -> (f b -> b) -> (m b -> b) -> (t -> b) -> b instance (GHC.Show.Show r, GHC.Show.Show (m (Streaming.Internal.Stream f m r)), GHC.Show.Show (f (Streaming.Internal.Stream f m r))) => GHC.Show.Show (Streaming.Internal.Stream f m r) instance (GHC.Classes.Eq r, GHC.Classes.Eq (m (Streaming.Internal.Stream f m r)), GHC.Classes.Eq (f (Streaming.Internal.Stream f m r))) => GHC.Classes.Eq (Streaming.Internal.Stream f m r) instance (Data.Typeable.Internal.Typeable f, Data.Typeable.Internal.Typeable m, Data.Data.Data r, Data.Data.Data (m (Streaming.Internal.Stream f m r)), Data.Data.Data (f (Streaming.Internal.Stream f m r))) => Data.Data.Data (Streaming.Internal.Stream f m r) instance (GHC.Base.Functor f, GHC.Base.Monad m) => GHC.Base.Functor (Streaming.Internal.Stream f m) instance (GHC.Base.Functor f, GHC.Base.Monad m) => GHC.Base.Monad (Streaming.Internal.Stream f m) instance (GHC.Base.Functor f, GHC.Base.Monad m) => GHC.Base.Applicative (Streaming.Internal.Stream f m) instance (GHC.Base.Applicative f, GHC.Base.Monad m) => GHC.Base.Alternative (Streaming.Internal.Stream f m) instance (GHC.Base.Applicative f, GHC.Base.Monad m) => GHC.Base.MonadPlus (Streaming.Internal.Stream f m) instance GHC.Base.Functor f => Control.Monad.Trans.Class.MonadTrans (Streaming.Internal.Stream f) instance GHC.Base.Functor f => Control.Monad.Morph.MFunctor (Streaming.Internal.Stream f) instance GHC.Base.Functor f => Control.Monad.Morph.MMonad (Streaming.Internal.Stream f) instance (Control.Monad.IO.Class.MonadIO m, GHC.Base.Functor f) => Control.Monad.IO.Class.MonadIO (Streaming.Internal.Stream f m) instance (Control.Monad.Base.MonadBase b m, GHC.Base.Functor f) => Control.Monad.Base.MonadBase b (Streaming.Internal.Stream f m) instance (Control.Monad.Catch.MonadThrow m, GHC.Base.Functor f) => Control.Monad.Catch.MonadThrow (Streaming.Internal.Stream f m) instance (Control.Monad.Catch.MonadCatch m, GHC.Base.Functor f) => Control.Monad.Catch.MonadCatch (Streaming.Internal.Stream f m) instance (Control.Monad.Trans.Resource.Internal.MonadResource m, GHC.Base.Functor f) => Control.Monad.Trans.Resource.Internal.MonadResource (Streaming.Internal.Stream f m) instance (GHC.Base.Functor f, Control.Monad.Reader.Class.MonadReader r m) => Control.Monad.Reader.Class.MonadReader r (Streaming.Internal.Stream f m) instance (GHC.Base.Functor f, Control.Monad.State.Class.MonadState s m) => Control.Monad.State.Class.MonadState s (Streaming.Internal.Stream f m) instance (GHC.Base.Functor f, Control.Monad.Error.Class.MonadError e m) => Control.Monad.Error.Class.MonadError e (Streaming.Internal.Stream f m) -- | This module is very closely modeled on Pipes.Prelude, Pipes.Group and -- Pipes.Parse. It maybe said to give independent expression to the -- conception of Producer manipulation articulated in the latter two -- modules. Because we dispense with piping and conduiting, the -- distinction between all of these modules collapses. The leading type -- is chosen to permit an api that is as close as possible to that of -- Data.List and the Prelude. -- -- Import qualified thus: -- --
-- import Streaming -- import qualified Streaming.Prelude as S ---- -- For the examples below, one sometimes needs -- --
-- import Streaming.Prelude (each, yield, next, mapped, stdoutLn, stdinLn) -- import Data.Function ((&)) ---- -- Other libraries that come up in passing are -- --
-- import qualified Control.Foldl as L -- cabal install foldl -- import qualified Pipes as P -- import qualified Pipes.Prelude as P -- import qualified System.IO as IO ---- -- Here are some correspondences between the types employed here and -- elsewhere: -- --
-- streaming | pipes | conduit | io-streams -- ------------------------------------------------------------------------------------------------------------------- -- Stream (Of a) m () | Producer a m () | Source m a | InputStream a -- | ListT m a | ConduitM () o m () | Generator r () -- ------------------------------------------------------------------------------------------------------------------- -- Stream (Of a) m r | Producer a m r | ConduitM () o m r | Generator a r -- ------------------------------------------------------------------------------------------------------------------- -- Stream (Of a) m (Stream (Of a) m r) | Producer a m (Producer a m r) | -- -------------------------------------------------------------------------------------------------------------------- -- Stream (Stream (Of a) m) r | FreeT (Producer a m) m r | -- -------------------------------------------------------------------------------------------------------------------- -- -------------------------------------------------------------------------------------------------------------------- -- ByteString m () | Producer ByteString m () | Source m ByteString | InputStream ByteString -- -------------------------------------------------------------------------------------------------------------------- --module Streaming.Prelude -- | A left-strict pair; the base functor for streams of individual -- elements. data Of a b (:>) :: !a -> b -> Of a b -- | A singleton stream -- --
-- >>> stdoutLn $ yield "hello" -- hello ---- --
-- >>> S.sum $ do {yield 1; yield 2}
-- 3
--
--
--
-- >>> let prompt = putStrLn "Enter a number:"
--
-- >>> let number = lift (prompt >> readLn) >>= yield :: Stream (Of Int) IO ()
--
-- >>> S.toList $ do {number; number; number}
-- Enter a number:
-- 1
-- Enter a number:
-- 2
-- Enter a number:
-- 3
-- [1,2,3] :> ()
--
yield :: Monad m => a -> Stream (Of a) m ()
-- | Stream the elements of a pure, foldable container.
--
-- -- >>> S.print $ each [1..3] -- 1 -- 2 -- 3 -- -- >>> S.print $ mapped S.toList $ chunksOf 3 $ S.replicateM 5 getLine -- s<Enter> -- t<Enter> -- u<Enter> -- ["s","t","u"] -- v<Enter> -- w<Enter> -- ["v","w"] --each :: (Monad m, Foldable f) => f a -> Stream (Of a) m () each' :: (Monad m, Foldable f) => f a -> Stream (Of a) m () -- | Build a Stream by unfolding steps starting from a seed. -- -- The seed can of course be anything, but this is one natural way to -- consume a pipes Producer. Consider: -- --
-- >>> S.stdoutLn $ S.take 2 $ S.unfoldr P.next P.stdinLn -- hello<Enter> -- hello -- goodbye<Enter> -- goodbye ---- --
-- >>> S.stdoutLn $ S.unfoldr P.next (P.stdinLn P.>-> P.take 2) -- hello<Enter> -- hello -- goodbye<Enter> -- goodbye ---- --
-- >>> S.effects $ S.unfoldr P.next (P.stdinLn P.>-> P.take 2 P.>-> P.stdoutLn) -- hello<Enter> -- hello -- goodbye<Enter> -- goodbye --unfoldr :: Monad m => (s -> m (Either r (a, s))) -> s -> Stream (Of a) m r -- | View standard input as a 'Stream (Of String) m r'. stdoutLn, by -- contrast, renders a 'Stream (Of String) m r' to standard output. The -- names follow Pipes.Prelude -- --
-- >>> stdoutLn stdinLn -- hello<Enter> -- hello -- world<Enter> -- world -- ^CInterrupted. ---- --
-- >>> stdoutLn $ S.map reverse stdinLn -- hello<Enter> -- olleh -- world<Enter> -- dlrow -- ^CInterrupted. --stdinLn :: MonadIO m => Stream (Of String) m () -- | Read values from stdin, ignoring failed parses -- --
-- >>> S.sum_ $ S.take 2 S.readLn :: IO Int -- 10<Enter> -- 12<Enter> -- 22 ---- --
-- >>> S.toList $ S.take 3 (S.readLn :: Stream (Of Int) IO ()) -- 1<Enter> -- 2<Enter> -- 1@#$%^&*\<Enter> -- 3<Enter> -- [1,2,3] :> () --readLn :: (MonadIO m, Read a) => Stream (Of a) m () -- | Read Strings from a Handle using hGetLine -- -- Terminates on end of input -- --
-- >>> IO.withFile "/usr/share/dict/words" IO.ReadMode $ S.stdoutLn . S.take 3 . S.drop 50000 . S.fromHandle -- deflagrator -- deflate -- deflation --fromHandle :: MonadIO m => Handle -> Stream (Of String) m () -- | Read the lines of a file as Haskell Strings -- --
-- >>> runResourceT $ S.writeFile "lines.txt" $ S.take 2 S.stdinLn -- hello<Enter> -- world<Enter> -- -- >>> runResourceT $ S.print $ S.readFile "lines.txt" -- "hello" -- "world" ---- -- runResourceT, as it is used here, means something like -- closing_all_handles. It makes it possible to write -- convenient, fairly sensible versions of readFile, -- writeFile and appendFile. IO.withFile IO.ReadMode -- ... is more complicated but is generally to be preferred. Its use -- is explained here. readFile :: MonadResource m => FilePath -> Stream (Of String) m () -- | Iterate a pure function from a seed value, streaming the results -- forever iterate :: Monad m => (a -> a) -> a -> Stream (Of a) m r -- | Iterate a monadic function from a seed value, streaming the results -- forever iterateM :: Monad m => (a -> m a) -> m a -> Stream (Of a) m r -- | Repeat an element ad inf. . -- --
-- >>> S.print $ S.take 3 $ S.repeat 1 -- 1 -- 1 -- 1 --repeat :: Monad m => a -> Stream (Of a) m r -- | Repeat a monadic action ad inf., streaming its results. -- --
-- >>> S.toList $ S.take 2 $ repeatM getLine -- one<Enter> -- two<Enter> -- ["one","two"] --repeatM :: Monad m => m a -> Stream (Of a) m r -- | Repeat an element several times replicate :: Monad m => Int -> a -> Stream (Of a) m () untilRight :: Monad m => m (Either a r) -> Stream (Of a) m r -- | Cycle repeatedly through the layers of a stream, ad inf. This -- function is functor-general -- --
-- cycle = forever ---- --
-- >>> rest <- S.print $ S.splitAt 3 $ S.cycle (yield 0 >> yield 1) -- True -- False -- True -- -- >>> S.print $ S.take 3 rest -- False -- True -- False --cycle :: (Monad m, Functor f) => Stream f m r -> Stream f m s -- | Repeat an action several times, streaming the results. -- --
-- >>> S.print $ S.replicateM 2 getCurrentTime -- 2015-08-18 00:57:36.124508 UTC -- 2015-08-18 00:57:36.124785 UTC --replicateM :: Monad m => Int -> m a -> Stream (Of a) m () -- | An infinite stream of enumerable values, starting from a given value. -- It is the same as `S.iterate succ`. Because their return type is -- polymorphic, enumFrom and enumFromThen (and -- iterate are useful for example with zip and -- zipWith, which require the same return type in the zipped -- streams. With each [1..] the following bit of -- connect-and-resume would be impossible: -- --
-- >>> rest <- S.print $ S.zip (S.enumFrom 'a') $ S.splitAt 3 $ S.enumFrom 1
-- ('a',1)
-- ('b',2)
-- ('c',3)
--
-- >>> S.print $ S.take 3 rest
-- 4
-- 5
-- 6
--
enumFrom :: (Monad m, Enum n) => n -> Stream (Of n) m r
-- | An infinite sequence of enumerable values at a fixed distance,
-- determined by the first and second values. See the discussion of
-- enumFrom
--
-- -- >>> S.print $ S.take 3 $ S.enumFromThen 100 200 -- 100 -- 200 -- 300 --enumFromThen :: (Monad m, Enum a) => a -> a -> Stream (Of a) m r -- | Streams the number of seconds from the beginning of action -- -- Thus, to mark times of user input we might write something like: -- --
-- >>> S.toList $ S.take 3 $ S.zip S.seconds S.stdinLn -- a<Enter> -- b<Enter> -- c<Enter> -- [(0.0,"a"),(1.088711,"b"),(3.7289649999999996,"c")] :> () ---- -- To restrict user input to some number of seconds, we might write: -- --
-- >>> S.toList $ S.map fst $ S.zip S.stdinLn $ S.takeWhile (< 3) S.seconds -- one<Enter> -- two<Enter> -- three<Enter> -- four<Enter> -- five<Enter> -- ["one","two","three","four","five"] :> () ---- -- This is of course does not interrupt an action that has already begun. seconds :: Stream (Of Double) IO r -- | Write Strings to stdout using putStrLn; -- terminates on a broken output pipe (This operation is modelled on -- stdoutLn). -- --
-- >>> S.stdoutLn $ S.take 3 $ S.each $ words "one two three four five" -- one -- two -- three --stdoutLn :: MonadIO m => Stream (Of String) m () -> m () -- | Write Strings to stdout using putStrLn -- -- This does not handle a broken output pipe, but has a polymorphic -- return value, which makes this possible: -- --
-- >>> rest <- S.stdoutLn' $ S.show $ S.splitAt 3 (each [1..5]) -- 1 -- 2 -- 3 -- -- >>> S.print rest -- 4 -- 5 --stdoutLn' :: MonadIO m => Stream (Of String) m r -> m r -- | Reduce a stream to its return value with a monadic action. -- --
-- >>> S.mapM_ Prelude.print $ each [1..5] -- 1 -- 2 -- 3 -- 4 -- 5 -- -- >>> rest <- S.mapM_ Prelude.print $ S.splitAt 3 $ each [1..10] -- 1 -- 2 -- 3 -- -- >>> S.sum rest -- 49 :> () --mapM_ :: Monad m => (a -> m b) -> Stream (Of a) m r -> m r -- | Print the elements of a stream as they arise. -- --
-- >>> S.print $ S.take 2 S.stdinLn -- hello -- "hello" -- world -- "world" -- -- >>> --print :: (MonadIO m, Show a) => Stream (Of a) m r -> m r -- | Write a succession of strings to a handle as separate lines. -- --
-- >>> S.toHandle IO.stdout $ each $ words "one two three" -- one -- two -- three --toHandle :: MonadIO m => Handle -> Stream (Of String) m r -> m r -- | Write a series of strings as lines to a file. The handle is crudely -- managed with ResourceT: -- --
-- >>> runResourceT $ S.writeFile "lines.txt" $ S.take 2 S.stdinLn -- hello<Enter> -- world<Enter> -- -- >>> runResourceT $ S.print $ S.readFile "lines.txt" -- "hello" -- "world" --writeFile :: MonadResource m => FilePath -> Stream (Of String) m r -> m r -- | Take either the first item in a stream or the return value, if it is -- empty. The typical mark of an infinite stream is a polymorphic return -- value; in that case, first is a sort of safeHead -- -- To iterate an action returning a Maybe, until it succeeds. first :: Monad m => Stream (Of r) m r -> m r -- | Reduce a stream, performing its actions but ignoring its elements. -- --
-- >>> rest <- S.effects $ S.splitAt 2 $ each [1..5] -- -- >>> S.print rest -- 3 -- 4 -- 5 -- 'effects' should be understood together with 'copy' and is subject to the rules ---- --
-- S.effects . S.copy = id -- hoist S.effects . S.copy = id ---- -- The similar effects and copy operations in -- Data.ByteString.Streaming obey the same rules. effects :: Monad m => Stream (Of a) m r -> m r -- | Remove the elements from a stream of values, retaining the structure -- of layers. erase :: Monad m => Stream (Of a) m r -> Stream Identity m r -- | Where a transformer returns a stream, run the effects of the stream, -- keeping the return value. This is usually used at the type -- --
-- drained :: Monad m => Stream (Of a) m (Stream (Of b) m r) -> Stream (Of a) m r -- drained = join . fmap (lift . effects) ---- -- Here, for example, we split a stream in two places and throw out the -- middle segment: -- --
-- >>> rest <- S.print $ S.drained $ S.splitAt 2 $ S.splitAt 5 $ each [1..7] -- 1 -- 2 -- -- >>> S.print rest -- 6 -- 7 ---- -- In particular, we can define versions of take and -- takeWhile which retrieve the return value of the rest of the -- stream - and which can thus be used with maps: -- --
-- take' n = S.drained . S.splitAt n -- takeWhile' thus = S.drained . S.span thus --drained :: (Monad m, Monad (t m), Functor (t m), MonadTrans t) => t m (Stream (Of a) m r) -> t m r -- | Standard map on the elements of a stream. -- --
-- >>> S.stdoutLn $ S.map reverse $ each (words "alpha beta") -- ahpla -- ateb --map :: Monad m => (a -> b) -> Stream (Of a) m r -> Stream (Of b) m r -- | Replace each element of a stream with the result of a monadic action -- --
-- >>> S.print $ S.mapM readIORef $ S.chain (\ior -> modifyIORef ior (*100)) $ S.mapM newIORef $ each [1..6] -- 100 -- 200 -- 300 -- 400 -- 500 -- 600 --mapM :: Monad m => (a -> m b) -> Stream (Of a) m r -> Stream (Of b) m r -- | Map layers of one functor to another with a transformation. Compare -- hoist, which has a similar effect on the monadic parameter. -- --
-- maps id = id -- maps f . maps g = maps (f . g) --maps :: (Monad m, Functor f) => (forall x. f x -> g x) -> Stream f m r -> Stream g m r -- | Map layers of one functor to another with a transformation involving -- the base monad. This could be trivial, e.g. -- --
-- let noteBeginning text x = putStrLn text >> return text ---- -- this puts the is completely functor-general -- -- maps and mapped obey these rules: -- --
-- maps id = id -- mapped return = id -- maps f . maps g = maps (f . g) -- mapped f . mapped g = mapped (f <=< g) -- maps f . mapped g = mapped (liftM f . g) -- mapped f . maps g = mapped (f <=< liftM g) ---- -- maps is more fundamental than mapped, which is best -- understood as a convenience for effecting this frequent composition: -- --
-- mapped phi = decompose . maps (Compose . phi) --mapped :: (Monad m, Functor f) => (forall x. f x -> m (g x)) -> Stream f m r -> Stream g m r -- | for replaces each element of a stream with an associated -- stream. Note that the associated stream may layer any functor. for :: (Monad m, Functor f) => Stream (Of a) m r -> (a -> Stream f m x) -> Stream f m r -- | Replace each element in a stream of individual Haskell values (a -- Stream (Of a) m r) with an associated functorial -- step. -- --
-- for str f = concats (with str f) -- with str f = for str (yields . f) -- with str f = maps (\(a:>r) -> r <$ f a) str -- with = flip subst -- subst = flip with ---- --
-- >>> with (each [1..3]) (yield . show) & intercalates (yield "--") & S.stdoutLn -- 1 -- -- -- 2 -- -- -- 3 --with :: (Monad m, Functor f) => Stream (Of a) m r -> (a -> f x) -> Stream f m r -- | Replace each element in a stream of individual values with a -- functorial layer of any sort. subst = flip with and is more -- convenient in a sequence of compositions that transform a stream. -- --
-- with = flip subst -- for str f = concats $ subst f str -- subst f = maps (\(a:>r) -> r <$ f a) -- S.concat = concats . subst each --subst :: (Monad m, Functor f) => (a -> f x) -> Stream (Of a) m r -> Stream f m r -- | Duplicate the content of stream, so that it can be acted on twice in -- different ways, but without breaking streaming. Thus, with each -- [1,2] I might do: -- --
-- >>> S.print $ each ["one","two"] -- "one" -- "two" -- -- >>> S.stdoutLn $ each ["one","two"] -- one -- two ---- -- With copy, I can as well do: -- --
-- >>> S.print $ S.stdoutLn $ S.copy $ each ["one","two"] -- one -- "one" -- two -- "two" ---- -- copy should be understood together with effects and is -- subject to the rules -- --
-- S.effects . S.copy = id -- hoist S.effects . S.copy = id ---- -- The similar operations in Streaming obey the same rules. -- -- Where the actions you are contemplating are each simple folds over the -- elements, or a selection of elements, then the coupling of the folds -- is often more straightforwardly effected with Foldl, e.g. -- --
-- >>> L.purely S.fold (liftA2 (,) L.sum L.product) $ each [1..10] -- (55,3628800) :> () ---- -- rather than -- --
-- >>> S.sum $ S.product . S.copy $ each [1..10] -- 55 :> (3628800 :> ()) ---- -- A Control.Foldl fold can be altered to act on a selection of -- elements by using handles on an appropriate lens. Some such -- manipulations are simpler and more List-like, using -- copy: -- --
-- >>> L.purely S.fold (liftA2 (,) (L.handles (filtered odd) L.sum) (L.handles (filtered even) L.product)) $ each [1..10] -- (25,3840) :> () ---- -- becomes -- --
-- >>> S.sum $ S.filter odd $ S.product $ S.filter even $ S.copy $ each [1..10] -- 25 :> (3840 :> ()) ---- -- or using store -- --
-- >>> S.sum $ S.filter odd $ S.store (S.product . S.filter even) $ each [1..10] -- 25 :> (3840 :> ()) ---- -- But anything that fold of a Stream (Of a) m r into e.g. an -- m (Of b r) that has a constraint on m that is -- carried over into Stream f m - e.g. Monad, -- MonadIO, MonadResource, etc. can be used on the -- stream. Thus, I can fold over different groupings of the original -- stream: -- --
-- >>> (S.toList . mapped S.toList . chunksOf 5) $ (S.toList . mapped S.toList . chunksOf 3) $ S.copy $ each [1..10] -- [[1,2,3,4,5],[6,7,8,9,10]] :> ([[1,2,3],[4,5,6],[7,8,9],[10]] :> ()) ---- -- The procedure can be iterated as one pleases, as one can see from this -- (otherwise unadvisable!) example: -- --
-- >>> (S.toList . mapped S.toList . chunksOf 4) $ (S.toList . mapped S.toList . chunksOf 3) $ S.copy $ (S.toList . mapped S.toList . chunksOf 2) $ S.copy $ each [1..12] -- [[1,2,3,4],[5,6,7,8],[9,10,11,12]] :> ([[1,2,3],[4,5,6],[7,8,9],[10,11,12]] :> ([[1,2],[3,4],[5,6],[7,8],[9,10],[11,12]] :> ())) --copy :: Monad m => Stream (Of a) m r -> Stream (Of a) (Stream (Of a) m) r -- | copy' is the same as copy but reverses the order of -- interleaved effects. The difference should not be observable at all -- for pure folds over the data. copy' :: Monad m => Stream (Of a) m r -> Stream (Of a) (Stream (Of a) m) r -- | Store the result of any suitable fold over a stream, keeping the -- stream for further manipulation. store f = f . copy : -- --
-- >>> S.print $ S.store S.product $ each [1..4] -- 1 -- 2 -- 3 -- 4 -- 24 :> () ---- --
-- >>> S.print $ S.store S.sum $ S.store S.product $ each [1..4] -- 1 -- 2 -- 3 -- 4 -- 10 :> (24 :> ()) ---- -- Here the sum (10) and the product (24) have been 'stored' for use when -- finally we have traversed the stream with print . Needless to -- say, a second pass is excluded conceptually, so the folds -- that you apply successively with store are performed -- simultaneously, and in constant memory -- as they would be if, say, -- you linked them together with Control.Fold: -- --
-- >>> L.impurely S.foldM (liftA3 (\a b c -> (b,c)) (L.sink print) (L.generalize L.sum) (L.generalize L.product)) $ each [1..4] -- 1 -- 2 -- 3 -- 4 -- (10,24) :> () ---- -- Fusing folds after the fashion of Control.Foldl will -- generally be a bit faster than the corresponding succession of uses of -- store, but by constant factor that will be completely dwarfed -- when any IO is at issue. -- -- But store copy is much/ more powerful, as you -- can see by reflecting on uses like this: -- --
-- >>> S.sum $ S.store (S.sum . mapped S.product . chunksOf 2) $ S.store (S.product . mapped S.sum . chunksOf 2 )$ each [1..6] -- 21 :> (44 :> (231 :> ())) ---- -- It will be clear that this cannot be reproduced with any combination -- of lenses, Control.Fold folds, or the like. (See also the -- discussion of copy.) -- -- It would conceivable be clearer to import a series of specializations -- of store. It is intended to be used at types like these: -- --
-- storeM :: (forall s m . Monad m => Stream (Of a) m s -> m (Of b s)) -- -> (Monad n => Stream (Of a) n r -> Stream (Of a) n (Of b r)) -- storeM = store -- -- storeMIO :: (forall s m . MonadIO m => Stream (Of a) m s -> m (Of b s)) -- -> ( MonadIO n => Stream (Of a) n r -> Stream (Of a) n (Of b r) -- storeMIO = store ---- -- It is clear from these types that we are just using the general -- instances: -- --
-- instance (Functor f, Monad m ) => Monad (Stream f m) -- instance (Functor f, MonadIO m) => MonadIO (Stream f m) ---- -- We thus can't be touching the elements of the stream, or the final -- return value. It it is the same with other constraints that Stream -- (Of a) inherits, like MonadResource. Thus I can filter and -- write to one file, but nub and write to another, or to a database or -- the like: -- --
-- >>> runResourceT $ (S.writeFile "hello2.txt" . S.nub) $ store (S.writeFile "hello.txt" . S.filter (/= "world")) $ each ["hello", "world", "goodbye", "world"] -- -- >>> :! cat hello.txt -- hello -- goodbye -- -- >>> :! cat hello2.txt -- hello -- world -- goodbye --store :: Monad m => (Stream (Of a) (Stream (Of a) m) r -> t) -> Stream (Of a) m r -> t -- | Apply an action to all values, re-yielding each -- --
-- >>> S.product $ S.chain Prelude.print $ S.each [1..5] -- 1 -- 2 -- 3 -- 4 -- 5 -- 120 :> () --chain :: Monad m => (a -> m ()) -> Stream (Of a) m r -> Stream (Of a) m r -- | Like the sequence but streaming. The result type is a stream of -- a's, but is not accumulated; the effects of the elements of the -- original stream are interleaved in the resulting stream. Compare: -- --
-- sequence :: Monad m => [m a] -> m [a] -- sequence :: Monad m => Stream (Of (m a)) m r -> Stream (Of a) m r ---- -- This obeys the rule sequence :: Monad m => Stream (Of (m a)) m r -> Stream (Of a) m r -- | Skip elements of a stream that fail a predicate filter :: (Monad m) => (a -> Bool) -> Stream (Of a) m r -> Stream (Of a) m r -- | Skip elements of a stream that fail a monadic test filterM :: (Monad m) => (a -> m Bool) -> Stream (Of a) m r -> Stream (Of a) m r -- | Interpolate a delay of n seconds between yields. delay :: MonadIO m => Double -> Stream (Of a) m r -> Stream (Of a) m r intersperse :: Monad m => a -> Stream (Of a) m r -> Stream (Of a) m r -- | End a stream after n elements; the original return value is thus lost. -- splitAt preserves this information. Note that, like -- splitAt, this function is functor-general, so that, for -- example, you can take not just a number of items from a -- stream of elements, but a number of substreams and the like. -- --
-- >>> S.toList $ S.take 3 $ each "with" -- "wit" :> () ---- --
-- >>> runResourceT $ S.stdoutLn $ S.take 3 $ S.readFile "stream.hs" -- import Streaming -- import qualified Streaming.Prelude as S -- import Streaming.Prelude (each, next, yield) --take :: (Monad m, Functor f) => Int -> Stream f m r -> Stream f m () -- | End stream when an element fails a condition; the original return -- value is lost. By contrast span preserves this information, and -- is generally more desirable. -- --
-- S.takeWhile thus = void . S.span thus ---- -- To preserve the information - but thus also force the rest of the -- stream to be developed - write -- --
-- S.drained . S.span thus ---- -- as dropWhile thus is -- --
-- S.effects . S.span thus --takeWhile :: Monad m => (a -> Bool) -> Stream (Of a) m r -> Stream (Of a) m () -- | Ignore the first n elements of a stream, but carry out the actions -- --
-- >>> S.toList $ S.drop 2 $ S.replicateM 5 getLine -- a<Enter> -- b<Enter> -- c<Enter> -- d<Enter> -- e<Enter> -- ["c","d","e"] :> () ---- -- Because it retains the final return value, drop n is a -- suitable argument for maps: -- --
-- >>> S.toList $ concats $ maps (S.drop 4) $ chunksOf 5 $ each [1..20] -- [5,10,15,20] :> () --drop :: (Monad m) => Int -> Stream (Of a) m r -> Stream (Of a) m r -- | Ignore elements of a stream until a test succeeds, retaining the rest. -- --
-- >>> S.print $ S.dropWhile ((< 5) . length) S.stdinLn -- one<Enter> -- two<Enter> -- three<Enter> -- "three" -- four<Enter> -- "four" -- ^CInterrupted. --dropWhile :: Monad m => (a -> Bool) -> Stream (Of a) m r -> Stream (Of a) m r -- | Make a stream of traversable containers into a stream of their -- separate elements. This is just -- --
-- concat str = for str each ---- --
-- >>> S.print $ S.concat (each ["xy","z"]) -- 'x' -- 'y' -- 'z' ---- -- Note that it also has the effect of catMaybes, rights -- 'map snd' and such-like operations. -- --
-- >>> S.print $ S.concat $ S.each [Just 1, Nothing, Just 2]
-- 1
-- 2
--
-- >>> S.print $ S.concat $ S.each [Right 1, Left "Error!", Right 2]
-- 1
-- 2
--
-- >>> S.print $ S.concat $ S.each [('A',1), ('B',2)]
-- 1
-- 2
--
concat :: (Monad m, Foldable f) => Stream (Of (f a)) m r -> Stream (Of a) m r
-- | Strict left scan, streaming, e.g. successive partial results.
--
-- -- >>> S.print $ S.scan (++) "" id $ each (words "a b c d") -- "" -- "a" -- "ab" -- "abc" -- "abcd" ---- -- scan is fitted for use with Control.Foldl, thus: -- --
-- >>> S.print $ L.purely S.scan L.list $ each [3..5] -- [] -- [3] -- [3,4] -- [3,4,5] --scan :: Monad m => (x -> a -> x) -> x -> (x -> b) -> Stream (Of a) m r -> Stream (Of b) m r -- | Strict left scan, accepting a monadic function. It can be used with -- FoldMs from Control.Foldl using impurely. -- Here we yield a succession of vectors each recording -- --
-- >>> let v = L.impurely scanM L.vector $ each [1..4::Int] :: Stream (Of (U.Vector Int)) IO () -- -- >>> S.print v -- fromList [] -- fromList [1] -- fromList [1,2] -- fromList [1,2,3] -- fromList [1,2,3,4] --scanM :: Monad m => (x -> a -> m x) -> m x -> (x -> m b) -> Stream (Of a) m r -> Stream (Of b) m r scanned :: Monad m => (x -> a -> x) -> x -> (x -> b) -> Stream (Of a) m r -> Stream (Of (a, b)) m r -- | Make a stream of strings into a stream of parsed values, skipping bad -- cases -- --
-- >>> S.sum_ $ S.read $ S.takeWhile (/= "total") S.stdinLn :: IO Int -- 1000<Enter> -- 2000<Enter> -- total<Enter> -- 3000 --read :: (Monad m, Read a) => Stream (Of String) m r -> Stream (Of a) m r show :: (Monad m, Show a) => Stream (Of a) m r -> Stream (Of String) m r -- | The natural cons for a Stream (Of a). -- --
-- cons a stream = yield a >> stream ---- -- Useful for interoperation: -- --
-- Data.Text.foldr S.cons (return ()) :: Text -> Stream (Of Char) m () -- Lazy.foldrChunks S.cons (return ()) :: Lazy.ByteString -> Stream (Of Strict.ByteString) m () ---- -- and so on. cons :: (Monad m) => a -> Stream (Of a) m r -> Stream (Of a) m r duplicate :: Monad m => Stream (Of a) m r -> Stream (Of a) (Stream (Of a) m) r duplicate' :: Monad m => Stream (Of a) m r -> Stream (Of a) (Stream (Of a) m) r -- | The standard way of inspecting the first item in a stream of elements, -- if the stream is still 'running'. The Right case contains a -- Haskell pair, where the more general inspect would return a -- left-strict pair. There is no reason to prefer inspect since, -- if the Right case is exposed, the first element in the pair -- will have been evaluated to whnf. -- --
-- next :: Monad m => Stream (Of a) m r -> m (Either r (a, Stream (Of a) m r)) -- inspect :: Monad m => Stream (Of a) m r -> m (Either r (Of a (Stream (Of a) m r))) ---- -- Interoperate with pipes producers thus: -- --
-- Pipes.unfoldr Stream.next :: Stream (Of a) m r -> Producer a m r -- Stream.unfoldr Pipes.next :: Producer a m r -> Stream (Of a) m r ---- -- Similarly: -- --
-- IOStreams.unfoldM (liftM (either (const Nothing) Just) . next) :: Stream (Of a) IO b -> IO (InputStream a) -- Conduit.unfoldM (liftM (either (const Nothing) Just) . next) :: Stream (Of a) m r -> Source a m r ---- -- But see uncons, which is better fitted to these -- unfoldMs next :: Monad m => Stream (Of a) m r -> m (Either r (a, Stream (Of a) m r)) -- | Inspect the first item in a stream of elements, without a return -- value. uncons provides convenient exit into another streaming -- type: -- --
-- IOStreams.unfoldM uncons :: Stream (Of a) IO b -> IO (InputStream a) -- Conduit.unfoldM uncons :: Stream (Of a) m r -> Conduit.Source m a --uncons :: Monad m => Stream (Of a) m () -> m (Maybe (a, Stream (Of a) m ())) -- | Split a succession of layers after some number, returning a streaming -- or -- effectful pair. This function is the same as the splitsAt -- exported by the -- Streaming module, but since this module is -- imported qualified, it can -- usurp a Prelude name. It specializes to: -- --
-- splitAt :: (Monad m, Functor f) => Int -> Stream (Of a) m r -> Stream (Of a) m (Stream (Of a) m r) --splitAt :: (Monad m, Functor f) => Int -> Stream f m r -> Stream f m (Stream f m r) -- | Split a stream of elements wherever a given element arises. The action -- is like that of words. -- --
-- >>> S.stdoutLn $ mapped S.toList $ S.split ' ' $ each "hello world " -- hello -- world --split :: (Eq a, Monad m) => a -> Stream (Of a) m r -> Stream (Stream (Of a) m) m r -- | Break a sequence upon meeting element falls under a predicate, keeping -- it and the rest of the stream as the return value. -- --
-- >>> rest <- S.print $ S.break even $ each [1,1,2,3] -- 1 -- 1 -- -- >>> S.print rest -- 2 -- 3 --break :: Monad m => (a -> Bool) -> Stream (Of a) m r -> Stream (Of a) m (Stream (Of a) m r) -- | Yield elements, using a fold to maintain state, until the accumulated -- value satifies the supplied predicate. The fold will then be -- short-circuited and the element that breaks it will be put after the -- break. This function is easiest to use with purely -- --
-- >>> rest <- each [1..10] & L.purely S.breakWhen L.sum (>10) & S.print -- 1 -- 2 -- 3 -- 4 -- -- >>> S.print rest -- 5 -- 6 -- 7 -- 8 -- 9 -- 10 --breakWhen :: Monad m => (x -> a -> x) -> x -> (x -> b) -> (b -> Bool) -> Stream (Of a) m r -> Stream (Of a) m (Stream (Of a) m r) -- | Stream elements until one fails the condition, return the rest. span :: Monad m => (a -> Bool) -> Stream (Of a) m r -> Stream (Of a) m (Stream (Of a) m r) -- | Group successive equal items together -- --
-- >>> S.toList $ mapped S.toList $ S.group $ each "baaaaad" -- ["b","aaaaa","d"] :> () ---- --
-- >>> S.toList $ concats $ maps (S.drained . S.splitAt 1) $ S.group $ each "baaaaaaad" -- "bad" :> () --group :: (Monad m, Eq a) => Stream (Of a) m r -> Stream (Stream (Of a) m) m r -- | Group elements of a stream in accordance with the supplied comparison. -- --
-- >>> S.print $ mapped S.toList $ S.groupBy (>=) $ each [1,2,3,1,2,3,4,3,2,4,5,6,7,6,5] -- [1] -- [2] -- [3,1,2,3] -- [4,3,2,4] -- [5] -- [6] -- [7,6,5] --groupBy :: Monad m => (a -> a -> Bool) -> Stream (Of a) m r -> Stream (Stream (Of a) m) m r distinguish :: (a -> Bool) -> Of a r -> Sum (Of a) (Of a) r -- | Swap the order of functors in a sum of functors. -- --
-- >>> S.toListM' $ S.print $ separate $ maps S.switch $ maps (S.distinguish (=='a')) $ S.each "banana" -- 'a' -- 'a' -- 'a' -- "bnn" :> () -- -- >>> S.toListM' $ S.print $ separate $ maps (S.distinguish (=='a')) $ S.each "banana" -- 'b' -- 'n' -- 'n' -- "aaa" :> () --switch :: Sum f g r -> Sum g f r -- | Given a stream on a sum of functors, make it a stream on the left -- functor, with the streaming on the other functor as the governing -- monad. This is useful for acting on one or the other functor with a -- fold. It generalizes partitionEithers massively, but actually -- streams properly. -- --
-- >>> let odd_even = S.maps (S.distinguish even) $ S.each [1..10::Int] -- -- >>> :t separate odd_even -- separate odd_even -- :: Monad m => Stream (Of Int) (Stream (Of Int) m) () ---- -- Now, for example, it is convenient to fold on the left and right -- values separately: -- --
-- >>> S.toList $ S.toList $ separate odd_even -- [2,4,6,8,10] :> ([1,3,5,7,9] :> ()) ---- -- Or we can write them to separate files or whatever: -- --
-- >>> runResourceT $ S.writeFile "even.txt" . S.show $ S.writeFile "odd.txt" . S.show $ S.separate odd_even -- -- >>> :! cat even.txt -- 2 -- 4 -- 6 -- 8 -- 10 -- -- >>> :! cat odd.txt -- 1 -- 3 -- 5 -- 7 -- 9 ---- -- Of course, in the special case of Stream (Of a) m r, we can -- achieve the above effects more simply by using copy -- --
-- >>> S.toList . S.filter even $ S.toList . S.filter odd $ S.copy $ each [1..10::Int] -- [2,4,6,8,10] :> ([1,3,5,7,9] :> ()) ---- -- But separate and unseparate are functor-general. separate :: (Monad m, Functor f, Functor g) => Stream (Sum f g) m r -> Stream f (Stream g m) r unseparate :: (Monad m, Functor f, Functor g) => Stream f (Stream g m) r -> Stream (Sum f g) m r eitherToSum :: Of (Either a b) r -> Sum (Of a) (Of b) r sumToEither :: Sum (Of a) (Of b) r -> Of (Either a b) r sumToCompose :: Sum f f r -> Compose (Of Bool) f r composeToSum :: Compose (Of Bool) f r -> Sum f f r -- | Strict fold of a Stream of elements that preserves the return -- value. The third parameter will often be id where a fold is -- written by hand: -- --
-- >>> S.fold (+) 0 id $ each [1..10] -- 55 :> () ---- --
-- >>> S.fold (*) 1 id $ S.fold (+) 0 id $ S.copy $ each [1..10] -- 3628800 :> (55 :> ()) ---- -- It can be used to replace a standard Haskell type with one more suited -- to writing a strict accumulation function. It is also crucial to the -- Applicative instance for Control.Foldl.Fold We can apply such -- a fold purely -- --
-- Control.Foldl.purely S.fold :: Monad m => Fold a b -> Stream (Of a) m r -> m (Of b r) ---- -- Thus, specializing a bit: -- --
-- L.purely S.fold L.sum :: Stream (Of Int) Int r -> m (Of Int r) -- mapped (L.purely S.fold L.sum) :: Stream (Stream (Of Int)) IO r -> Stream (Of Int) IO r ---- -- Here we use the Applicative instance for Control.Foldl.Fold -- to stream three-item segments of a stream together with their sums and -- products. -- --
-- >>> S.print $ mapped (L.purely S.fold (liftA3 (,,) L.list L.product L.sum)) $ chunksOf 3 $ each [1..10] -- ([1,2,3],6,6) -- ([4,5,6],120,15) -- ([7,8,9],504,24) -- ([10],10,10) --fold :: Monad m => (x -> a -> x) -> x -> (x -> b) -> Stream (Of a) m r -> m (Of b r) -- | Strict fold of a Stream of elements, preserving only the result -- of the fold, not the return value of the stream. The third parameter -- will often be id where a fold is written by hand: -- --
-- >>> S.fold_ (+) 0 id $ each [1..10] -- 55 ---- -- It can be used to replace a standard Haskell type with one more suited -- to writing a strict accumulation function. It is also crucial to the -- Applicative instance for Control.Foldl.Fold -- --
-- Control.Foldl.purely fold :: Monad m => Fold a b -> Stream (Of a) m () -> m b --fold_ :: Monad m => (x -> a -> x) -> x -> (x -> b) -> Stream (Of a) m r -> m b -- | Strict, monadic fold of the elements of a 'Stream (Of a)' -- --
-- Control.Foldl.impurely foldM' :: Monad m => FoldM a b -> Stream (Of a) m r -> m (b, r) ---- -- Thus to accumulate the elements of a stream as a vector, together with -- a random element we might write: -- --
-- >>> L.impurely S.foldM (liftA2 (,) L.vector L.random) $ each [1..10::Int] :: IO (Of (U.Vector Int,Maybe Int) ()) -- ([1,2,3,4,5,6,7,8,9,10],Just 9) :> () --foldM :: Monad m => (x -> a -> m x) -> m x -> (x -> m b) -> Stream (Of a) m r -> m (Of b r) -- | Strict, monadic fold of the elements of a 'Stream (Of a)' -- --
-- Control.Foldl.impurely foldM :: Monad m => FoldM a b -> Stream (Of a) m () -> m b --foldM_ :: Monad m => (x -> a -> m x) -> m x -> (x -> m b) -> Stream (Of a) m r -> m b all :: Monad m => (a -> Bool) -> Stream (Of a) m r -> m (Of Bool r) all_ :: Monad m => (a -> Bool) -> Stream (Of a) m r -> m Bool any :: Monad m => (a -> Bool) -> Stream (Of a) m r -> m (Of Bool r) any_ :: Monad m => (a -> Bool) -> Stream (Of a) m r -> m Bool -- | Fold a Stream of numbers into their sum with the return value -- --
-- mapped S.sum :: Stream (Stream (Of Int)) m r -> Stream (Of Int) m r ---- --
-- >>> S.sum $ each [1..10] -- 55 :> () ---- --
-- >>> (n :> rest) <- S.sum $ S.splitAt 3 $ each [1..10] -- -- >>> print n -- 6 -- -- >>> (m :> rest') <- S.sum $ S.splitAt 3 rest -- -- >>> print m -- 15 -- -- >>> S.print rest' -- 7 -- 8 -- 9 --sum :: (Monad m, Num a) => Stream (Of a) m r -> m (Of a r) -- | Fold a Stream of numbers into their sum sum_ :: (Monad m, Num a) => Stream (Of a) m () -> m a -- | Fold a Stream of numbers into their product with the return -- value -- --
-- maps' product' :: Stream (Stream (Of Int)) m r -> Stream (Of Int) m r --product :: (Monad m, Num a) => Stream (Of a) m r -> m (Of a r) -- | Fold a Stream of numbers into their product product_ :: (Monad m, Num a) => Stream (Of a) m () -> m a head :: Monad m => Stream (Of a) m r -> m (Of (Maybe a) r) head_ :: Monad m => Stream (Of a) m r -> m (Maybe a) last :: Monad m => Stream (Of a) m r -> m (Of (Maybe a) r) last_ :: Monad m => Stream (Of a) m r -> m (Maybe a) -- | Exhaust a stream remembering only whether a was an element. elem :: (Monad m, Eq a) => a -> Stream (Of a) m r -> m (Of Bool r) elem_ :: (Monad m, Eq a) => a -> Stream (Of a) m r -> m Bool -- | Exhaust a stream deciding whether a was an element. notElem :: (Monad m, Eq a) => a -> Stream (Of a) m r -> m (Of Bool r) notElem_ :: (Monad m, Eq a) => a -> Stream (Of a) m r -> m Bool -- | Run a stream, keeping its length and its return value. -- --
-- >>> S.print $ mapped S.length $ chunksOf 3 $ S.each [1..10] -- 3 -- 3 -- 3 -- 1 --length :: Monad m => Stream (Of a) m r -> m (Of Int r) -- | Run a stream, remembering only its length: -- --
-- >>> S.length $ S.each [1..10] -- 10 --length_ :: Monad m => Stream (Of a) m r -> m Int -- | Convert an effectful Stream into a list alongside the return -- value -- --
-- mapped toList :: Stream (Stream (Of a)) m r -> Stream (Of [a]) m ---- -- Like toList_, it breaks streaming; unlike toList_ it -- preserves the return value and thus is frequently useful with e.g. -- mapped -- --
-- >>> S.print $ mapped S.toList $ chunksOf 3 $ each [1..9] -- [1,2,3] -- [4,5,6] -- [7,8,9] --toList :: Monad m => Stream (Of a) m r -> m (Of [a] r) -- | Convert an effectful 'Stream (Of a)' into a list of as -- -- Note: Needless to say, this function does not stream properly. It is -- basically the same as Prelude mapM which, like -- replicateM, sequence and similar operations on -- traversable containers is a leading cause of space leaks. toList_ :: Monad m => Stream (Of a) m () -> m [a] -- | Fold streamed items into their monoidal sum -- --
-- >>> S.mconcat $ S.take 2 $ S.map (Data.Monoid.Last . Just) (S.stdinLn)
-- first<Enter>
-- last<Enter>
-- Last {getLast = Just "last"} :> ()
--
mconcat :: (Monad m, Monoid w) => Stream (Of w) m r -> m (Of w r)
mconcat_ :: (Monad m, Monoid w) => Stream (Of w) m r -> m w
minimum :: (Monad m, Ord a) => Stream (Of a) m r -> m (Of (Maybe a) r)
minimum_ :: (Monad m, Ord a) => Stream (Of a) m r -> m (Maybe a)
maximum :: (Monad m, Ord a) => Stream (Of a) m r -> m (Of (Maybe a) r)
maximum_ :: (Monad m, Ord a) => Stream (Of a) m r -> m (Maybe a)
-- | A natural right fold for consuming a stream of elements. See also the
-- more general iterT in the Streaming module and the
-- still more general destroy
foldrM :: Monad m => (a -> m r -> m r) -> Stream (Of a) m r -> m r
-- | A natural right fold for consuming a stream of elements. See also the
-- more general iterTM in the Streaming module and the
-- still more general destroy
--
-- -- foldrT (\a p -> Streaming.yield a >> p) = id -- foldrT (\a p -> Pipes.yield a >> p) :: Monad m => Stream (Of a) m r -> Producer a m r -- foldrT (\a p -> Conduit.yield a >> p) :: Monad m => Stream (Of a) m r -> Conduit a m r --foldrT :: (Monad m, MonadTrans t, Monad (t m)) => (a -> t m r -> t m r) -> Stream (Of a) m r -> t m r -- | Zip two Streamss zip :: Monad m => (Stream (Of a) m r) -> (Stream (Of b) m r) -> (Stream (Of (a, b)) m r) -- | Zip two Streamss using the provided combining function zipWith :: Monad m => (a -> b -> c) -> (Stream (Of a) m r) -> (Stream (Of b) m r) -> (Stream (Of c) m r) -- | Zip three streams together zip3 :: Monad m => (Stream (Of a) m r) -> (Stream (Of b) m r) -> (Stream (Of c) m r) -> (Stream (Of (a, b, c)) m r) -- | Zip three Streams with a combining function zipWith3 :: Monad m => (a -> b -> c -> d) -> Stream (Of a) m r -> Stream (Of b) m r -> Stream (Of c) m r -> Stream (Of d) m r -- | The type -- --
-- Data.List.unzip :: [(a,b)] -> ([a],[b]) ---- -- might lead us to expect -- --
-- Streaming.unzip :: Stream (Of (a,b)) m r -> Stream (Of a) m (Stream (Of b) m r) ---- -- which would not stream, since it would have to accumulate the second -- stream (of bs). Of course, Data.List unzip -- doesn't stream either. -- -- This unzip does stream, though of course you can spoil this -- by using e.g. toList: -- --
-- >>> let xs = map (\x-> (x,show x)) [1..5::Int] ---- --
-- >>> S.toList $ S.toList $ S.unzip (S.each xs) -- ["1","2","3","4","5"] :> ([1,2,3,4,5] :> ()) ---- --
-- >>> Prelude.unzip xs -- ([1,2,3,4,5],["1","2","3","4","5"]) ---- -- Note the difference of order in the results. It may be of some use to -- think why. The first application of toList was applied to a -- stream of integers: -- --
-- >>> :t S.unzip $ S.each xs -- S.unzip $ S.each xs :: Monad m => Stream (Of Int) (Stream (Of String) m) () ---- -- Like any fold, toList takes no notice of the monad of effects. -- --
-- toList :: Monad m => Stream (Of a) m r -> m (Of [a] r) ---- -- In the case at hand (since I am in ghci) m = Stream (Of -- String) IO. So when I apply toList, I exhaust that stream -- of integers, folding it into a list: -- --
-- >>> :t S.toList $ S.unzip $ S.each xs -- S.toList $ S.unzip $ S.each xs -- :: Monad m => Stream (Of String) m (Of [Int] ()) ---- -- When I apply toList to this, I reduce everything to an -- ordinary action in IO, and return a list of strings: -- --
-- >>> S.toList $ S.toList $ S.unzip (S.each xs) -- ["1","2","3","4","5"] :> ([1,2,3,4,5] :> ()) --unzip :: Monad m => Stream (Of (a, b)) m r -> Stream (Of a) (Stream (Of b) m) r -- | Separate left and right values in distinct streams. (separate -- is a more powerful, functor-general, equivalent using Sum in -- place of Either). So, for example, to permit unlimited user -- input of Ints on condition of only two errors, we might -- write: -- --
-- >>> S.toList $ S.print $ S.take 2 $ partitionEithers $ S.map readEither $ S.stdinLn :: IO (Of [Int] ()) -- 1<Enter> -- 2<Enter> -- qqqqqqqqqq<Enter> -- "Prelude.read: no parse" -- 3<Enter> -- rrrrrrrrrr<Enter> -- "Prelude.read: no parse" -- [1,2,3] :> () ---- --
-- partitionEithers = separate . maps S.eitherToSum -- lefts = hoist S.effects . partitionEithers -- rights = S.effects . partitionEithers -- rights = S.concat --partitionEithers :: Monad m => Stream (Of (Either a b)) m r -> Stream (Of a) (Stream (Of b) m) r -- |
-- filter p = hoist effects (partition p) --partition :: Monad m => (a -> Bool) -> Stream (Of a) m r -> Stream (Of a) (Stream (Of a) m) r -- | The catMaybes function takes a Stream of Maybes -- and returns a Stream of all of the Just values. catMaybes :: Monad m => Stream (Of (Maybe a)) m r -> Stream (Of a) m r -- | The mapMaybe function is a version of map which can -- throw out elements. In particular, the functional argument returns -- something of type Maybe b. If this is Nothing, -- no element is added on to the result Stream. If it is -- Just b, then b is included in the result -- Stream. mapMaybe :: Monad m => (a -> Maybe b) -> Stream (Of a) m r -> Stream (Of b) m r -- | Note that lazily, strictly, fst', and -- mapOf are all so-called natural transformations on the -- primitive Of a functor If we write -- --
-- type f ~~> g = forall x . f x -> g x ---- -- then we can restate some types as follows: -- --
-- mapOf :: (a -> b) -> Of a ~~> Of b -- bifunctor lmap -- lazily :: Of a ~~> (,) a -- Identity . fst' :: Of a ~~> Identity a ---- -- Manipulation of a Stream f m r by mapping often turns on -- recognizing natural transformations of f. Thus maps -- is far more general the the map of the -- Streaming.Prelude, which can be defined thus: -- --
-- S.map :: (a -> b) -> Stream (Of a) m r -> Stream (Of b) m r -- S.map f = maps (mapOf f) ---- -- i.e. -- --
-- S.map f = maps (\(a :> x) -> (f a :> x)) ---- -- This rests on recognizing that mapOf is a natural -- transformation; note though that it results in such a transformation -- as well: -- --
-- S.map :: (a -> b) -> Stream (Of a) m ~> Stream (Of b) m ---- -- Thus we can maps it in turn -- --
-- --lazily :: Of a b -> (a, b) strictly :: (a, b) -> Of a b fst' :: Of a b -> a snd' :: Of a b -> b -- | Read an IORef (Maybe a) or a similar device until it reads -- Nothing. reread provides convenient exit from the -- io-streams library -- --
-- reread readIORef :: IORef (Maybe a) -> Stream (Of a) IO () -- reread Streams.read :: System.IO.Streams.InputStream a -> Stream (Of a) IO () --reread :: Monad m => (s -> m (Maybe a)) -> s -> Stream (Of a) m () data Stream f m r instance Data.Traversable.Traversable (Streaming.Prelude.Of a) instance (GHC.Show.Show a, GHC.Show.Show b) => GHC.Show.Show (Streaming.Prelude.Of a b) instance (GHC.Read.Read a, GHC.Read.Read b) => GHC.Read.Read (Streaming.Prelude.Of a b) instance (GHC.Classes.Ord a, GHC.Classes.Ord b) => GHC.Classes.Ord (Streaming.Prelude.Of a b) instance Data.Foldable.Foldable (Streaming.Prelude.Of a) instance (GHC.Classes.Eq a, GHC.Classes.Eq b) => GHC.Classes.Eq (Streaming.Prelude.Of a b) instance (Data.Data.Data a, Data.Data.Data b) => Data.Data.Data (Streaming.Prelude.Of a b) instance (GHC.Base.Monoid a, GHC.Base.Monoid b) => GHC.Base.Monoid (Streaming.Prelude.Of a b) instance GHC.Base.Functor (Streaming.Prelude.Of a) instance GHC.Base.Monoid a => GHC.Base.Applicative (Streaming.Prelude.Of a) instance GHC.Base.Monoid a => GHC.Base.Monad (Streaming.Prelude.Of a) instance (r ~ (), GHC.Base.Monad m, f ~ Streaming.Prelude.Of GHC.Types.Char) => Data.String.IsString (Streaming.Internal.Stream f m r) module Streaming data Stream f m r -- | yields is like lift for items in the streamed -- functor. It makes a singleton or one-layer succession. -- --
-- lift :: (Monad m, Functor f) => m r -> Stream f m r -- yields :: (Monad m, Functor f) => f r -> Stream f m r ---- -- Viewed in another light, it is like a functor-general version of -- yield: -- --
-- S.yield a = yields (a :> ()) --yields :: (Monad m, Functor f) => f r -> Stream f m r -- | Wrap an effect that returns a stream -- --
-- effect = join . lift --effect :: (Monad m, Functor f) => m (Stream f m r) -> Stream f m r wrap :: (Monad m, Functor f) => f (Stream f m r) -> Stream f m r -- | Repeat a functorial layer, command or instruction a fixed number of -- times. -- --
-- replicates n = takes n . repeats --replicates :: (Monad m, Functor f) => Int -> f () -> Stream f m () -- | Repeat a functorial layer (a "command" or "instruction") forever. repeats :: (Monad m, Functor f) => f () -> Stream f m r -- | Repeat an effect containing a functorial layer, command or instruction -- forever. repeatsM :: (Monad m, Functor f) => m (f ()) -> Stream f m r -- | Build a Stream by unfolding steps starting from a seed. See -- also the specialized unfoldr in the prelude. -- --
-- unfold inspect = id -- modulo the quotient we work with -- unfold Pipes.next :: Monad m => Producer a m r -> Stream ((,) a) m r -- unfold (curry (:>) . Pipes.next) :: Monad m => Producer a m r -> Stream (Of a) m r --unfold :: (Monad m, Functor f) => (s -> m (Either r (f s))) -> s -> Stream f m r -- | never interleaves the pure applicative action with the return -- of the monad forever. It is the empty of the Alternative -- instance, thus -- --
-- never <|> a = a -- a <|> never = a ---- -- and so on. If w is a monoid then never :: Stream (Of w) m r -- is the infinite sequence of mempty, and str1 <|> -- str2 appends the elements monoidally until one of streams ends. -- Thus we have, e.g. -- --
-- >>> S.stdoutLn $ S.take 2 $ S.stdinLn <|> S.repeat " " <|> S.stdinLn <|> S.repeat " " <|> S.stdinLn -- 1<Enter> -- 2<Enter> -- 3<Enter> -- 1 2 3 -- 4<Enter> -- 5<Enter> -- 6<Enter> -- 4 5 6 ---- -- This is equivalent to -- --
-- >>> S.stdoutLn $ S.take 2 $ foldr (<|>) never [S.stdinLn, S.repeat " ", S.stdinLn, S.repeat " ", S.stdinLn ] ---- -- Where f is a monad, (<|>) sequences the -- conjoined streams stepwise. See the definition of paste -- here, where the separate steps are bytestreams corresponding to -- the lines of a file. -- -- Given, say, -- --
-- data Branch r = Branch r r deriving Functor -- add obvious applicative instance ---- -- then never :: Stream Branch Identity r is the pure infinite -- binary tree with (inaccessible) rs in its leaves. Given two -- binary trees, tree1 <|> tree2 intersects them, -- preserving the leaves that came first, so tree1 <|> never = -- tree1 -- -- Stream Identity m r is an action in m that is -- indefinitely delayed. Such an action can be constructed with e.g. -- untilJust. -- --
-- untilJust :: (Monad m, Applicative f) => m (Maybe r) -> Stream f m r ---- -- Given two such items, <|> instance races them. It is -- thus the iterative monad transformer specially defined in -- Control.Monad.Trans.Iter -- -- So, for example, we might write -- --
-- >>> let justFour str = if length str == 4 then Just str else Nothing -- -- >>> let four = untilJust (liftM justFour getLine) -- -- >>> run four -- one<Enter> -- two<Enter> -- three<Enter> -- four<Enter> -- "four" ---- -- The Alternative instance in Control.Monad.Trans.Free is -- avowedly wrong, though no explanation is given for this. never :: (Monad m, Applicative f) => Stream f m r -- | Repeat a untilJust :: (Monad m, Applicative f) => m (Maybe r) -> Stream f m r -- | Reflect a church-encoded stream; cp. GHC.Exts.build -- --
-- streamFold return_ effect_ step_ (streamBuild psi) = psi return_ effect_ step_ --streamBuild :: (forall b. (r -> b) -> (m b -> b) -> (f b -> b) -> b) -> Stream f m r delays :: (MonadIO m, Applicative f) => Double -> Stream f m r -- | Map layers of one functor to another with a transformation. Compare -- hoist, which has a similar effect on the monadic parameter. -- --
-- maps id = id -- maps f . maps g = maps (f . g) --maps :: (Monad m, Functor f) => (forall x. f x -> g x) -> Stream f m r -> Stream g m r -- | Map layers of one functor to another with a transformation involving -- the base monad maps is more fundamental than mapsM, -- which is best understood as a convenience for effecting this frequent -- composition: -- --
-- mapsM phi = decompose . maps (Compose . phi) ---- -- The streaming prelude exports the same function under the better name -- mapped, which overlaps with the lens libraries. mapsM :: (Monad m, Functor f) => (forall x. f x -> m (g x)) -> Stream f m r -> Stream g m r -- | Map layers of one functor to another with a transformation involving -- the base monad. This could be trivial, e.g. -- --
-- let noteBeginning text x = putStrLn text >> return text ---- -- this puts the is completely functor-general -- -- maps and mapped obey these rules: -- --
-- maps id = id -- mapped return = id -- maps f . maps g = maps (f . g) -- mapped f . mapped g = mapped (f <=< g) -- maps f . mapped g = mapped (liftM f . g) -- mapped f . maps g = mapped (f <=< liftM g) ---- -- maps is more fundamental than mapped, which is best -- understood as a convenience for effecting this frequent composition: -- --
-- mapped phi = decompose . maps (Compose . phi) --mapped :: (Monad m, Functor f) => (forall x. f x -> m (g x)) -> Stream f m r -> Stream g m r -- | Make it possible to 'run' the underlying transformed monad. distribute :: (Monad m, Functor f, MonadTrans t, MFunctor t, Monad (t (Stream f m))) => Stream f (t m) r -> t (Stream f m) r -- | Group layers in an alternating stream into adjoining sub-streams of -- one type or another. groups :: (Monad m, Functor f, Functor g) => Stream (Sum f g) m r -> Stream (Sum (Stream f m) (Stream g m)) m r -- | Inspect the first stage of a freely layered sequence. Compare -- Pipes.next and the replica Streaming.Prelude.next. -- This is the uncons for the general unfold. -- --
-- unfold inspect = id -- Streaming.Prelude.unfoldr StreamingPrelude.next = id --inspect :: (Functor f, Monad m) => Stream f m r -> m (Either r (f (Stream f m r))) -- | Split a succession of layers after some number, returning a streaming -- or effectful pair. -- --
-- >>> rest <- S.print $ S.splitAt 1 $ each [1..3] -- 1 -- -- >>> S.print rest -- 2 -- 3 ---- --
-- splitAt 0 = return -- splitAt n >=> splitAt m = splitAt (m+n) ---- -- Thus, e.g. -- --
-- >>> rest <- S.print $ splitsAt 2 >=> splitsAt 2 $ each [1..5] -- 1 -- 2 -- 3 -- 4 -- -- >>> S.print rest -- 5 --splitsAt :: (Monad m, Functor f) => Int -> Stream f m r -> Stream f m (Stream f m r) takes :: (Monad m, Functor f) => Int -> Stream f m r -> Stream f m () -- | Break a stream into substreams each with n functorial layers. -- --
-- >>> S.print $ mapped S.sum $ chunksOf 2 $ each [1,1,1,1,1] -- 2 -- 2 -- 1 --chunksOf :: (Monad m, Functor f) => Int -> Stream f m r -> Stream (Stream f m) m r -- | Dissolves the segmentation into layers of Stream f m layers. concats :: (Monad m, Functor f) => Stream (Stream f m) m r -> Stream f m r -- | Interpolate a layer at each segment. This specializes to e.g. -- --
-- intercalates :: (Monad m, Functor f) => Stream f m () -> Stream (Stream f m) m r -> Stream f m r --intercalates :: (Monad m, Monad (t m), MonadTrans t) => t m x -> Stream (t m) m r -> t m r cutoff :: (Monad m, Functor f) => Int -> Stream f m r -> Stream f m (Maybe r) zipsWith :: (Monad m, Functor h) => (forall x y. f x -> g y -> h (x, y)) -> Stream f m r -> Stream g m r -> Stream h m r zips :: (Monad m, Functor f, Functor g) => Stream f m r -> Stream g m r -> Stream (Compose f g) m r unzips :: (Monad m, Functor f, Functor g) => Stream (Compose f g) m r -> Stream f (Stream g m) r -- | Interleave functor layers, with the effects of the first preceding the -- effects of the second. -- --
-- interleaves = zipsWith (liftA2 (,)) ---- --
-- >>> let paste = \a b -> interleaves (Q.lines a) (maps (Q.cons' '\t') (Q.lines b)) -- -- >>> Q.stdout $ Q.unlines $ paste "hello\nworld\n" "goodbye\nworld\n" -- hello goodbye -- world world --interleaves :: (Monad m, Applicative h) => Stream h m r -> Stream h m r -> Stream h m r -- | Given a stream on a sum of functors, make it a stream on the left -- functor, with the streaming on the other functor as the governing -- monad. This is useful for acting on one or the other functor with a -- fold. It generalizes partitionEithers massively, but actually -- streams properly. -- --
-- >>> let odd_even = S.maps (S.distinguish even) $ S.each [1..10::Int] -- -- >>> :t separate odd_even -- separate odd_even -- :: Monad m => Stream (Of Int) (Stream (Of Int) m) () ---- -- Now, for example, it is convenient to fold on the left and right -- values separately: -- --
-- >>> S.toList $ S.toList $ separate odd_even -- [2,4,6,8,10] :> ([1,3,5,7,9] :> ()) ---- -- Or we can write them to separate files or whatever: -- --
-- >>> runResourceT $ S.writeFile "even.txt" . S.show $ S.writeFile "odd.txt" . S.show $ S.separate odd_even -- -- >>> :! cat even.txt -- 2 -- 4 -- 6 -- 8 -- 10 -- -- >>> :! cat odd.txt -- 1 -- 3 -- 5 -- 7 -- 9 ---- -- Of course, in the special case of Stream (Of a) m r, we can -- achieve the above effects more simply by using copy -- --
-- >>> S.toList . S.filter even $ S.toList . S.filter odd $ S.copy $ each [1..10::Int] -- [2,4,6,8,10] :> ([1,3,5,7,9] :> ()) ---- -- But separate and unseparate are functor-general. separate :: (Monad m, Functor f, Functor g) => Stream (Sum f g) m r -> Stream f (Stream g m) r unseparate :: (Monad m, Functor f, Functor g) => Stream f (Stream g m) r -> Stream (Sum f g) m r -- | Rearrange a succession of layers of the form Compose m (f x). -- -- we could as well define decompose by mapsM: -- --
-- decompose = mapped getCompose ---- -- but mapped is best understood as: -- --
-- mapped phi = decompose . maps (Compose . phi) ---- -- since maps and hoist are the really fundamental -- operations that preserve the shape of the stream: -- --
-- maps :: (Monad m, Functor f) => (forall x. f x -> g x) -> Stream f m r -> Stream g m r -- hoist :: (Monad m, Functor f) => (forall a. m a -> n a) -> Stream f m r -> Stream f n r --decompose :: (Monad m, Functor f) => Stream (Compose m f) m r -> Stream f m r -- | Map each layer to an effect, and run them all. mapsM_ :: (Functor f, Monad m) => (forall x. f x -> m x) -> Stream f m r -> m r -- | Run the effects in a stream that merely layers effects. run :: Monad m => Stream m m r -> m r -- | streamFold reorders the arguments of destroy to be more -- akin to foldr It is more convenient to query in ghci to -- figure out what kind of 'algebra' you need to write. -- --
-- >>> :t streamFold return join -- (Monad m, Functor f) => -- (f (m a) -> m a) -> Stream f m a -> m a -- iterT ---- --
-- >>> :t streamFold return (join . lift) -- (Monad m, Monad (t m), Functor f, MonadTrans t) => -- (f (t m a) -> t m a) -> Stream f m a -> t m a -- iterTM ---- --
-- >>> :t streamFold return effect -- (Monad m, Functor f, Functor g) => -- (f (Stream g m r) -> Stream g m r) -> Stream f m r -> Stream g m r ---- --
-- >>> :t \f -> streamFold return effect (wrap . f) -- (Monad m, Functor f, Functor g) => -- (f (Stream g m a) -> g (Stream g m a)) -- -> Stream f m a -> Stream g m a -- maps ---- --
-- >>> :t \f -> streamFold return effect (effect . liftM wrap . f) -- (Monad m, Functor f, Functor g) => -- (f (Stream g m a) -> m (g (Stream g m a))) -- -> Stream f m a -> Stream g m a -- mapped --streamFold :: (Functor f, Monad m) => (r -> b) -> (m b -> b) -> (f b -> b) -> Stream f m r -> b -- | Specialized fold following the usage of -- Control.Monad.Trans.Free -- --
-- iterTM alg = streamFold return (join . lift) --iterTM :: (Functor f, Monad m, MonadTrans t, Monad (t m)) => (f (t m a) -> t m a) -> Stream f m a -> t m a -- | Specialized fold following the usage of -- Control.Monad.Trans.Free -- --
-- iterT alg = streamFold return join alg --iterT :: (Functor f, Monad m) => (f (m a) -> m a) -> Stream f m a -> m a -- | Map a stream directly to its church encoding; compare -- Data.List.foldr destroy :: (Functor f, Monad m) => Stream f m r -> (f b -> b) -> (m b -> b) -> (r -> b) -> b -- | A left-strict pair; the base functor for streams of individual -- elements. data Of a b (:>) :: !a -> b -> Of a b -- | Note that lazily, strictly, fst', and -- mapOf are all so-called natural transformations on the -- primitive Of a functor If we write -- --
-- type f ~~> g = forall x . f x -> g x ---- -- then we can restate some types as follows: -- --
-- mapOf :: (a -> b) -> Of a ~~> Of b -- bifunctor lmap -- lazily :: Of a ~~> (,) a -- Identity . fst' :: Of a ~~> Identity a ---- -- Manipulation of a Stream f m r by mapping often turns on -- recognizing natural transformations of f. Thus maps -- is far more general the the map of the -- Streaming.Prelude, which can be defined thus: -- --
-- S.map :: (a -> b) -> Stream (Of a) m r -> Stream (Of b) m r -- S.map f = maps (mapOf f) ---- -- i.e. -- --
-- S.map f = maps (\(a :> x) -> (f a :> x)) ---- -- This rests on recognizing that mapOf is a natural -- transformation; note though that it results in such a transformation -- as well: -- --
-- S.map :: (a -> b) -> Stream (Of a) m ~> Stream (Of b) m ---- -- Thus we can maps it in turn -- --
-- --lazily :: Of a b -> (a, b) strictly :: (a, b) -> Of a b bracketStream :: (Functor f, MonadResource m) => IO a -> (a -> IO ()) -> (a -> Stream f m b) -> Stream f m b -- | A functor in the category of monads, using hoist as the analog -- of fmap: -- --
-- hoist (f . g) = hoist f . hoist g -- -- hoist id = id --class MFunctor (t :: (* -> *) -> * -> *) -- | Lift a monad morphism from m to n into a monad -- morphism from (t m) to (t n) hoist :: (MFunctor t, Monad m) => (forall a. m a -> n a) -> t m b -> t n b -- | A monad in the category of monads, using lift from -- MonadTrans as the analog of return and embed as -- the analog of (=<<): -- --
-- embed lift = id -- -- embed f (lift m) = f m -- -- embed g (embed f t) = embed (\m -> embed g (f m)) t --class (MFunctor t, MonadTrans t) => MMonad (t :: (* -> *) -> * -> *) -- | Embed a newly created MMonad layer within an existing layer -- -- embed is analogous to (=<<) embed :: (MMonad t, Monad n) => (forall a. m a -> t n a) -> t m b -> t n b -- | The class of monad transformers. Instances should satisfy the -- following laws, which state that lift is a monad -- transformation: -- -- class MonadTrans (t :: (* -> *) -> * -> *) -- | Lift a computation from the argument monad to the constructed monad. lift :: (MonadTrans t, Monad m) => m a -> t m a -- | Monads in which IO computations may be embedded. Any monad -- built by applying a sequence of monad transformers to the IO -- monad will be an instance of this class. -- -- Instances should satisfy the following laws, which state that -- liftIO is a transformer of monads: -- -- class Monad m => MonadIO (m :: * -> *) -- | Lift a computation from the IO monad. liftIO :: MonadIO m => IO a -> m a -- | Right-to-left composition of functors. The composition of applicative -- functors is always applicative, but the composition of monads is not -- always a monad. newtype Compose (f :: * -> *) (g :: * -> *) a :: (* -> *) -> (* -> *) -> * -> * Compose :: f (g a) -> Compose a [getCompose] :: Compose a -> f (g a) -- | Lifted sum of functors. data Sum (f :: * -> *) (g :: * -> *) a :: (* -> *) -> (* -> *) -> * -> * InL :: f a -> Sum a InR :: g a -> Sum a -- | Identity functor and monad. (a non-strict monad) newtype Identity a :: * -> * Identity :: a -> Identity a [runIdentity] :: Identity a -> a -- | A monoid on applicative functors. -- -- If defined, some and many should be the least solutions -- of the equations: -- -- class Applicative f => Alternative (f :: * -> *) -- | An associative binary operation (<|>) :: Alternative f => f a -> f a -> f a -- | A class for monads in which exceptions may be thrown. -- -- Instances should obey the following law: -- --
-- throwM e >> x = throwM e ---- -- In other words, throwing an exception short-circuits the rest of the -- monadic computation. class Monad m => MonadThrow (m :: * -> *) -- | Throw an exception. Note that this throws when this action is run in -- the monad m, not when it is applied. It is a generalization -- of Control.Exception's throwIO. -- -- Should satisfy the law: -- --
-- throwM e >> f = throwM e --throwM :: (MonadThrow m, Exception e) => e -> m a -- | A Monad which allows for safe resource allocation. In theory, -- any monad transformer stack which includes a ResourceT can be -- an instance of MonadResource. -- -- Note: runResourceT has a requirement for a -- MonadBaseControl IO m monad, which allows control operations -- to be lifted. A MonadResource does not have this requirement. -- This means that transformers such as ContT can be an instance -- of MonadResource. However, the ContT wrapper will -- need to be unwrapped before calling runResourceT. -- -- Since 0.3.0 class (MonadThrow m, MonadIO m, Applicative m, MonadBase IO m) => MonadResource (m :: * -> *) -- | Lift a ResourceT IO action into the current Monad. -- -- Since 0.4.0 liftResourceT :: MonadResource m => ResourceT IO a -> m a class (Applicative b, Applicative m, Monad b, Monad m) => MonadBase (b :: * -> *) (m :: * -> *) | m -> b -- | Lift a computation from the base monad liftBase :: MonadBase b m => b α -> m α -- | The Resource transformer. This transformer keeps track of all -- registered actions, and calls them upon exit (via -- runResourceT). Actions may be registered via -- register, or resources may be allocated atomically via -- allocate. allocate corresponds closely to -- bracket. -- -- Releasing may be performed before exit via the release -- function. This is a highly recommended optimization, as it will ensure -- that scarce resources are freed early. Note that calling -- release will deregister the action, so that a release action -- will only ever be called once. -- -- Since 0.3.0 data ResourceT (m :: * -> *) a :: (* -> *) -> * -> * -- | Unwrap a ResourceT transformer, and call all registered release -- actions. -- -- Note that there is some reference counting involved due to -- resourceForkIO. If multiple threads are sharing the same -- collection of resources, only the last call to runResourceT -- will deallocate the resources. -- -- Since 0.3.0 runResourceT :: MonadBaseControl IO m => ResourceT m a -> m a -- | The join function is the conventional monad join operator. It -- is used to remove one level of monadic structure, projecting its bound -- argument into the outer level. join :: Monad m => m (m a) -> m a -- | Promote a function to a monad. liftM :: Monad m => (a1 -> r) -> m a1 -> m r -- | Promote a function to a monad, scanning the monadic arguments from -- left to right. For example, -- --
-- liftM2 (+) [0,1] [0,2] = [0,2,1,3] -- liftM2 (+) (Just 1) Nothing = Nothing --liftM2 :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r -- | Lift a binary function to actions. liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c -- | Lift a ternary function to actions. liftA3 :: Applicative f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d -- | void value discards or ignores the result of -- evaluation, such as the return value of an IO action. -- --
-- >>> void Nothing -- Nothing -- -- >>> void (Just 3) -- Just () ---- -- Replace the contents of an Either Int -- Int with unit, resulting in an Either -- Int '()': -- --
-- >>> void (Left 8675309) -- Left 8675309 -- -- >>> void (Right 8675309) -- Right () ---- -- Replace every element of a list with unit: -- --
-- >>> void [1,2,3] -- [(),(),()] ---- -- Replace the second element of a pair with unit: -- --
-- >>> void (1,2) -- (1,()) ---- -- Discard the result of an IO action: -- --
-- >>> mapM print [1,2] -- 1 -- 2 -- [(),()] -- -- >>> void $ mapM print [1,2] -- 1 -- 2 --void :: Functor f => f a -> f () -- | An infix synonym for mappend. (<>) :: Monoid m => m -> m -> m