{-# LANGUAGE CPP #-}
{-# LANGUAGE ViewPatterns #-}
module Numeric.Algebra.Additive.AMonoid
( AMonoid (..),
pattern Zero,
pattern NonZero,
)
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.Additive.ASemigroup (ASemigroup)
import Numeric.Algebra.Deriving
( FromFractional (MkFromFractional),
FromIntegral (MkFromIntegral),
FromNum (MkFromNum),
)
type AMonoid :: Type -> Constraint
class (ASemigroup m) => AMonoid m where
zero :: m
pattern Zero :: (AMonoid m, Eq m) => m
pattern $bZero :: forall m. (AMonoid m, Eq m) => m
$mZero :: forall {r} {m}.
(AMonoid m, Eq m) =>
m -> ((# #) -> r) -> ((# #) -> r) -> r
Zero <- ((== zero) -> True)
where
Zero = m
forall m. AMonoid m => m
zero
pattern NonZero :: (AMonoid m, Eq m) => m -> m
pattern $mNonZero :: forall {r} {m}.
(AMonoid m, Eq m) =>
m -> (m -> r) -> ((# #) -> r) -> r
NonZero y <- (\m
x -> (m
x m -> m -> Bool
forall a. Eq a => a -> a -> Bool
== m
forall m. AMonoid m => m
zero, m
x) -> (False, y))
#if MIN_VERSION_base(4, 16, 0)
{-# COMPLETE Zero, NonZero #-}
#endif
deriving via (FromNum a) instance (Num a) => AMonoid (FromFractional a)
deriving via (FromNum a) instance (Num a) => AMonoid (FromIntegral a)
instance (Num a) => AMonoid (FromNum a) where
zero :: FromNum a
zero = forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @a a
0
{-# INLINE zero #-}
deriving via (FromNum Double) instance AMonoid Double
deriving via (FromNum Float) instance AMonoid Float
deriving via (FromNum Int) instance AMonoid Int
deriving via (FromNum Int8) instance AMonoid Int8
deriving via (FromNum Int16) instance AMonoid Int16
deriving via (FromNum Int32) instance AMonoid Int32
deriving via (FromNum Int64) instance AMonoid Int64
deriving via (FromNum Integer) instance AMonoid Integer
deriving via (FromNum Word) instance AMonoid Word
deriving via (FromNum Word8) instance AMonoid Word8
deriving via (FromNum Word16) instance AMonoid Word16
deriving via (FromNum Word32) instance AMonoid Word32
deriving via (FromNum Word64) instance AMonoid Word64
deriving via (FromNum Natural) instance AMonoid Natural
deriving via (FromNum (Ratio Integer)) instance AMonoid (Ratio Integer)
deriving via (FromNum (Ratio Natural)) instance AMonoid (Ratio Natural)
deriving via (FromNum (Complex a)) instance (RealFloat a) => AMonoid (Complex a)
deriving via (FromNum (Fixed k)) instance (HasResolution k) => AMonoid (Fixed k)
instance (AMonoid a) => AMonoid (a, a) where
zero :: (a, a)
zero = (a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero)
{-# INLINE zero #-}
instance (AMonoid a) => AMonoid (a, a, a) where
zero :: (a, a, a)
zero = (a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero)
{-# INLINE zero #-}
instance (AMonoid a) => AMonoid (a, a, a, a) where
zero :: (a, a, a, a)
zero = (a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero)
{-# INLINE zero #-}
instance (AMonoid a) => AMonoid (a, a, a, a, a) where
zero :: (a, a, a, a, a)
zero = (a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero)
{-# INLINE zero #-}
instance (AMonoid a) => AMonoid (a, a, a, a, a, a) where
zero :: (a, a, a, a, a, a)
zero = (a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero)
{-# INLINE zero #-}
instance (AMonoid a) => AMonoid (a, a, a, a, a, a, a) where
zero :: (a, a, a, a, a, a, a)
zero = (a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero)
{-# INLINE zero #-}
instance (AMonoid a) => AMonoid (a, a, a, a, a, a, a, a) where
zero :: (a, a, a, a, a, a, a, a)
zero = (a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero)
{-# INLINE zero #-}
instance (AMonoid a) => AMonoid (a, a, a, a, a, a, a, a, a) where
zero :: (a, a, a, a, a, a, a, a, a)
zero = (a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero, a
forall m. AMonoid m => m
zero)
{-# INLINE zero #-}