module Data.Group where

import Data.Complex
import Prelude hiding (Num(..))

infixl 6 <<

-- | A 'Group' is a 'Monoid' plus a function, 'negate', such that: 
--
-- @g << negate g ≡ mempty@
--
-- @negate g << g ≡ mempty@
--
class Monoid g => Group g where
  {-# MINIMAL (negate | (<<)) #-}

  negate :: g -> g
  negate x = mempty << x

  (<<) :: g -> g -> g
  x << y = x <> negate y