module Algebra.Structures.ExplicitUnits
( ExplicitUnits(..)
, propUnit, isUnit, (%|), (~=)
) where
import Algebra.Structures.IntegralDomain
import Algebra.Structures.GCDDomain
infix 5 %|
infix 4 ~=
class IntegralDomain a => ExplicitUnits a where
unit :: a -> Maybe a
propUnit :: (ExplicitUnits a, Eq a) => a -> Bool
propUnit a = case unit a of
Just a' -> a <*> a' == one
Nothing -> True
isUnit :: ExplicitUnits a => a -> Bool
isUnit = maybe False (const True) . unit
(%|) :: (ExplicitUnits a, GCDDomain a) => a -> a -> Bool
a %| b = let (g,x,y) = gcd' a b
in isUnit x
(~=) :: (ExplicitUnits a, GCDDomain a) => a -> a -> Bool
a ~= b = a %| b && b %| a