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 they 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 idTraversal,
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.

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.

Usually transform is more appropriate, but rewrite can give better
compositionality. Given two single transformations f and g, you can
construct a -> f a mplus g a which performs both rewrites until a fixed point.

Usually transformOf is more appropriate, but rewriteOf can give better
compositionality. Given two single transformations f and g, you can
construct a -> f a mplus g a which performs both rewrites until a fixed point.

Rewrite by applying a monadic rule everywhere inside of a structure located by a user-specified Traversal,
using a user-specified Traversal for recursion. Ensures that the rule cannot be applied anywhere in the result.

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
another user-supplied Traversal to walk each layer.