Add traversal constructor
This commit is contained in:
parent
4d44a6ac36
commit
f2e172678a
|
@ -60,14 +60,24 @@ IndexedTraversal' = Simple . IndexedTraversal
|
||||||
-- Utilities for traversals
|
-- Utilities for traversals
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
||| Construct a traversal from a `traverse`-like function.
|
||||||
|
public export
|
||||||
|
traversal : (forall f. Applicative f => (a -> f b) -> s -> f t) -> Traversal s t a b
|
||||||
|
traversal f @{MkIsTraversal _} = wander f
|
||||||
|
|
||||||
|
||| Construct an indexed traversal from a `traverse`-like function.
|
||||||
|
public export
|
||||||
|
itraversal : (forall f. Applicative f => (i -> a -> f b) -> s -> f t) -> IndexedTraversal i s t a b
|
||||||
|
itraversal f @{MkIsTraversal _} @{ind} = wander (f . curry) . indexed @{ind}
|
||||||
|
|
||||||
|
|
||||||
||| Convert a traversal into an indexed traversal, adding an index for the
|
||| Convert a traversal into an indexed traversal, adding an index for the
|
||||||
||| ordinal position of the focus.
|
||| ordinal position of the focus.
|
||||||
public export
|
public export
|
||||||
iordinal : Num i => Traversal s t a b -> IndexedTraversal i s t a b
|
iordinal : Num i => Traversal s t a b -> IndexedTraversal i s t a b
|
||||||
iordinal @{_} l @{MkIsTraversal _} @{ind} = wander (func . curry) . indexed @{ind}
|
iordinal l = itraversal func
|
||||||
where
|
where
|
||||||
func : forall f. Applicative f => (i -> a -> f b) -> s -> f t
|
func : Applicative f => (i -> a -> f b) -> s -> f t
|
||||||
func = indexing $ applyStar . l . MkStar {f = Indexing i f}
|
func = indexing $ applyStar . l . MkStar {f = Indexing i f}
|
||||||
|
|
||||||
|
|
||||||
|
@ -84,13 +94,13 @@ itraversed = iordinal traversed
|
||||||
||| Contstruct a traversal over a `Bitraversable` container with matching types.
|
||| Contstruct a traversal over a `Bitraversable` container with matching types.
|
||||||
public export
|
public export
|
||||||
both : Bitraversable t => Traversal (t a a) (t b b) a b
|
both : Bitraversable t => Traversal (t a a) (t b b) a b
|
||||||
both @{_} @{MkIsTraversal _} = wander (\f => bitraverse f f)
|
both = traversal (\f => bitraverse f f)
|
||||||
|
|
||||||
|
|
||||||
||| Reverse the order of a traversal's focuses.
|
||| Reverse the order of a traversal's focuses.
|
||||||
public export
|
public export
|
||||||
backwards : Traversal s t a b -> Traversal s t a b
|
backwards : Traversal s t a b -> Traversal s t a b
|
||||||
backwards l @{MkIsTraversal _} = wander func
|
backwards l = traversal func
|
||||||
where
|
where
|
||||||
func : Applicative f => (a -> f b) -> s -> f t
|
func : Applicative f => (a -> f b) -> s -> f t
|
||||||
func fn = forwards . applyStar {f = Backwards f} (l $ MkStar (MkBackwards . fn))
|
func fn = forwards . applyStar {f = Backwards f} (l $ MkStar (MkBackwards . fn))
|
||||||
|
@ -229,7 +239,7 @@ isingular l = ioptional' (runForget $ l @{%search} @{Idxed} (MkForget Just)) set
|
||||||
||| Filter the focuses of a traversal by a predicate on their ordinal positions.
|
||| Filter the focuses of a traversal by a predicate on their ordinal positions.
|
||||||
public export
|
public export
|
||||||
elementsOf : Traversal s t a a -> (Nat -> Bool) -> Traversal s t a a
|
elementsOf : Traversal s t a a -> (Nat -> Bool) -> Traversal s t a a
|
||||||
elementsOf l p @{MkIsTraversal _} = wander func
|
elementsOf l p = traversal func
|
||||||
where
|
where
|
||||||
func : Applicative f => (a -> f a) -> s -> f t
|
func : Applicative f => (a -> f a) -> s -> f t
|
||||||
func fn = indexing {f} (traverseOf l) $
|
func fn = indexing {f} (traverseOf l) $
|
||||||
|
|
Loading…
Reference in a new issue