import type { Commutative } from './Commutative' import type { Semigroup } from './Semigroup' /** * `AbelianSemigroup` defines a binary operator `combine` on given type `A` that is both associative and commutative * * For a binary operation `*` on type `A`: * * ``` * For all a, b, c in A * (a * b) * c === a * (b * c) * a * b === b * a * ``` */ export interface AbelianSemigroup extends Semigroup, Commutative {}