HORIZON HASKELLDocslts/ghc-9.14.x45dd5372026-10-11Search names, modules, packages, or :: a typeCtrl K

GHC 9.14.1 · lts/ghc-9.14.x · 45dd537 · 2026-10-11

Modulestreamly-core-0.3.1Haskell2010

Streamly.Internal.Data.Pipe

There are three fundamental types that make up a stream pipeline:

  • Stream: sources

  • Scan: transformations

  • Fold: sinks

Streams are sources or producers of values, multiple sources can be merged into a single source but a source cannot be split into multiple stream sources. Folds are sinks or consumers, a stream can be split and distributed to multiple folds but the results cannot be merged back into a stream source again. Scans are simple one-to-one transformations with filtering. One element cannot be transformed to multiple elements.

The Pipe type is a super type of all the above, it is the most complex type. All of these can be represented by a pipe. A pipe can act as a source or a sink or a transformation, dynamically. A stream source can be split and distributed to multiple pipes each pipe can apply its own transform on the stream and the results can be merged back into a single pipe. Pipes can be attached to a source to produce a source or they can be attached to a fold to produce a fold, or multiple pipes can be merged or zipped into a single pipe.

import qualified Streamly.Internal.Data.Pipe as Pipe
  • 2 types
  • 11 values
valuecompose :: Monad m => Pipe m b c -> Pipe m a b -> Pipe m a c
#

Series composition. Compose two pipes such that the output of the second pipe is attached to the input of the first pipe.

Example1 expression
Stream.toList $ Stream.pipe (Pipe.map (+1) >>> Pipe.map (+1)) $ Stream.fromList [1..5::Int][3,4,5,6,7]
valuefilter :: Monad m => (a -> Bool) -> Pipe m a a
#

A filtering pipe using a pure predicate.

Example1 expression
Stream.toList $ Stream.pipe (Pipe.filter odd) $ Stream.fromList [1..5::Int][1,3,5]
valuefromFold :: Monad m => Fold m a b -> Pipe m a b
#

Create a singleton pipe from a fold.

Pipes do not support finalization yet. This does not finalize the fold when the stream stops before the fold terminates. So cannot be used on folds that require such finalization.

> Stream.toList $ Stream.pipe (Pipe.fromFold Fold.sum) $ Stream.fromList [1..5::Int]
15
valueidentity :: Monad m => Pipe m a a
#

An identity pipe producing the same output as input.

Example1 expression
identity = Pipe.map Prelude.id
Example1 expression
Stream.toList $ Stream.pipe (Pipe.identity) $ Stream.fromList [1..5::Int][1,2,3,4,5]
valuemap :: Monad m => (a -> b) -> Pipe m a b
#

A pipe representing mapping of a pure function.

Example1 expression
Stream.toList $ Stream.pipe (Pipe.map (+1)) $ Stream.fromList [1..5::Int][2,3,4,5,6]
valuemapM :: Monad m => (a -> m b) -> Pipe m a b
#

A pipe representing mapping of a monadic action.

Example1 expression
Stream.toList $ Stream.pipe (Pipe.mapM print) $ Stream.fromList [1..5::Int]12345[(),(),(),(),()]
valuescanFold :: Monad m => Fold m a b -> Pipe m a b
#

Pipes do not support finalization yet. This does not finalize the fold when the stream stops before the fold terminates. So cannot be used on folds that require finalization.

Example1 expression
Stream.toList $ Stream.pipe (Pipe.scanFold Fold.sum) $ Stream.fromList [1..5::Int][1,3,6,10,15]
valueteeMerge :: Monad m => Pipe m a b -> Pipe m a b -> Pipe m a b
#

Parallel composition. Distribute the input across two pipes and merge their outputs.

Example1 expression
Stream.toList $ Stream.pipe (Pipe.teeMerge Pipe.identity (Pipe.map (\x -> x * x))) $ Stream.fromList [1..5::Int][1,1,2,4,3,9,4,16,5,25]
datadata Pipe (m :: Type -> Type) a b
#

Represents a stateful transformation over an input stream of values of type a to outputs of type b in Monad m.

The constructor is Pipe consume produce initial.

Constructors

  • forall cs ps. Pipe (cs -> a -> m (Step cs ps b)) (ps -> m (Step cs ps b)) cs
Instances3Category, Functor, Semigroup
  • Monad m => Category (Pipe m)Defined in streamly-core-0.3.1 · Streamly.Internal.Data.Pipe.Type

    "." composes the pipes in series.

  • Functor m => Functor (Pipe m a)Defined in streamly-core-0.3.1 · Streamly.Internal.Data.Pipe.Type

    fmap maps a pure function on a scan output.

    Example1 expression
    Stream.toList $ Stream.pipe (fmap (+1) Pipe.identity) $ Stream.fromList [1..5::Int][2,3,4,5,6]
  • Monad m => Semigroup (Pipe m a b)Defined in streamly-core-0.3.1 · Streamly.Internal.Data.Pipe.Type

    <> composes the pipes in parallel.

datadata Step cs ps b
#

Constructors

  • YieldC cs b

    Yield and consume

  • SkipC cs

    Skip and consume

  • Stop

    when consuming, Stop means input remains unused Therefore, Stop should not be used when we are processing an input, instead use YieldP and then Stop.

  • YieldP ps b

    Yield and produce

  • SkipP ps

    Skip and produce

Instances1Functor
  • Functor (Step cs ps)Defined in streamly-core-0.3.1 · Streamly.Internal.Data.Pipe.Type