module Algebra.Structures.CommutativeRing
  ( module Algebra.Structures.Ring
  , CommutativeRing(..)
  , propCommutativeRing
  ) where

import Test.QuickCheck

import Algebra.Structures.Ring


-------------------------------------------------------------------------------
-- | Definition of commutative rings

class Ring a => CommutativeRing a

propMulComm :: (CommutativeRing a, Eq a) => a -> a -> Bool
propMulComm a b = a <*> b == b <*> a


-- | Specification of commutative rings. Test that multiplication is 
-- commutative and that it satisfies the ring axioms.
propCommutativeRing :: (CommutativeRing a, Eq a) => a -> a -> a -> Property
propCommutativeRing a b c = if propMulComm a b 
                               then propRing a b c 
                               else whenFail (print "propMulComm") False