Safe Haskell | Safe |
---|---|
Language | Haskell2010 |
Element-agnostic grouping utilities for pipes
See Pipes.Group.Tutorial for an extended tutorial
Some type signatures below refer to the aliases below, which are not used in this library, but are included to simplify the documentation.
type Groups a m x =FreeT
(Producer
a m) m x type Splitter a m x =Producer
a m x -> Groups a m x type Transformation a m x = Groups a m x -> Groups a m x type Joiner a m x = Groups a m x ->Producer
a 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)
- 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)
- 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
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 (==
)
groups :: Monad m => Lens' (Producer
a m x) (Groups a m x) view groups :: Monad m => Splitter a m x set groups :: Monad m => Groups a m x ->Producer
a m x ->Producer
a m x over groups :: Monad m => Transformation a m x ->Producer
a m x ->Producer
a m x
>>>
import Lens.Family (view)
>>>
import Pipes (yield, each)
>>>
import Pipes.Prelude (toList)
>>>
(toList . intercalates (yield '|') . view groups) (each "12233345")
"1|22|333|4|5"
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 Producer
s grouped using
the given equality predicate
groupsBy p :: Monad m => Lens' (Producer
a m x) (Groups a m x) view (groupsBy p) :: Monad m => Splitter a m x set (groupsBy p) :: Monad m => Groups a m x ->Producer
a m x ->Producer
a m x over (groupsBy p) :: Monad m => Transformation a m x ->Producer
a m x ->Producer
a m x
>>>
import Lens.Family (view)
>>>
import Pipes (yield, each)
>>>
import Pipes.Prelude (toList)
>>>
(toList . intercalates (yield '|') . view (groupsBy (==))) (each "12233345")
"1|22|333|4|5"
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 Producer
s 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"
groupsBy' p :: Monad m => Lens' (Producer
a m x) (Groups a m x) view (groupsBy' p) :: Monad m => Splitter a m x set (groupsBy' p) :: Monad m => Groups a m x ->Producer
a m x ->Producer
a m x over (groupsBy' p) :: Monad m => Transformation a m x ->Producer
a m x ->Producer
a 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 Producer
s of fixed
length
chunksOf n :: Monad m => Lens' (Producer
a m x) (Groups a m x) view (chunksOf n) :: Monad m => Splitter a m x set (chunksOf n) :: Monad m => Groups a m x ->Producer
a m x ->Producer
a m x over (chunksOf n) :: Monad m => Transformation a m x ->Producer
a m x ->Producer
a m x
>>>
import Lens.Family (view)
>>>
import Pipes (yield, each)
>>>
import Pipes.Prelude (toList)
>>>
(toList . intercalates (yield '|') . view (chunksOf 3)) (each "12233345")
"122|333|45"
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
takes :: Monad m => Int -> Groups a m () -> Groups a m ()
>>>
import Lens.Family (view)
>>>
import Pipes (yield, each)
>>>
import Pipes.Prelude (toList)
>>>
(toList . intercalates (yield '|') . takes 3 . view groups) (each "12233345")
"1|22|333"
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
drops :: Monad m => Int -> Transformation a m x
>>>
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 x
This 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
) is equivalent to individually
maps
, but with a less general type.
type Group a m x = Producer
a m (Groups a m x)
set individually :: Monad m => Group a m x -> Transformation a m x
over individually :: Monad m => (Group a m x -> Group a m x) -> Transformation a m x
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