Conventions

The arrow classes defined in this module have names like ArrowFoo,
and contain operations specific to such arrows. Some of these include
a method newFoo, which maps computations to computations of the
same arrow type, but exposing some of the internals of the arrow.

Arrow transformers have names like BarArrow, and are
instances of appropriate arrow classes. For each arrow
transformer, there is typically an encapsulation operator
runBar that removes that transformer from the outside of an
arrow type. The Control.Arrow.Transformer.lift method of the
Control.Arrow.Transformer.ArrowTransformer class adds an arrow
transformer to the outside of an arrow type.

Typically a composite arrow type is built by applying a series of arrow
transformers to a base arrow (usually either a function arrow or a
Kleisli arrow. The Control.Arrow.Transformer.lift method and the
runBar function operate only on the arrow transformer at the top
of this stack. For more sophisticated manipulation of this stack of
arrow transformers, many arrow transformers provide an ArrowAddBar
class, with methods methods liftBar and elimBar to add and remove
the transformer anywhere in the stack.