module Numeric.Band.Class ( -- * Multiplicative Bands Band , pow1pBand , powBand ) where import Numeric.Semigroup.Multiplicative import Numeric.Monoid.Multiplicative import Numeric.Natural -- | An multiplicative semigroup with idempotent multiplication. -- -- > a * a = a class Multiplicative r => Band r pow1pBand :: Whole n => r -> n -> r pow1pBand r _ = r powBand :: (Unital r, Whole n) => r -> n -> r powBand _ 0 = one powBand r _ = r instance Band () instance Band Bool instance (Band a, Band b) => Band (a,b) instance (Band a, Band b, Band c) => Band (a,b,c) instance (Band a, Band b, Band c, Band d) => Band (a,b,c,d) instance (Band a, Band b, Band c, Band d, Band e) => Band (a,b,c,d,e)