| Safe Haskell | Safe-Inferred |
|---|---|
| Language | Haskell2010 |
Pipes.Group
Description
Element-agnostic grouping utilities for pipes
See Pipes.Group.Tutorial for an extended tutorial
- groupsBy :: Monad m => (a' -> a' -> Bool) -> Lens (Producer a' m x) (Producer a m x) (FreeT (Producer a' m) m x) (FreeT (Producer a m) m x)
- groupsBy' :: Monad m => (a' -> a' -> Bool) -> Lens (Producer a' m x) (Producer a m x) (FreeT (Producer a' m) m x) (FreeT (Producer a m) m x)
- groups :: (Monad m, Eq a') => Lens (Producer a' m x) (Producer a m x) (FreeT (Producer a' m) m x) (FreeT (Producer a m) m x)
- chunksOf :: Monad m => Int -> Lens (Producer a' m x) (Producer a m x) (FreeT (Producer a' m) m x) (FreeT (Producer a m) m x)
- takes :: (Functor f, Monad m) => Int -> FreeT f m () -> FreeT f m ()
- takes' :: Monad m => Int -> FreeT (Producer a m) m x -> FreeT (Producer a m) m x
- drops :: Monad m => Int -> FreeT (Producer a m) m x -> FreeT (Producer a m) m x
- maps :: (Monad m, Functor g) => (forall r. f r -> g r) -> FreeT f m x -> FreeT g m x
- individually :: (Monad m, Functor g) => Setter (FreeT f m x) (FreeT g m x) (f (FreeT f m x)) (g (FreeT f m x))
- concats :: Monad m => FreeT (Producer a m) m x -> Producer a m x
- intercalates :: Monad m => Producer a m () -> FreeT (Producer a m) m x -> Producer a m x
- folds :: Monad m => (x -> a -> x) -> x -> (x -> b) -> FreeT (Producer a m) m r -> Producer b m r
- foldsM :: Monad m => (x -> a -> m x) -> m x -> (x -> m b) -> FreeT (Producer a m) m r -> Producer b m r
- module Control.Monad.Trans.Class
- module Control.Monad.Trans.Free
- module Pipes
Lenses
groupsBy :: Monad m => (a' -> a' -> Bool) -> Lens (Producer a' m x) (Producer a m x) (FreeT (Producer a' m) m x) (FreeT (Producer a m) m x) Source
groupsBy splits a Producer into a FreeT of Producers grouped using
the given equality predicate
>>>import Lens.Family (view)>>>import Pipes (yield, each)>>>import Pipes.Prelude (toList)>>>(toList . intercalates (yield '|') . view (groupsBy (==))) (each "12233345")"1|22|333|4|5"
You can think of this as:
groupsBy
:: Monad m
=> (a -> a -> Bool) -> Lens' (Producer a m x) (FreeT (Producer a m) m x)groupsBy' :: Monad m => (a' -> a' -> Bool) -> Lens (Producer a' m x) (Producer a m x) (FreeT (Producer a' m) m x) (FreeT (Producer a m) m x) Source
groupsBy' splits a Producer into a FreeT of Producers grouped using
the given equality predicate
This differs from groupsBy by comparing successive elements for equality
instead of comparing each element to the first member of the group
>>>import Lens.Family (view)>>>import Pipes (yield, each)>>>import Pipes.Prelude (toList)>>>let cmp c1 c2 = succ c1 == c2>>>(toList . intercalates (yield '|') . view (groupsBy' cmp)) (each "12233345")"12|23|3|345">>>(toList . intercalates (yield '|') . view (groupsBy cmp)) (each "12233345")"122|3|3|34|5"
You can think of this as:
groupsBy'
:: Monad m
=> (a -> a -> Bool)
-> Lens' (Producer a m x) (FreeT (Producer a m) m x)groups :: (Monad m, Eq a') => Lens (Producer a' m x) (Producer a m x) (FreeT (Producer a' m) m x) (FreeT (Producer a m) m x) Source
Like groupsBy, where the equality predicate is (==)
>>>import Lens.Family (view)>>>import Pipes (yield, each)>>>import Pipes.Prelude (toList)>>>(toList . intercalates (yield '|') . view groups) (each "12233345")"1|22|333|4|5"
You can think of this as:
groups
:: (Monad m, Eq a) => Lens' (Producer a m x) (FreeT (Producer a m) m x)chunksOf :: Monad m => Int -> Lens (Producer a' m x) (Producer a m x) (FreeT (Producer a' m) m x) (FreeT (Producer a m) m x) Source
chunksOf is an splits a Producer into a FreeT of Producers of fixed
length
>>>import Lens.Family (view)>>>import Pipes (yield, each)>>>import Pipes.Prelude (toList)>>>(toList . intercalates (yield '|') . view (chunksOf 3)) (each "12233345")"122|333|45"
You can think of this as:
chunksOf
:: Monad m => Int -> Lens' (Producer a m x) (FreeT (Producer a m) m x)Transformations
takes :: (Functor f, Monad m) => Int -> FreeT f m () -> FreeT f m () Source
(takes n) only keeps the first n functor layers of a FreeT
>>>import Lens.Family (view)>>>import Pipes (yield, each)>>>import Pipes.Prelude (toList)>>>(toList . intercalates (yield '|') . takes 3 . view groups) (each "12233345")"1|22|333"
You can think of this as:
takes
:: (Functor f, Monad m)
=> Int -> FreeT (Producer a m) m () -> FreeT (Producer a m) m ()drops :: Monad m => Int -> FreeT (Producer a m) m x -> FreeT (Producer a m) m x Source
(drops n) peels off the first n Producer layers of a FreeT
>>>import Lens.Family (view)>>>import Pipes (yield, each)>>>import Pipes.Prelude (toList)>>>(toList . intercalates (yield '|') . drops 3 . view groups) (each "12233345")"4|5"
Use carefully: the peeling off is not free. This runs the first n
layers, just discarding everything they produce.
maps :: (Monad m, Functor g) => (forall r. f r -> g r) -> FreeT f m x -> FreeT g m x Source
Transform each individual functor layer of a FreeT
You can think of this as:
maps
:: (forall r . Producer a m r -> Producer b m r)
-> FreeT (Producer a m) m x -> FreeT (Producer b m) m xThis is just a synonym for transFreeT
individually :: (Monad m, Functor g) => Setter (FreeT f m x) (FreeT g m x) (f (FreeT f m x)) (g (FreeT f m x)) Source
Lens to transform each individual functor layer of a FreeT
over individually = maps -- ... with a less general type
Joiners
Folds
These folds are designed to be compatible with the foldl library. See
the purely and impurely functions from that
library for more details.
For example, to count the number of Producer layers in a FreeT, you can
write:
import Control.Applicative (pure) import qualified Control.Foldl as L import Pipes.Group import qualified Pipes.Prelude as P count :: Monad m => FreeT (Producer a m) m () -> m Int count = P.sum . L.purely folds (pure 1)
Re-exports
Control.Monad.Trans.Class re-exports lift.
Control.Monad.Trans.Free re-exports FreeF and FreeT
module Control.Monad.Trans.Class
module Control.Monad.Trans.Free
module Pipes