monoid is a confusing name. semigroup?