monoid-extras-0.4.0.2: Various extra monoid-related definitions and utilities

Data.Monoid.Split

Description

Sometimes we want to accumulate values from some monoid, but have the ability to introduce a "split" which separates values on either side. Only the rightmost split is kept. For example,

`a b c | d e | f g h == a b c d e | f g h`

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.

Synopsis

# Documentation

data Split m Source

A value of type `Split m` is either a single `m`, or a pair of `m`'s separated by a divider. Single `m`'s combine as usual; single `m`'s combine with split values by combining with the value on the appropriate side; when two split values meet only the rightmost split is kept, with both the values from the left split combining with the left-hand value of the right split.

Data.Monoid.Cut is similar, but uses a different scheme for composition. `Split` uses the asymmetric constructor `:|`, and `Cut` the symmetric constructor `:||:`, to emphasize the inherent asymmetry of `Split` and symmetry of `Cut`. `Split` keeps only the rightmost split and combines everything on the left; `Cut` keeps the outermost splits and throws away everything in between.

Constructors

 M m m :| m infix 5

Instances

 Functor Split Foldable Split Traversable Split Eq m => Eq (Split m) Data m => Data (Split m) Read m => Read (Split m) Show m => Show (Split m) (Semigroup m, Monoid m) => Monoid (Split m) Semigroup m => Semigroup (Split m) If `m` is a `Semigroup`, then `Split m` is a semigroup which combines values on either side of a split, keeping only the rightmost split. 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. Typeable (* -> *) Split

split :: Monoid m => Split m Source

A convenient name for `mempty :| mempty`, so ```M a <> split <> M b == a :| b```.

unsplit :: Semigroup m => Split m -> m Source

"Unsplit" a split monoid value, combining the two values into one (or returning the single value if there is no split).