Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell98 |
This module builds on module Control.Foldl, adding stateful transducers and grouping operations.
- type Transduction a b = forall x. Fold b x -> Fold a x
- type Transduction' a b r = forall x. Fold b x -> Fold a (r, x)
- data Transducer i o r = forall x . Transducer (x -> i -> (x, [o], [[o]])) x (x -> (r, [o]))
- type TransductionM m a b = forall x. Monad m => FoldM m b x -> FoldM m a x
- type TransductionM' m a b r = forall x. FoldM m b x -> FoldM m a (r, x)
- data TransducerM m i o r = forall x . TransducerM (x -> i -> m (x, [o], [[o]])) (m x) (x -> m (r, [o]))
- transduce :: Transducer i o r -> Transduction i o
- transduce' :: Transducer i o x -> Transduction' i o x
- transduceM :: Monad m => TransducerM m i o r -> TransductionM m i o
- transduceM' :: Monad m => TransducerM m i o x -> TransductionM' m i o x
- groups :: Transducer i i' r -> Transduction i' b -> Transduction i b
- groups' :: Transducer i i' s -> Fold u v -> Transduction' i' a u -> Transduction' i a (s, v)
- groupsM :: Monad m => TransducerM m i i' s -> TransductionM m i' b -> TransductionM m i b
- groupsM' :: Monad m => TransducerM m i i' s -> FoldM m u v -> TransductionM' m i' a u -> TransductionM' m i a (s, v)
- folds :: Transducer i i' r -> Fold i' b -> Transduction i b
- folds' :: Transducer i i' s -> Fold i' b -> Transduction' i b s
- foldsM :: (Applicative m, Monad m) => TransducerM m i i' r -> FoldM m i' b -> TransductionM m i b
- foldsM' :: (Applicative m, Monad m) => TransducerM m i i' s -> FoldM m i' b -> TransductionM' m i b s
- surround :: (Foldable p, Foldable s) => p a -> s a -> Transducer a a ()
- surroundIO :: (Foldable p, Foldable s, Functor m, MonadIO m) => m (p a) -> m (s a) -> TransducerM m a a ()
- chunksOf :: Int -> Transducer a a ()
- _generalize :: Monad m => Transducer i o r -> TransducerM m i o r
- _simplify :: TransducerM Identity i o r -> Transducer i o r
- foldify :: Transducer i o r -> Fold i r
- foldifyM :: Functor m => TransducerM m i o r -> FoldM m i r
- hoistTransducer :: Monad m => (forall a. m a -> n a) -> TransducerM m i o r -> TransducerM n i o r
- hoistFold :: Monad m => (forall a. m a -> n a) -> FoldM m i r -> FoldM n i r
- module Data.Functor.Extend
- module Control.Foldl
Transducer types
type Transduction a b = forall x. Fold b x -> Fold a x Source
A (possibly stateful) transformation on the inputs of a Fold
.
Functions constructed with combinators like premap
or handles
from
Control.Foldl also typecheck as a Transduction
.
type Transduction' a b r = forall x. Fold b x -> Fold a (r, x) Source
A more general from of Transduction
that adds new information to the
return value of the Fold
.
data Transducer i o r Source
A stateful process that transforms a stream of inputs into a stream of outputs, and may optionally demarcate groups in the stream of outputs.
Composed of a step function, an initial state, and a extraction function.
The step function returns a triplet of:
- The new internal state.
- Outputs that continues the last segment detected in the previous step.
A list of lists containing outputs for segments detected in the current step. If the list is empty, that means no splitting has taken place in the current step.
Transducer
s that do not perform grouping never return anything other than[]
here. In effect, they treat the whole stream as a single group.The extraction function returns the
Transducer
s own result value, as well as any pending outputs.
forall x . Transducer (x -> i -> (x, [o], [[o]])) x (x -> (r, [o])) |
Bifunctor (Transducer i) | |
Functor (Transducer i o) |
type TransductionM m a b = forall x. Monad m => FoldM m b x -> FoldM m a x Source
Like Transduction
, but works on monadic Fold
s.
type TransductionM' m a b r = forall x. FoldM m b x -> FoldM m a (r, x) Source
Like Transduction'
, but works on monadic Fold
s.
data TransducerM m i o r Source
Like Transducer
, but monadic.
forall x . TransducerM (x -> i -> m (x, [o], [[o]])) (m x) (x -> m (r, [o])) |
(Functor m, Monad m) => Bifunctor (TransducerM m i) | |
Monad m => Functor (TransducerM m i o) |
Applying transducers
transduce :: Transducer i o r -> Transduction i o Source
Apply a Transducer
to a Fold
, discarding the return value of the
Transducer
.
>>>
L.fold (transduce (Transducer (\_ i -> ((),[i],[])) () (\_ -> ('r',[]))) L.list) [1..7]
[1,2,3,4,5,6,7]
transduce' :: Transducer i o x -> Transduction' i o x Source
Generalized version of transduce
that preserves the return value of
the Transducer
.
>>>
L.fold (transduce' (Transducer (\_ i -> ((),[i],[])) () (\_ -> ('r',[]))) L.list) [1..7]
('r',[1,2,3,4,5,6,7])
transduceM :: Monad m => TransducerM m i o r -> TransductionM m i o Source
transduceM' :: Monad m => TransducerM m i o x -> TransductionM' m i o x Source
Like transduce'
, but works on monadic Fold
s.
Working with groups
groups :: Transducer i i' r -> Transduction i' b -> Transduction i b Source
Repeatedly applies a Transduction
to process each of the groups
demarcated by a Transducer
, returning a Fold
what works over the
undivided stream of inputs. The return value of the Transducer
is
discarded.
>>>
L.fold (groups (chunksOf 2) (transduce (surround "<" ">")) L.list) "aabbccdd"
"<aa><bb><cc><dd>"
:: Transducer i i' s | |
-> Fold u v | auxiliary |
-> Transduction' i' a u | repeatedly applied for processing each group |
-> Transduction' i a (s, v) |
Generalized version of groups
that preserves the return value of the
Transducer
.
A summary value for each group is also calculated. They are aggregated for
the whole stream, with the help of an auxiliary Fold
.
>>>
L.fold (groups' (chunksOf 2) L.list (\f -> transduce (surround "<" ">") (liftA2 (,) L.list f)) L.list) "aabbccdd"
(((),["<aa>","<bb>","<cc>","<dd>"]),"<aa><bb><cc><dd>")
groupsM :: Monad m => TransducerM m i i' s -> TransductionM m i' b -> TransductionM m i b Source
Monadic version of groups
.
groupsM' :: Monad m => TransducerM m i i' s -> FoldM m u v -> TransductionM' m i' a u -> TransductionM' m i a (s, v) Source
Monadic version of groups'
.
folds :: Transducer i i' r -> Fold i' b -> Transduction i b Source
Summarizes each of the groups demarcated by the Transducer
using a
Fold
.
The result value of the Transducer
is discarded.
folds' :: Transducer i i' s -> Fold i' b -> Transduction' i b s Source
Like folds
, but preserves the return value of the Transducer
.
foldsM :: (Applicative m, Monad m) => TransducerM m i i' r -> FoldM m i' b -> TransductionM m i b Source
Monadic version of folds
.
foldsM' :: (Applicative m, Monad m) => TransducerM m i i' s -> FoldM m i' b -> TransductionM' m i b s Source
Monadic version of folds'
.
Transducers
surround :: (Foldable p, Foldable s) => p a -> s a -> Transducer a a () Source
Adds a prefix and a suffix to the stream arriving into a Fold
.
>>>
L.fold (transduce (surround "prefix" "suffix") L.list) "middle"
"prefixmiddlesuffix"
surroundIO :: (Foldable p, Foldable s, Functor m, MonadIO m) => m (p a) -> m (s a) -> TransducerM m a a () Source
Splitters
chunksOf :: Int -> Transducer a a () Source
Splits a stream into chunks of fixed size.
>>>
L.fold (folds (chunksOf 2) L.list L.list) [1..7]
[[1,2],[3,4],[5,6],[7]]
>>>
L.fold (groups (chunksOf 2) (transduce (surround [] [0])) L.list) [1..7]
[1,2,0,3,4,0,5,6,0,7,0]
Transducer utilities
_generalize :: Monad m => Transducer i o r -> TransducerM m i o r Source
Generalize a Transducer
to a TransducerM
.
_simplify :: TransducerM Identity i o r -> Transducer i o r Source
Simplify a pure TransducerM
to a Transducer
.
foldify :: Transducer i o r -> Fold i r Source
Transforms a Transducer
into a Fold
by forgetting about the data sent
downstream.
hoistTransducer :: Monad m => (forall a. m a -> n a) -> TransducerM m i o r -> TransducerM n i o r Source
Changes the base monad used by a TransducerM
.
hoistFold :: Monad m => (forall a. m a -> n a) -> FoldM m i r -> FoldM n i r Source
Changes the base monad used by a FoldM
.
Re-exports
module Data.Functor.Extend
module Control.Foldl