In mathematics, a semigroup is an algebraic structure consisting of a
set together with an associative binary operation.  A semigroup
generalizes a monoid in that there might not exist an identity element.
It also (originally) generalized a group (a monoid with all inverses) to
a type where every element did not have to have an inverse, thus the
name semigroup.

WWW: https://github.com/ekmett/semigroups
