Sometimes we want to accumulate values from some monoid, but have
the ability to introduce a "split" which separates values on
either side. For example, in the diagrams graphics framework this
is used when accumulating transformations to be applied to
primitive diagrams: the
freeze operation introduces a split,
since only transformations occurring outside the freeze should be
applied to attributes.
A value of type
Split m is either a single
m, or a pair of
m's separated by a divider.
|(Semigroup m, Monoid m) => Monoid (Split m)|
|Semigroup m => Semigroup (Split m)|
|Action m n => Action (Split m) n|
By default, the action of a split monoid is the same as for the underlying monoid, as if the split were removed.
A convenient name for
mempty :| mempty, so
a <> split <> b == a :| b.