added first pass at mutable semigroups