Portability | Rank2Types |
---|---|

Stability | provisional |

Maintainer | Edward Kmett <ekmett@gmail.com> |

Safe Haskell | Safe-Inferred |

The name "plate" stems originally from "boilerplate", which was the term used by the "Scrap Your Boilerplate" papers, and later inherited by Neil Mitchell's "Uniplate".

http://community.haskell.org/~ndm/uniplate/

The combinators in here are designed to be compatible with and subsume the
`uniplate`

API with the notion of a `Traversal`

replacing a uniplate or
biplate.

By implementing these combinators in terms of `plate`

instead of `uniplate`

additional type safety is gained, as the user is no longer responsible for
maintaining invariants such as the number of children he received.

Note: The `Biplate`

is *deliberately* excluded from the API here, with the
intention that you replace them with either explicit traversals, or by using the
`On`

variants of the combinators below with `biplate`

from
`Data.Data.Lens`

. As a design, it forced the user into too many situations where
they had to choose between correctness and ease of use, and it was brittle in the
face of competing imports.

The sensible use of these combinators makes some simple assumptions. Notably, any
of the `On`

combinators are expecting a `Traversal`

, `Setter`

or `Fold`

to play the role of the `biplate`

combinator, and so when the
types of the contents and the container match, they should be the `id`

`Traversal`

,
`Setter`

or `Fold`

.

It is often beneficial to use the combinators in this module with the combinators
from `Data.Data.Lens`

or `GHC.Generics.Lens`

to make it easier to automatically
derive definitions for `plate`

, or to derive custom traversals.

- class Plated a where
- children :: Plated a => a -> [a]
- childrenOn :: Getting [a] s t a b -> s -> [a]
- rewrite :: Plated a => (a -> Maybe a) -> a -> a
- rewriteOf :: SimpleSetting a a -> (a -> Maybe a) -> a -> a
- rewriteOn :: Plated a => Setting s t a a -> (a -> Maybe a) -> s -> t
- rewriteOnOf :: Setting s t a a -> SimpleSetting a a -> (a -> Maybe a) -> s -> t
- rewriteM :: (Monad m, Plated a) => (a -> m (Maybe a)) -> a -> m a
- rewriteMOf :: Monad m => SimpleLensLike (WrappedMonad m) a a -> (a -> m (Maybe a)) -> a -> m a
- rewriteMOn :: (Monad m, Plated a) => LensLike (WrappedMonad m) s t a a -> (a -> m (Maybe a)) -> s -> m t
- rewriteMOnOf :: Monad m => LensLike (WrappedMonad m) s t a a -> SimpleLensLike (WrappedMonad m) a a -> (a -> m (Maybe a)) -> s -> m t
- universe :: Plated a => a -> [a]
- universeOf :: Getting [a] a b a b -> a -> [a]
- universeOn :: Plated a => Getting [a] s t a a -> s -> [a]
- universeOnOf :: Getting [a] s t a b -> Getting [a] a b a b -> s -> [a]
- transform :: Plated a => (a -> a) -> a -> a
- transformOf :: SimpleSetting a a -> (a -> a) -> a -> a
- transformOn :: Plated a => Setting s t a a -> (a -> a) -> s -> t
- transformOnOf :: Setting s t a a -> SimpleSetting a a -> (a -> a) -> s -> t
- transformM :: (Monad m, Plated a) => (a -> m a) -> a -> m a
- transformMOf :: Monad m => SimpleLensLike (WrappedMonad m) a a -> (a -> m a) -> a -> m a
- transformMOn :: (Monad m, Plated a) => LensLike (WrappedMonad m) s t a a -> (a -> m a) -> s -> m t
- transformMOnOf :: Monad m => LensLike (WrappedMonad m) s a a a -> SimpleLensLike (WrappedMonad m) a a -> (a -> m a) -> s -> m a
- descend :: Plated a => (a -> a) -> a -> a
- descendOf :: Setting s t a b -> (a -> b) -> s -> t
- descendOn :: Plated a => Setting s t a a -> (a -> a) -> s -> t
- descendOnOf :: Setting s t a b -> Setting a b u v -> (u -> v) -> s -> t
- descendA :: (Applicative f, Plated a) => (a -> f a) -> a -> f a
- descendAOf :: Applicative f => LensLike f s t a b -> (a -> f b) -> s -> f t
- descendAOn :: (Applicative f, Plated a) => LensLike f s t a a -> (a -> f a) -> s -> f t
- descendAOnOf :: Applicative f => LensLike f u v s t -> LensLike f s t a b -> (a -> f b) -> u -> f v
- descendA_ :: (Applicative f, Plated a) => (a -> f b) -> a -> f ()
- descendAOf_ :: Applicative f => Getting (Traversed f) s t a b -> (a -> f r) -> s -> f ()
- descendAOn_ :: (Applicative f, Plated a) => Getting (Traversed f) s t a a -> (a -> f r) -> s -> f ()
- descendAOnOf_ :: Applicative f => Getting (Traversed f) s t a b -> Getting (Traversed f) a b a b -> (a -> f r) -> s -> f ()
- descendM :: (Monad m, Plated a) => (a -> m a) -> a -> m a
- descendMOf :: Monad m => LensLike (WrappedMonad m) s t a b -> (a -> m b) -> s -> m t
- descendMOn :: (Monad m, Plated a) => LensLike (WrappedMonad m) s t a a -> (a -> m a) -> s -> m t
- descendMOnOf :: Monad m => LensLike (WrappedMonad m) s t a a -> SimpleLensLike (WrappedMonad m) a a -> (a -> m a) -> s -> m t
- descendM_ :: (Monad m, Plated a) => (a -> m b) -> a -> m ()
- descendMOf_ :: Monad m => Getting (Sequenced m) s t a b -> (a -> m r) -> s -> m ()
- descendMOn_ :: (Monad m, Plated a) => Getting (Sequenced m) s t a a -> (a -> m r) -> s -> m ()
- descendMOnOf_ :: Monad m => Getting (Sequenced m) s t a b -> Getting (Sequenced m) a b a b -> (a -> m r) -> s -> m ()
- contexts :: Plated a => a -> [Context a a a]
- contextsOf :: SimpleLensLike (Bazaar a a) a a -> a -> [Context a a a]
- contextsOn :: Plated a => LensLike (Bazaar a a) s t a a -> s -> [Context a a t]
- contextsOnOf :: LensLike (Bazaar a a) s t a a -> SimpleLensLike (Bazaar a a) a a -> s -> [Context a a t]
- holes :: Plated a => a -> [Context a a a]
- holesOf :: LensLike (Bazaar a a) s t a a -> s -> [Context a a t]
- holesOn :: LensLike (Bazaar a a) s t a a -> s -> [Context a a t]
- holesOnOf :: LensLike (Bazaar r r) s t a b -> LensLike (Bazaar r r) a b r r -> s -> [Context r r t]
- para :: Plated a => (a -> [r] -> r) -> a -> r
- paraOf :: Getting [a] a b a b -> (a -> [r] -> r) -> a -> r
- composOpFold :: Plated a => b -> (b -> b -> b) -> (a -> b) -> a -> b
- parts :: Plated a => Simple Lens a [a]
- partsOf :: LensLike (Bazaar a a) s t a a -> Lens s t [a] [a]
- unsafePartsOf :: LensLike (Bazaar a b) s t a b -> Lens s t [a] [b]

# Uniplate

A `Plated`

type is one where we know how to extract its immediate self-similar children.

*Example 1*:

```
import Control.Applicative
import Control.Lens
import Control.Plated
import Data.Data
import Data.Data.Lens (
````uniplate`

)

data Expr = Val`Int`

| Neg Expr | Add Expr Expr deriving (`Eq`

,`Ord`

,`Show`

,`Read`

,`Data`

,`Typeable`

)

instance`Plated`

Expr where`plate`

f (Neg e) = Neg`<$>`

f e`plate`

f (Add a b) = Add`<$>`

f a`<*>`

f b`plate`

_ a =`pure`

a

*or*

instance`Plated`

Expr where`plate`

=`uniplate`

*Example 2*:

```
import Control.Applicative
import Control.Lens
import Control.Plated
import Data.Data
import Data.Data.Lens (
````uniplate`

)

data Tree a = Bin (Tree a) (Tree a) | Tip a deriving (`Eq`

,`Ord`

,`Show`

,`Read`

,`Data`

,`Typeable`

)

instance`Plated`

(Tree a) where`plate`

f (Bin l r) = Bin`<$>`

f l`<*>`

f r`plate`

_ t =`pure`

t

*or*

instance`Data`

a =>`Plated`

(Tree a) where`plate`

=`uniplate`

Note the big distinction between these two implementations.

The former will only treat children directly in this tree as descendents, the latter will treat trees contained in the values under the tips also as descendants!

When in doubt, pick a `Traversal`

and just use the various `...Of`

combinators
rather than pollute `Plated`

with orphan instances!

If you want to find something unplated and non-recursive with `biplate`

use the `...OnOf`

variant with `ignored`

, though those usecases are much better served
in most cases by using the existing lens combinators! e.g.

.
`toListOf`

`biplate`

≡ `universeOnOf`

`biplate`

`ignored`

This same ability to explicitly pass the `Traversal`

in question is why there is no
analogue to uniplate's `Biplate`

.

Moreover, since we can allow custom traversals, we implement reasonable defaults for
polymorphic data types, that only traverse into themselves, and *not* their
polymorphic arguments.

# Uniplate Combinators

childrenOn :: Getting [a] s t a b -> s -> [a]Source

rewrite :: Plated a => (a -> Maybe a) -> a -> aSource

Rewrite by applying a rule everywhere you can. Ensures that the rule cannot be applied anywhere in the result:

propRewrite r x =`all`

(`isNothing`

. r) (`universe`

(`rewrite`

r x))

Usually `transform`

is more appropriate, but `rewrite`

can give better
compositionality. Given two single transformations `f`

and `g`

, you can
construct `a -> f a `

which performs both rewrites until a fixed point.
`mplus`

g a

rewriteOf :: SimpleSetting a a -> (a -> Maybe a) -> a -> aSource

Rewrite by applying a rule everywhere you can. Ensures that the rule cannot be applied anywhere in the result:

propRewriteOf l r x =`all`

(`isNothing`

. r) (`universeOf`

l (`rewriteOf`

l r x))

Usually `transformOf`

is more appropriate, but `rewriteOf`

can give better
compositionality. Given two single transformations `f`

and `g`

, you can
construct `a -> f a `

which performs both rewrites until a fixed point.
`mplus`

g a

`rewriteOf`

::`Simple`

`Iso`

a a -> (a ->`Maybe`

a) -> a -> a`rewriteOf`

::`Simple`

`Lens`

a a -> (a ->`Maybe`

a) -> a -> a`rewriteOf`

::`Simple`

`Traversal`

a a -> (a ->`Maybe`

a) -> a -> a`rewriteOf`

::`Simple`

`Setter`

a a -> (a ->`Maybe`

a) -> a -> a

rewriteOn :: Plated a => Setting s t a a -> (a -> Maybe a) -> s -> tSource

Rewrite recursively over part of a larger structure.

`rewriteOn`

::`Plated`

a =>`Simple`

`Iso`

s a -> (a ->`Maybe`

a) -> s -> s`rewriteOn`

::`Plated`

a =>`Simple`

`Lens`

s a -> (a ->`Maybe`

a) -> s -> s`rewriteOn`

::`Plated`

a =>`Simple`

`Traversal`

s a -> (a ->`Maybe`

a) -> s -> s`rewriteOn`

::`Plated`

a =>`Simple`

`Setting`

s a -> (a ->`Maybe`

a) -> s -> s

rewriteOnOf :: Setting s t a a -> SimpleSetting a a -> (a -> Maybe a) -> s -> tSource

Rewrite recursively over part of a larger structure using a specified setter.

`rewriteOnOf`

::`Plated`

a =>`Simple`

`Iso`

s a ->`Simple`

`Iso`

a a -> (a ->`Maybe`

a) -> s -> s`rewriteOnOf`

::`Plated`

a =>`Simple`

`Lens`

s a ->`Simple`

`Lens`

a a -> (a ->`Maybe`

a) -> s -> s`rewriteOnOf`

::`Plated`

a =>`Simple`

`Traversal`

s a ->`Simple`

`Traversal`

a a -> (a ->`Maybe`

a) -> s -> s`rewriteOnOf`

::`Plated`

a =>`Simple`

`Setter`

s a ->`Simple`

`Setter`

a a -> (a ->`Maybe`

a) -> s -> s

rewriteM :: (Monad m, Plated a) => (a -> m (Maybe a)) -> a -> m aSource

Rewrite by applying a monadic rule everywhere you can. Ensures that the rule cannot be applied anywhere in the result.

rewriteMOf :: Monad m => SimpleLensLike (WrappedMonad m) a a -> (a -> m (Maybe a)) -> a -> m aSource

Rewrite by applying a monadic rule everywhere you recursing with a user-specified `Traversal`

.
Ensures that the rule cannot be applied anywhere in the result.

rewriteMOn :: (Monad m, Plated a) => LensLike (WrappedMonad m) s t a a -> (a -> m (Maybe a)) -> s -> m tSource

Rewrite by applying a monadic rule everywhere inside of a structure located by a user-specified `Traversal`

.
Ensures that the rule cannot be applied anywhere in the result.

rewriteMOnOf :: Monad m => LensLike (WrappedMonad m) s t a a -> SimpleLensLike (WrappedMonad m) a a -> (a -> m (Maybe a)) -> s -> m tSource

universe :: Plated a => a -> [a]Source

Retrieve all of the transitive descendants of a `Plated`

container, including itself.

universeOf :: Getting [a] a b a b -> a -> [a]Source

Given a fold that knows how to locate immediate children, retrieve all of the transitive descendants of a node, including itself.

`universeOf`

::`Fold`

a a -> a -> [a]

universeOn :: Plated a => Getting [a] s t a a -> s -> [a]Source

universeOnOf :: Getting [a] s t a b -> Getting [a] a b a b -> s -> [a]Source

Given a `Fold`

that knows how to locate immediate children, retrieve all of the transitive descendants of a node, including itself that lie
in a region indicated by another `Fold`

.

`toListOf`

l ≡`universeOnOf`

l`ignored`

transformOf :: SimpleSetting a a -> (a -> a) -> a -> aSource

Transform every element by recursively applying a given `Setter`

in a bottom-up manner.

`transformOf`

::`Simple`

`Traversal`

a a -> (a -> a) -> a -> a`transformOf`

::`Simple`

`Setter`

a a -> (a -> a) -> a -> a

transformOn :: Plated a => Setting s t a a -> (a -> a) -> s -> tSource

Transform every element in the tree in a bottom-up manner over a region indicated by a `Setter`

.

`transformOn`

::`Plated`

a =>`Simple`

`Traversal`

s a -> (a -> a) -> s -> s`transformOn`

::`Plated`

a =>`Simple`

`Setter`

s a -> (a -> a) -> s -> s

transformOnOf :: Setting s t a a -> SimpleSetting a a -> (a -> a) -> s -> tSource

transformM :: (Monad m, Plated a) => (a -> m a) -> a -> m aSource

Transform every element in the tree, in a bottom-up manner, monadically.

transformMOf :: Monad m => SimpleLensLike (WrappedMonad m) a a -> (a -> m a) -> a -> m aSource

Transform every element in a tree using a user supplied `Traversal`

in a bottom-up manner with a monadic effect.

`transformMOf`

::`Monad`

m => 'Simple`Traversal`

a a -> (a -> m a) -> a -> m a

transformMOn :: (Monad m, Plated a) => LensLike (WrappedMonad m) s t a a -> (a -> m a) -> s -> m tSource

transformMOnOf :: Monad m => LensLike (WrappedMonad m) s a a a -> SimpleLensLike (WrappedMonad m) a a -> (a -> m a) -> s -> m aSource

descendOnOf :: Setting s t a b -> Setting a b u v -> (u -> v) -> s -> tSource

Recurse one level into the parts delimited by one `Setter`

, using another.

`descendOnOf`

b l ≡`over`

(b`.`

l)

`descendOnOf`

::`Simple`

`Setter`

s a ->`Simple`

`Setter`

a a -> (a -> a) -> s -> s`descendOnOf`

::`Simple`

`Traversal`

s a ->`Simple`

`Traversal`

a a -> (a -> a) -> s -> s

descendA :: (Applicative f, Plated a) => (a -> f a) -> a -> f aSource

Recurse one level into a structure with an `Applicative`

effect, this is `plate`

, but it is supplied
for consistency with the uniplate API.

`descendA`

≡`plate`

descendAOf :: Applicative f => LensLike f s t a b -> (a -> f b) -> s -> f tSource

Recurse one level into a structure using a user specified recursion scheme and `Applicative`

effects. This is `id`

, but it is supplied
for consistency with the uniplate API.

`descendAOf`

≡`id`

`descendAOf`

::`Applicative`

m =>`Simple`

`Traversal`

s a => (a -> m a) -> s -> m s

descendAOn :: (Applicative f, Plated a) => LensLike f s t a a -> (a -> f a) -> s -> f tSource

Recurse one level into the parts of the structure delimited by a `Traversal`

with `Applicative`

effects.

`descendAOn`

b ≡ b`.`

`plate`

`descendAOn`

:: (`Applicative`

f, Plated' a) =>`Simple`

`Traversal`

s a -> (a -> f a) -> s -> f s

descendAOnOf :: Applicative f => LensLike f u v s t -> LensLike f s t a b -> (a -> f b) -> u -> f vSource

Recurse one level into the parts delimited by one `Traversal`

, using another with `Applicative`

effects.

`descendAOnOf`

≡ (`.`

)

`descendAOnOf`

::`Applicative`

f =>`Simple`

`Traversal`

s a ->`Simple`

`Traversal`

a a -> (a -> f a) -> s -> f s

descendA_ :: (Applicative f, Plated a) => (a -> f b) -> a -> f ()Source

descendAOf_ :: Applicative f => Getting (Traversed f) s t a b -> (a -> f r) -> s -> f ()Source

Recurse one level into a structure using a user specified recursion scheme and `Applicative`

effects, without reconstructing the structure behind you.

This is just `traverseOf_`

, but is provided for consistency.

`descendAOf_`

≡`traverseOf_`

`descendAOf_`

::`Applicative`

f =>`Fold`

s a => (a -> f r) -> s -> f ()

descendAOn_ :: (Applicative f, Plated a) => Getting (Traversed f) s t a a -> (a -> f r) -> s -> f ()Source

Recurse one level into the parts of the structure delimited by a `Traversal`

with monadic effects.

`descendAOn_`

b ≡`traverseOf_`

(b`.`

`plate`

)

`descendAOn_`

:: (`Applicative`

f,`Plated`

a) =>`Simple`

`Traversal`

s a -> (a -> f r) -> s -> f ()

descendAOnOf_ :: Applicative f => Getting (Traversed f) s t a b -> Getting (Traversed f) a b a b -> (a -> f r) -> s -> f ()Source

Recurse one level into the parts delimited by one `Fold`

, using another with `Applicative`

effects, without reconstructing the structure behind you.

`descendAOnOf_`

b l ≡`traverseOf_`

(b`.`

l)

`descendAOnOf_`

::`Applicative`

f =>`Fold`

s a ->`Fold`

a a -> (a -> f r) -> s -> f ()

descendMOf :: Monad m => LensLike (WrappedMonad m) s t a b -> (a -> m b) -> s -> m tSource

Recurse one level into a structure using a user specified recursion scheme and monadic effects. This is `id`

, but it is
supplied for consistency with the uniplate API.

`descendMOf`

≡`mapMOf`

`descendMOf`

::`Monad`

m =>`Simple`

`Traversal`

s a => (a -> m a) -> s -> m s

descendMOn :: (Monad m, Plated a) => LensLike (WrappedMonad m) s t a a -> (a -> m a) -> s -> m tSource

Recurse one level into the parts of the structure delimited by a `Traversal`

with monadic effects.

`descendMOn`

b ≡`mapMOf`

(b .`plate`

)

`descendMOn`

:: (`Monad`

m,`Plated`

a) =>`Simple`

`Traversal`

s a -> (a -> m a) -> s -> m s

descendMOnOf :: Monad m => LensLike (WrappedMonad m) s t a a -> SimpleLensLike (WrappedMonad m) a a -> (a -> m a) -> s -> m tSource

Recurse one level into the parts delimited by one `Traversal`

, using another with monadic effects.

`descendMOnOf`

b l ≡`mapMOf`

(b`.`

l)

`descendMOnOf`

::`Monad`

m =>`Simple`

`Traversal`

s a ->`Simple`

`Traversal`

a a -> (a -> m a) -> s -> m s

descendMOf_ :: Monad m => Getting (Sequenced m) s t a b -> (a -> m r) -> s -> m ()Source

Recurse one level into a structure using a user specified recursion scheme and monadic effects. This is just `mapMOf_`

, but is provided for consistency.

`descendMOf_`

≡`mapMOf_`

`descendMOf_`

::`Monad`

m =>`Fold`

s a => (a -> m a) -> s -> m ()

descendMOn_ :: (Monad m, Plated a) => Getting (Sequenced m) s t a a -> (a -> m r) -> s -> m ()Source

Recurse one level into the parts of the structure delimited by a `Traversal`

with monadic effects.

`descendMOn_`

b ≡`mapMOf_`

(b`.`

`plate`

)

`descendMOn_`

:: (`Monad`

m,`Plated`

a) =>`Simple`

`Traversal`

s a -> (a -> m r) -> b -> m ()

descendMOnOf_ :: Monad m => Getting (Sequenced m) s t a b -> Getting (Sequenced m) a b a b -> (a -> m r) -> s -> m ()Source

Recurse one level into the parts delimited by one `Traversal`

, using another with monadic effects.

`descendMOnOf_`

b l ≡`mapMOf_`

(b`.`

l)

`descendMOnOf_`

::`Monad`

m =>`Fold`

s a ->`Fold`

a a -> (a -> m a) -> s -> m ()

contextsOf :: SimpleLensLike (Bazaar a a) a a -> a -> [Context a a a]Source

Return a list of all of the editable contexts for every location in the structure, recursively, using a user-specified `Traversal`

to walk each layer.

propUniverse l x =`universeOf`

l x ==`map`

`pos`

(`contextsOf`

l x) propId l x =`all`

(`==`

x) [extract w | w <-`contextsOf`

l x]

`contextsOf`

::`Simple`

`Traversal`

a a -> a -> [`Context`

a a]

contextsOn :: Plated a => LensLike (Bazaar a a) s t a a -> s -> [Context a a t]Source

Return a list of all of the editable contexts for every location in the structure in an areas indicated by a user supplied `Traversal`

, recursively using `plate`

.

`contextsOn`

b ≡`contextsOnOf`

b`plate`

`contextsOn`

::`Plated`

a =>`Simple`

`Traversal`

s a -> s -> [`Context`

a a s]

contextsOnOf :: LensLike (Bazaar a a) s t a a -> SimpleLensLike (Bazaar a a) a a -> s -> [Context a a t]Source

holes :: Plated a => a -> [Context a a a]Source

The one-level version of `context`

. This extracts a list of the immediate children as editable contexts.

Given a context you can use `pos`

to see the values, `peek`

at what the structure would be like with an edited result, or simply `extract`

the original structure.

propChildren x =`children`

l x`==`

`map`

`pos`

(`holes`

l x) propId x =`all`

(`==`

x) [extract w | w <-`holes`

l x]

`holes`

=`holesOf`

`plate`

holesOf :: LensLike (Bazaar a a) s t a a -> s -> [Context a a t]Source

The one-level version of `contextsOf`

. This extracts a list of the immediate children according to a given `Traversal`

as editable contexts.

Given a context you can use `pos`

to see the values, `peek`

at what the structure would be like with an edited result, or simply `extract`

the original structure.

propChildren l x =`childrenOf`

l x`==`

`map`

`pos`

(`holesOf`

l x) propId l x =`all`

(`==`

x) [extract w | w <-`holesOf`

l x]

`holesOf`

::`Simple`

`Iso`

s a -> s -> [`Context`

a a s]`holesOf`

::`Simple`

`Lens`

s a -> s -> [`Context`

a a s]`holesOf`

::`Simple`

`Traversal`

s a -> s -> [`Context`

a a s]

holesOnOf :: LensLike (Bazaar r r) s t a b -> LensLike (Bazaar r r) a b r r -> s -> [Context r r t]Source

Extract one level of holes from a container in a region specified by one `Traversal`

, using another.

`holesOnOf`

b l ≡`holesOf`

(b`.`

l)

`holesOnOf`

::`Simple`

`Iso`

s a ->`Simple`

`Iso`

a a -> s -> [`Context`

a a s]`holesOnOf`

::`Simple`

`Lens`

s a ->`Simple`

`Lens`

a a -> s -> [`Context`

a a s]`holesOnOf`

::`Simple`

`Traversal`

s a ->`Simple`

`Traversal`

a a -> s -> [`Context`

a a s]

# Compos

Provided for compatibility with Björn Bringert's `compos`

library.

Note: Other operations from compos that were inherited by `uniplate`

are *not* included
to avoid having even more redundant names for the same operators. For comparison:

`composOpMonoid`

≡`foldMapOf`

`plate`

`composOpMPlus`

f ≡`msumOf`

(`plate`

`.`

`to`

f)`composOp`

≡`descend`

≡`over`

`plate`

`composOpM`

≡`descendM`

≡`mapMOf`

`plate`

`composOpM_`

≡`descendM_`

≡`mapMOf_`

`plate`

composOpFold :: Plated a => b -> (b -> b -> b) -> (a -> b) -> a -> bSource

Fold the immediate children of a `Plated`

container.

`composOpFold`

z c f =`foldrOf`

`plate`

(c`.`

f) z

# Parts

partsOf :: LensLike (Bazaar a a) s t a a -> Lens s t [a] [a]Source

`partsOf`

turns a `Traversal`

into a lens that resembles an early version of the `uniplate`

(or `biplate`

) type.

*Note:* You should really try to maintain the invariant of the number of children in the list.

Any extras will be lost. If you do not supply enough, then the remainder will come from the original structure.

So technically, this is only a lens if you do not change the number of results it returns.

`partsOf`

::`Simple`

`Iso`

s a ->`Simple`

`Lens`

s [a]`partsOf`

::`Simple`

`Lens`

s a ->`Simple`

`Lens`

s [a]`partsOf`

::`Simple`

`Traversal`

s a ->`Simple`

`Lens`

s [a]

## Unsafe Operations

unsafePartsOf :: LensLike (Bazaar a b) s t a b -> Lens s t [a] [b]Source

`unsafePartsOf`

turns a `Traversal`

into a `uniplate`

(or `biplate`

) family.

If you do not need the types of `s`

and `t`

to be different, it is recommended that
you use `partsOf`

It is generally safer to traverse with the `Bazaar`

rather than use this
combinator. However, it is sometimes convenient.

This is unsafe because if you don't supply at least as many `b`

's as you were
given `a`

's, then the reconstruction of `t`

*will* result in an error!

`unsafePartsOf`

::`Iso`

s t a b ->`Lens`

s t [a] [b]`unsafePartsOf`

::`Lens`

s t a b ->`Lens`

s t [a] [b]`unsafePartsOf`

::`Traversal`

s t a b ->`Lens`

s t [a] [b]