| Portability | Rank2Types |
|---|---|
| Stability | provisional |
| Maintainer | Edward Kmett <ekmett@gmail.com> |
| Safe Haskell | Safe-Infered |
Control.Lens.Fold
Contents
Description
A is a generalization of something 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.
But 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 provides a structure with operations very similar to those of the Fold a cFoldable
typeclass, see foldMapOf and the other Fold combinators.
By convention, if there exists a foo method that expects a , then there should be a
Foldable (f c)fooOf method that takes a and a value of type 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 :: Monoid r =>Folda c -> (c -> r) -> a -> r foldMapOf ::SimpleLensa c -> (c -> r) -> a -> r foldMapOf ::SimpleIsoa c -> (c -> r) -> a -> r foldMapOf :: Monoid r =>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_ :: Functor f => Getter a (f ()) -> a -> f ()
sequenceAOf_ :: Applicative f => Fold a (f ()) -> a -> f ()
sequenceAOf_ :: Functor f => Simple Lens a (f ()) -> a -> f ()
sequenceAOf_ :: Functor f => Simple 'Iso a (f ()) -> a -> f ()
sequenceAOf_ :: Applicative f => Simple Traversal a (f ()) -> a -> f ()
mapMOf_ :: Monad m => Getting (Sequenced m) a c -> (c -> m e) -> a -> m ()Source
mapM_=mapMOf_folded
mapMOf_ :: 'Monad' m => 'Getter' a c -> (c -> m e) -> a -> m () mapMOf_ :: 'Monad' m => 'Fold' a c -> (c -> m e) -> a -> m () mapMOf_ :: 'Monad' m => 'Simple' 'Lens' a c -> (c -> m e) -> a -> m () mapMOf_ :: 'Monad' m => 'Simple' 'Control.Lens.Iso.Iso' a c -> (c -> m e) -> a -> m () mapMOf_ :: 'Monad' m => 'Simple' 'Control.Lens.Traversal.Traversal' a c -> (c -> m e) -> a -> m ()
forMOf_ :: Monad m => Getting (Sequenced m) a c -> a -> (c -> m e) -> m ()Source
forM_=forMOf_folded
forMOf_ :: 'Monad' m => 'Getter' a c -> a -> (c -> m e) -> m () forMOf_ :: 'Monad' m => 'Fold' a c -> a -> (c -> m e) -> m () forMOf_ :: 'Monad' m => 'Simple' 'Lens' a c -> a -> (c -> m e) -> m () forMOf_ :: 'Monad' m => 'Simple' 'Control.Lens.Iso.Iso' a c -> a -> (c -> m e) -> m () forMOf_ :: 'Monad' m => 'Simple' 'Control.Lens.Traversal.Traversal' a 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