module Noether.Algebra.Single.Semigroup where import Noether.Lemmata.TypeFu import Noether.Algebra.Single.Magma import Noether.Algebra.Tags data SemigroupE = Semigroup_Magma MagmaE | SemigroupNamed Symbol SemigroupE class SemigroupK (op :: k) a (s :: SemigroupE) instance MagmaK op a s => SemigroupK op a (Semigroup_Magma s) instance (KnownSymbol sym, SemigroupK op a s) => SemigroupK op a (SemigroupNamed sym s) type SemigroupC op a = SemigroupK op a (SemigroupS op a) type family SemigroupS (op :: k) (a :: Type) = (r :: SemigroupE)