module Numeric.Algebra.Multiplicative.MSemigroup
( MSemigroup (..),
)
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),
)
type MSemigroup :: Type -> Constraint
class MSemigroup s where
(.*.) :: s -> s -> s
infixl 7 .*.
deriving via (AsNum a) instance (Num a) => MSemigroup (AsFractional a)
deriving via (AsNum a) instance (Num a) => MSemigroup (AsIntegral a)
instance (Num a) => MSemigroup (AsNum a) where
.*. :: AsNum a -> AsNum a -> AsNum a
(.*.) = forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @(a -> a -> a) @(AsNum a -> AsNum a -> AsNum a) a -> a -> a
forall a. Num a => a -> a -> a
(*)
{-# INLINE (.*.) #-}
deriving via (AsNum Double) instance MSemigroup Double
deriving via (AsNum Float) instance MSemigroup Float
deriving via (AsNum Int) instance MSemigroup Int
deriving via (AsNum Int8) instance MSemigroup Int8
deriving via (AsNum Int16) instance MSemigroup Int16
deriving via (AsNum Int32) instance MSemigroup Int32
deriving via (AsNum Int64) instance MSemigroup Int64
deriving via (AsNum Integer) instance MSemigroup Integer
deriving via (AsNum Word) instance MSemigroup Word
deriving via (AsNum Word8) instance MSemigroup Word8
deriving via (AsNum Word16) instance MSemigroup Word16
deriving via (AsNum Word32) instance MSemigroup Word32
deriving via (AsNum Word64) instance MSemigroup Word64
deriving via (AsNum Natural) instance MSemigroup Natural
deriving via (AsNum (Ratio Integer)) instance MSemigroup (Ratio Integer)
deriving via (AsNum (Ratio Natural)) instance MSemigroup (Ratio Natural)
deriving via (AsNum (Complex a)) instance (RealFloat a) => MSemigroup (Complex a)
deriving via (AsNum (Fixed k)) instance (HasResolution k) => MSemigroup (Fixed k)