module Data.Group.Multiplicative
( module Data.Monoid.Multiplicative
, module Data.Group
, MultiplicativeGroup
, over
, under
, grecip
) where
import Data.Monoid.Multiplicative
import Data.Group
import Data.Monoid.Self
import Data.Monoid.FromString
import Data.Monoid.Reducer
class Multiplicative g => MultiplicativeGroup g where
over :: g -> g -> g
under :: g -> g -> g
grecip :: g -> g
x `under` y = grecip x `times` y
x `over` y = x `times` grecip y
grecip x = one `over` x
instance MultiplicativeGroup g => MultiplicativeGroup (Self g) where
Self x `over` Self y = Self (x `over` y)
Self x `under` Self y = Self (x `under` y)
grecip (Self x) = Self (grecip x)
instance MultiplicativeGroup g => MultiplicativeGroup (FromString g) where
FromString x `over` FromString y = FromString (x `over` y)
FromString x `under` FromString y = FromString (x `under` y)
grecip (FromString x) = FromString (grecip x)
instance MultiplicativeGroup g => MultiplicativeGroup (ReducedBy g s) where
Reduction x `over` Reduction y = Reduction (x `over` y)
Reduction x `under` Reduction y = Reduction (x `under` y)
grecip (Reduction x) = Reduction (grecip x)
instance MultiplicativeGroup a => MultiplicativeGroup (Dual a) where
grecip = Dual . grecip . getDual