{-# LANGUAGE CPP #-}
{-# LANGUAGE ViewPatterns #-}
module Numeric.Algebra.Multiplicative.MMonoid
( MMonoid (..),
pattern One,
pattern NonOne,
)
where
import Data.Coerce (coerce)
import Data.Complex (Complex)
import Data.Fixed (Fixed, HasResolution)
import Data.Int (Int16, Int32, Int64, Int8)
import Data.Kind (Constraint, Type)
import Data.Ratio (Ratio)
import Data.Word (Word16, Word32, Word64, Word8)
import GHC.Natural (Natural)
import Numeric.Algebra.Deriving
( AsFractional (MkAsFractional),
AsIntegral (MkAsIntegral),
AsNum (MkAsNum),
)
import Numeric.Algebra.Multiplicative.MSemigroup (MSemigroup)
type MMonoid :: Type -> Constraint
class (MSemigroup m) => MMonoid m where
one :: m
pattern One :: (MMonoid m, Eq m) => m
pattern $bOne :: forall m. (MMonoid m, Eq m) => m
$mOne :: forall {r} {m}.
(MMonoid m, Eq m) =>
m -> ((# #) -> r) -> ((# #) -> r) -> r
One <- ((== one) -> True)
where
One = m
forall m. MMonoid m => m
one
pattern NonOne :: (MMonoid m, Eq m) => m -> m
pattern $mNonOne :: forall {r} {m}.
(MMonoid m, Eq m) =>
m -> (m -> r) -> ((# #) -> r) -> r
NonOne y <- (\m
x -> (m
x m -> m -> Bool
forall a. Eq a => a -> a -> Bool
== m
forall m. MMonoid m => m
one, m
x) -> (False, y))
#if MIN_VERSION_base(4, 16, 0)
{-# COMPLETE One, NonOne #-}
#endif
deriving via (AsNum a) instance (Num a) => MMonoid (AsFractional a)
deriving via (AsNum a) instance (Num a) => MMonoid (AsIntegral a)
instance (Num a) => MMonoid (AsNum a) where
one :: AsNum a
one = forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @a a
1
{-# INLINE one #-}
deriving via (AsNum Double) instance MMonoid Double
deriving via (AsNum Float) instance MMonoid Float
deriving via (AsNum Int) instance MMonoid Int
deriving via (AsNum Int8) instance MMonoid Int8
deriving via (AsNum Int16) instance MMonoid Int16
deriving via (AsNum Int32) instance MMonoid Int32
deriving via (AsNum Int64) instance MMonoid Int64
deriving via (AsNum Integer) instance MMonoid Integer
deriving via (AsNum Word) instance MMonoid Word
deriving via (AsNum Word8) instance MMonoid Word8
deriving via (AsNum Word16) instance MMonoid Word16
deriving via (AsNum Word32) instance MMonoid Word32
deriving via (AsNum Word64) instance MMonoid Word64
deriving via (AsNum Natural) instance MMonoid Natural
deriving via (AsNum (Ratio Integer)) instance MMonoid (Ratio Integer)
deriving via (AsNum (Ratio Natural)) instance MMonoid (Ratio Natural)
deriving via (AsNum (Complex a)) instance (RealFloat a) => MMonoid (Complex a)
deriving via (AsNum (Fixed k)) instance (HasResolution k) => MMonoid (Fixed k)