/**
 * The `Semigroup` type defines equality.
 *
 * Inspired by [Data.Semigroup](https://hackage.haskell.org/package/base/docs/Data-Semigroup.html)
 * from Haskell.
 *
 * Instances must obey the following laws:
 *
 * 1. Associativity: Associativity: S.concat(S.concat(a, b), c) ≡ S.concat(a, S.concat(b, c))
 *
 * Equivalent with the `Semigroup` type-class in the
 * [static-land] https spec.
  export interface Semigroup < A > { concat ( x , y ) : A ; }