module Noether.Algebra.Single.Monoid where

import           Noether.Lemmata.TypeFu

import           Noether.Algebra.Single.Neutral
import           Noether.Algebra.Single.Semigroup

data MonoidE
  = Monoid_Semigroup_Neutral SemigroupE NeutralE
  | MonoidNamed Symbol MonoidE

class MonoidK (op :: k) a (s :: MonoidE)

instance (SemigroupK op a zs, NeutralK op a zn) =>
         MonoidK op a (Monoid_Semigroup_Neutral zs zn)

instance (KnownSymbol sym, MonoidK op a s) =>
         MonoidK op a (MonoidNamed sym s)

type MonoidC op a = MonoidK op a (MonoidS op a)

type family MonoidS (op :: k) (a :: Type) = (r :: MonoidE)