| Portability | Rank2Types | 
|---|---|
| Stability | provisional | 
| Maintainer | Edward Kmett <ekmett@gmail.com> | 
| Safe Haskell | Safe-Infered | 
Control.Lens.Fold
Contents
Description
A Fold a cFoldable. It allows
 you to extract multiple results from a container. A Foldable container
 can be characterized by the behavior of
 foldMap :: (.
 Since we want to be able to work with monomorphic containers, we could
 generalize this signature to Foldable t, Monoid m) => (c -> m) -> t c -> mforall m. ,
 and then decorate it with Monoid m => (c -> m) -> a -> mAccessor to obtain
typeFolda c = forall m.Monoidm =>Gettingm a c
Every Getter is a valid Fold that simply doesn't use the Monoid
 it is passed.
In practice the type we use is slightly more complicated to allow for
 better error messages and for it to be transformed by certain 
 Applicative transformers.
Everything you can do with a Foldable container, you can with with a Fold and there are
 combinators that generalize the usual Foldable operations here.
- type Fold a c = forall f. (Gettable f, Applicative f) => (c -> f c) -> a -> f a
- folding :: (Foldable f, Applicative g, Gettable g) => (a -> f c) -> LensLike g a b c d
- folded :: Foldable f => Fold (f c) c
- unfolded :: (b -> Maybe (a, b)) -> Fold b a
- iterated :: (a -> a) -> Fold a a
- filtered :: (Gettable f, Applicative f) => (c -> Bool) -> SimpleLensLike f a c -> SimpleLensLike f a c
- backwards :: LensLike (Backwards f) a b c d -> LensLike f a b c d
- repeated :: Fold a a
- replicated :: Int -> Fold a a
- cycled :: (Applicative f, Gettable f) => SimpleLensLike f a c -> SimpleLensLike f a c
- takingWhile :: (Gettable f, Applicative f) => (c -> Bool) -> Getting (Endo (f a)) a c -> SimpleLensLike f a c
- droppingWhile :: (Gettable f, Applicative f) => (c -> Bool) -> Getting (Endo (f a)) a c -> SimpleLensLike f a c
- foldMapOf :: Getting r a c -> (c -> r) -> a -> r
- foldOf :: Getting c a c -> a -> c
- foldrOf :: Getting (Endo e) a c -> (c -> e -> e) -> e -> a -> e
- foldlOf :: Getting (Dual (Endo e)) a c -> (e -> c -> e) -> e -> a -> e
- toListOf :: Getting [c] a c -> a -> [c]
- anyOf :: Getting Any a c -> (c -> Bool) -> a -> Bool
- allOf :: Getting All a c -> (c -> Bool) -> a -> Bool
- andOf :: Getting All a Bool -> a -> Bool
- orOf :: Getting Any a Bool -> a -> Bool
- productOf :: Getting (Product c) a c -> a -> c
- sumOf :: Getting (Sum c) a c -> a -> c
- traverseOf_ :: Functor f => Getting (Traversed f) a c -> (c -> f e) -> a -> f ()
- forOf_ :: Functor f => Getting (Traversed f) a c -> a -> (c -> f e) -> f ()
- sequenceAOf_ :: Functor f => Getting (Traversed f) a (f ()) -> a -> f ()
- mapMOf_ :: Monad m => Getting (Sequenced m) a c -> (c -> m e) -> a -> m ()
- forMOf_ :: Monad m => Getting (Sequenced m) a c -> a -> (c -> m e) -> m ()
- sequenceOf_ :: Monad m => Getting (Sequenced m) a (m c) -> a -> m ()
- asumOf :: Alternative f => Getting (Endo (f c)) a (f c) -> a -> f c
- msumOf :: MonadPlus m => Getting (Endo (m c)) a (m c) -> a -> m c
- concatMapOf :: Getting [e] a c -> (c -> [e]) -> a -> [e]
- concatOf :: Getting [e] a [e] -> a -> [e]
- elemOf :: Eq c => Getting Any a c -> c -> a -> Bool
- notElemOf :: Eq c => Getting All a c -> c -> a -> Bool
- lengthOf :: Getting (Sum Int) a c -> a -> Int
- nullOf :: Getting All a c -> a -> Bool
- headOf :: Getting (First c) a c -> a -> Maybe c
- lastOf :: Getting (Last c) a c -> a -> Maybe c
- maximumOf :: Getting (Max c) a c -> a -> Maybe c
- minimumOf :: Getting (Min c) a c -> a -> Maybe c
- maximumByOf :: Getting (Endo (Maybe c)) a c -> (c -> c -> Ordering) -> a -> Maybe c
- minimumByOf :: Getting (Endo (Maybe c)) a c -> (c -> c -> Ordering) -> a -> Maybe c
- findOf :: Getting (First c) a c -> (c -> Bool) -> a -> Maybe c
- foldrOf' :: Getting (Dual (Endo (e -> e))) a c -> (c -> e -> e) -> e -> a -> e
- foldlOf' :: Getting (Endo (e -> e)) a c -> (e -> c -> e) -> e -> a -> e
- foldr1Of :: Getting (Endo (Maybe c)) a c -> (c -> c -> c) -> a -> c
- foldl1Of :: Getting (Dual (Endo (Maybe c))) a c -> (c -> c -> c) -> a -> c
- foldrMOf :: Monad m => Getting (Dual (Endo (e -> m e))) a c -> (c -> e -> m e) -> e -> a -> m e
- foldlMOf :: Monad m => Getting (Endo (e -> m e)) a c -> (e -> c -> m e) -> e -> a -> m e
Folds
type Fold a c = forall f. (Gettable f, Applicative f) => (c -> f c) -> a -> f aSource
A Fold describes how to retrieve multiple values in a way that can be composed
 with other lens-like constructions.
A Fold a cFoldable
 typeclass, see foldMapOf and the other Fold combinators.
By convention, if there exists a foo method that expects a Foldable (f c)fooOf method that takes a Fold a ca.
A Getter is a legal Fold that just ignores the supplied Monoid
Unlike a Traversal a Fold is read-only. Since a Fold cannot be used to write back
 there are no lens laws that apply.
Building Folds
iterated :: (a -> a) -> Fold a aSource
x ^.  Return an infinite fold of repeated applications of iterated ff to x.
toListOf (iterated f) a = iterate f a
filtered :: (Gettable f, Applicative f) => (c -> Bool) -> SimpleLensLike f a c -> SimpleLensLike f a cSource
replicated :: Int -> Fold a aSource
A fold that replicates its input n times.
replicaten =toListOf(replicatedn)
cycled :: (Applicative f, Gettable f) => SimpleLensLike f a c -> SimpleLensLike f a cSource
Transform a fold into a fold that loops over its elements over and over.
>>>import Control.Lens>>>take 6 $ toListOf (cycled traverse) [1,2,3][1,2,3,1,2,3]
takingWhile :: (Gettable f, Applicative f) => (c -> Bool) -> Getting (Endo (f a)) a c -> SimpleLensLike f a cSource
droppingWhile :: (Gettable f, Applicative f) => (c -> Bool) -> Getting (Endo (f a)) a c -> SimpleLensLike f a cSource
Folding
foldMapOf :: Getting r a c -> (c -> r) -> a -> rSource
foldMap=foldMapOffolded
foldMapOf=views
foldMapOf ::Gettera c -> (c -> r) -> a -> r foldMapOf ::Monoidr =>Folda c -> (c -> r) -> a -> r foldMapOf ::SimpleLensa c -> (c -> r) -> a -> r foldMapOf ::SimpleIsoa c -> (c -> r) -> a -> r foldMapOf ::Monoidr =>SimpleTraversala c -> (c -> r) -> a -> r
foldrOf :: Getting (Endo e) a c -> (c -> e -> e) -> e -> a -> eSource
Right-associative fold of parts of a structure that are viewed through a Lens, Getter, Fold or Traversal.
foldr=foldrOffolded
foldrOf ::Gettera c -> (c -> e -> e) -> e -> a -> e foldrOf ::Folda c -> (c -> e -> e) -> e -> a -> e foldrOf ::SimpleLensa c -> (c -> e -> e) -> e -> a -> e foldrOf ::SimpleIsoa c -> (c -> e -> e) -> e -> a -> e foldrOf ::SimpleTraversala c -> (c -> e -> e) -> e -> a -> e
foldlOf :: Getting (Dual (Endo e)) a c -> (e -> c -> e) -> e -> a -> eSource
Left-associative fold of the parts of a structure that are viewed through a Lens, Getter, Fold or Traversal.
foldl=foldlOffolded
foldlOf ::Gettera c -> (e -> c -> e) -> e -> a -> e foldlOf ::Folda c -> (e -> c -> e) -> e -> a -> e foldlOf ::SimpleLensa c -> (e -> c -> e) -> e -> a -> e foldlOf ::SimpleIsoa c -> (e -> c -> e) -> e -> a -> e foldlOf ::SimpleTraversala c -> (e -> c -> e) -> e -> a -> e
traverseOf_ :: Functor f => Getting (Traversed f) a c -> (c -> f e) -> a -> f ()Source
When passed a Getter, traverseOf_ can work over a Functor.
When passed a Fold, traverseOf_ requires an Applicative.
traverse_=traverseOf_folded
traverseOf__2::Functorf => (c -> f e) -> (c1, c) -> f ()
traverseOf_traverseLeft::Applicativef => (a -> f b) ->Eithera c -> f ()
The rather specific signature of traverseOf_ allows it to be used as if the signature was either:
traverseOf_ ::Functorf =>Gettera c -> (c -> f e) -> a -> f () traverseOf_ ::Applicativef =>Folda c -> (c -> f e) -> a -> f () traverseOf_ ::Functorf =>SimpleLensa c -> (c -> f e) -> a -> f () traverseOf_ ::Functorf =>SimpleIsoa c -> (c -> f e) -> a -> f () traverseOf_ ::Applicativef =>SimpleTraversala c -> (c -> f e) -> a -> f ()
forOf_ :: Functor f => Getting (Traversed f) a c -> a -> (c -> f e) -> f ()Source
for_=forOf_folded
forOf_ ::Functorf =>Gettera c -> a -> (c -> f e) -> f () forOf_ ::Applicativef =>Folda c -> a -> (c -> f e) -> f () forOf_ ::Functorf =>SimpleLensa c -> a -> (c -> f e) -> f () forOf_ ::Functorf =>SimpleIsoa c -> a -> (c -> f e) -> f () forOf_ ::Applicativef =>SimpleTraversala c -> a -> (c -> f e) -> f ()
sequenceAOf_ :: Functor f => Getting (Traversed f) a (f ()) -> a -> f ()Source
sequenceA_=sequenceAOf_folded
sequenceAOf_ ::Functorf =>Gettera (f ()) -> a -> f () sequenceAOf_ ::Applicativef =>Folda (f ()) -> a -> f () sequenceAOf_ ::Functorf =>SimpleLensa (f ()) -> a -> f () sequenceAOf_ ::Functorf =>SimpleIsoa (f ()) -> a -> f () sequenceAOf_ ::Applicativef =>SimpleTraversala (f ()) -> a -> f ()
mapMOf_ :: Monad m => Getting (Sequenced m) a c -> (c -> m e) -> a -> m ()Source
mapM_=mapMOf_folded
mapMOf_ ::Monadm =>Gettera c -> (c -> m e) -> a -> m () mapMOf_ ::Monadm =>Folda c -> (c -> m e) -> a -> m () mapMOf_ ::Monadm =>SimpleLensa c -> (c -> m e) -> a -> m () mapMOf_ ::Monadm =>SimpleIsoa c -> (c -> m e) -> a -> m () mapMOf_ ::Monadm =>SimpleTraversala c -> (c -> m e) -> a -> m ()
forMOf_ :: Monad m => Getting (Sequenced m) a c -> a -> (c -> m e) -> m ()Source
forM_=forMOf_folded
forMOf_ ::Monadm =>Gettera c -> a -> (c -> m e) -> m () forMOf_ ::Monadm =>Folda c -> a -> (c -> m e) -> m () forMOf_ ::Monadm =>SimpleLensa c -> a -> (c -> m e) -> m () forMOf_ ::Monadm =>SimpleIsoa c -> a -> (c -> m e) -> m () forMOf_ ::Monadm =>SimpleTraversala c -> a -> (c -> m e) -> m ()
sequenceOf_ :: Monad m => Getting (Sequenced m) a (m c) -> a -> m ()Source
sequence_=sequenceOf_folded
sequenceOf_ ::Monadm =>Gettera (m b) -> a -> m () sequenceOf_ ::Monadm =>Folda (m b) -> a -> m () sequenceOf_ ::Monadm =>SimpleLensa (m b) -> a -> m () sequenceOf_ ::Monadm =>SimpleIsoa (m b) -> a -> m () sequenceOf_ ::Monadm =>SimpleTraversala (m b) -> a -> m ()
asumOf :: Alternative f => Getting (Endo (f c)) a (f c) -> a -> f cSource
The sum of a collection of actions, generalizing concatOf.
asum=asumOffolded
asumOf ::Alternativef =>Gettera c -> a -> f c asumOf ::Alternativef =>Folda c -> a -> f c asumOf ::Alternativef =>SimpleLensa c -> a -> f c asumOf ::Alternativef =>SimpleIsoa c -> a -> f c asumOf ::Alternativef =>SimpleTraversala c -> a -> f c
msumOf :: MonadPlus m => Getting (Endo (m c)) a (m c) -> a -> m cSource
The sum of a collection of actions, generalizing concatOf.
msum=msumOffolded
msumOf ::MonadPlusm =>Gettera c -> a -> m c msumOf ::MonadPlusm =>Folda c -> a -> m c msumOf ::MonadPlusm =>SimpleLensa c -> a -> m c msumOf ::MonadPlusm =>SimpleIsoa c -> a -> m c msumOf ::MonadPlusm =>SimpleTraversala c -> a -> m c
concatMapOf :: Getting [e] a c -> (c -> [e]) -> a -> [e]Source
concatMap=concatMapOffolded
concatMapOf ::Gettera c -> (c -> [e]) -> a -> [e] concatMapOf ::Folda c -> (c -> [e]) -> a -> [e] concatMapOf ::SimpleLensa c -> (c -> [e]) -> a -> [e] concatMapOf ::SimpleIsoa c -> (c -> [e]) -> a -> [e] concatMapOf ::SimpleTraversala c -> (c -> [e]) -> a -> [e]
lengthOf :: Getting (Sum Int) a c -> a -> IntSource
Note: this can be rather inefficient for large containers.
length=lengthOffolded
>>>lengthOf _1 ("hello",())1
lengthOf(folded.folded) ::Foldablef => f (g a) ->Int
lengthOf ::Gettera c -> a ->IntlengthOf ::Folda c -> a ->IntlengthOf ::SimpleLensa c -> a ->IntlengthOf ::SimpleIsoa c -> a ->IntlengthOf ::SimpleTraversala c -> a ->Int
nullOf :: Getting All a c -> a -> BoolSource
Returns True if this Fold or Traversal has no targets in the given container.
Note: nullOf on a valid Iso, Lens or Getter should always return False
null=nullOffolded
This may be rather inefficient compared to the null check of many containers.
>>>nullOf _1 (1,2)False
nullOf(folded._1.folded) ::Foldablef => f (g a, b) ->Bool
nullOf ::Gettera c -> a ->BoolnullOf ::Folda c -> a ->BoolnullOf ::SimpleIsoa c -> a ->BoolnullOf ::SimpleLensa c -> a ->BoolnullOf ::SimpleTraversala c -> a ->Bool
headOf :: Getting (First c) a c -> a -> Maybe cSource
Perform a safe head of a Fold or Traversal or retrieve Just the result
 from a Getter or Lens.
listToMaybe.toList=headOffolded
headOf ::Gettera c -> a ->Maybec headOf ::Folda c -> a ->Maybec headOf ::SimpleLensa c -> a ->Maybec headOf ::SimpleIsoa c -> a ->Maybec headOf ::SimpleTraversala c -> a ->Maybec
maximumOf :: Getting (Max c) a c -> a -> Maybe cSource
Obtain the maximum element (if any) targeted by a Fold or Traversal
Note: maximumOf on a valid Iso, Lens or Getter will always return Just a value.
maximum=fromMaybe(errorempty) .maximumOffolded
maximumOf ::Gettera c -> a ->Maybec maximumOf ::Ordc =>Folda c -> a ->Maybec maximumOf ::SimpleIsoa c -> a ->Maybec maximumOf ::SimpleLensa c -> a ->Maybec maximumOf ::Ordc =>SimpleTraversala c -> a ->Maybec
minimumOf :: Getting (Min c) a c -> a -> Maybe cSource
Obtain the minimum element (if any) targeted by a Fold or Traversal
Note: minimumOf on a valid Iso, Lens or Getter will always return Just a value.
minimum=fromMaybe(errorempty) .minimumOffolded
minimumOf ::Gettera c -> a ->Maybec minimumOf ::Ordc =>Folda c -> a ->Maybec minimumOf ::SimpleIsoa c -> a ->Maybec minimumOf ::SimpleLensa c -> a ->Maybec minimumOf ::Ordc =>SimpleTraversala c -> a ->Maybec
maximumByOf :: Getting (Endo (Maybe c)) a c -> (c -> c -> Ordering) -> a -> Maybe cSource
Obtain the maximum element (if any) targeted by a Fold, Traversal, Lens, Iso,
 or Getter according to a user supplied ordering.
maximumBycmp =fromMaybe(errorempty) .maximumByOffoldedcmp
maximumByOf ::Gettera c -> (c -> c ->Ordering) -> a ->Maybec maximumByOf ::Folda c -> (c -> c ->Ordering) -> a ->Maybec maximumByOf ::SimpleIsoa c -> (c -> c ->Ordering) -> a ->Maybec maximumByOf ::SimpleLensa c -> (c -> c ->Ordering) -> a ->Maybec maximumByOf ::SimpleTraversala c -> (c -> c ->Ordering) -> a ->Maybec
minimumByOf :: Getting (Endo (Maybe c)) a c -> (c -> c -> Ordering) -> a -> Maybe cSource
Obtain the minimum element (if any) targeted by a Fold, Traversal, Lens, Iso
 or Getter according to a user supplied ordering.
minimumBy cmp = fromMaybe (error "empty") . minimumByOf folded cmp
minimumByOf ::Gettera c -> (c -> c ->Ordering) -> a ->Maybec minimumByOf ::Folda c -> (c -> c ->Ordering) -> a ->Maybec minimumByOf ::SimpleIsoa c -> (c -> c ->Ordering) -> a ->Maybec minimumByOf ::SimpleLensa c -> (c -> c ->Ordering) -> a ->Maybec minimumByOf ::SimpleTraversala c -> (c -> c ->Ordering) -> a ->Maybec
findOf :: Getting (First c) a c -> (c -> Bool) -> a -> Maybe cSource
The findOf function takes a Lens (or Getter, Iso, Fold, or Traversal),
 a predicate and a structure and returns the leftmost element of the structure
 matching the predicate, or Nothing if there is no such element.
findOf ::Gettera c -> (c ->Bool) -> a ->Maybec findOf ::Folda c -> (c ->Bool) -> a ->Maybec findOf ::SimpleIsoa c -> (c ->Bool) -> a ->Maybec findOf ::SimpleLensa c -> (c ->Bool) -> a ->Maybec findOf ::SimpleTraversala c -> (c ->Bool) -> a ->Maybec
foldrOf' :: Getting (Dual (Endo (e -> e))) a c -> (c -> e -> e) -> e -> a -> eSource
Strictly fold right over the elements of a structure.
foldr'=foldrOf'folded
foldrOf' ::Gettera c -> (c -> e -> e) -> e -> a -> e foldrOf' ::Folda c -> (c -> e -> e) -> e -> a -> e foldrOf' ::SimpleIsoa c -> (c -> e -> e) -> e -> a -> e foldrOf' ::SimpleLensa c -> (c -> e -> e) -> e -> a -> e foldrOf' ::SimpleTraversala c -> (c -> e -> e) -> e -> a -> e
foldlOf' :: Getting (Endo (e -> e)) a c -> (e -> c -> e) -> e -> a -> eSource
Fold over the elements of a structure, associating to the left, but strictly.
foldl'=foldlOf'folded
foldlOf' ::Gettera c -> (e -> c -> e) -> e -> a -> e foldlOf' ::Folda c -> (e -> c -> e) -> e -> a -> e foldlOf' ::SimpleIsoa c -> (e -> c -> e) -> e -> a -> e foldlOf' ::SimpleLensa c -> (e -> c -> e) -> e -> a -> e foldlOf' ::SimpleTraversala c -> (e -> c -> e) -> e -> a -> e
foldr1Of :: Getting (Endo (Maybe c)) a c -> (c -> c -> c) -> a -> cSource
A variant of foldrOf that has no base case and thus may only be applied
 to lenses and structures such that the lens views at least one element of
 the structure.
foldr1Ofl f =foldr1f .toListOfl
foldr1=foldr1Offolded
foldr1Of ::Gettera c -> (c -> c -> c) -> a -> c foldr1Of ::Folda c -> (c -> c -> c) -> a -> c foldr1Of ::SimpleIsoa c -> (c -> c -> c) -> a -> c foldr1Of ::SimpleLensa c -> (c -> c -> c) -> a -> c foldr1Of ::SimpleTraversala c -> (c -> c -> c) -> a -> c
foldl1Of :: Getting (Dual (Endo (Maybe c))) a c -> (c -> c -> c) -> a -> cSource
A variant of foldlOf that has no base case and thus may only be applied to lenses and strutures such
 that the lens views at least one element of the structure.
foldl1Ofl f =foldl1Ofl f .toList
foldl1=foldl1Offolded
foldl1Of ::Gettera c -> (c -> c -> c) -> a -> c foldl1Of ::Folda c -> (c -> c -> c) -> a -> c foldl1Of ::SimpleIsoa c -> (c -> c -> c) -> a -> c foldl1Of ::SimpleLensa c -> (c -> c -> c) -> a -> c foldl1Of ::SimpleTraversala c -> (c -> c -> c) -> a -> c
foldrMOf :: Monad m => Getting (Dual (Endo (e -> m e))) a c -> (c -> e -> m e) -> e -> a -> m eSource
Monadic fold over the elements of a structure, associating to the right, i.e. from right to left.
foldrM=foldrMOffolded
foldrMOf ::Monadm =>Gettera c -> (c -> e -> m e) -> e -> a -> m e foldrMOf ::Monadm =>Folda c -> (c -> e -> m e) -> e -> a -> m e foldrMOf ::Monadm =>SimpleIsoa c -> (c -> e -> m e) -> e -> a -> m e foldrMOf ::Monadm =>SimpleLensa c -> (c -> e -> m e) -> e -> a -> m e foldrMOf ::Monadm =>SimpleTraversala c -> (c -> e -> m e) -> e -> a -> m e
foldlMOf :: Monad m => Getting (Endo (e -> m e)) a c -> (e -> c -> m e) -> e -> a -> m eSource
Monadic fold over the elements of a structure, associating to the left, i.e. from left to right.
foldlM=foldlMOffolded
foldlMOf ::Monadm =>Gettera c -> (e -> c -> m e) -> e -> a -> m e foldlMOf ::Monadm =>Folda c -> (e -> c -> m e) -> e -> a -> m e foldlMOf ::Monadm =>SimpleIsoa c -> (e -> c -> m e) -> e -> a -> m e foldlMOf ::Monadm =>SimpleLensa c -> (e -> c -> m e) -> e -> a -> m e foldlMOf ::Monadm =>SimpleTraversala c -> (e -> c -> m e) -> e -> a -> m e