module Foundation.Numerical.Additive
( Additive(..)
) where
import Foundation.Internal.Base
import Foundation.Internal.Natural
import Foundation.Numerical.Number
import qualified Prelude
class Additive a where
azero :: a
(+) :: a -> a -> a
scale :: IsNatural n => n -> a -> a
scale 0 _ = azero
scale 1 a = a
scale 2 a = a + a
scale n a = a + scale (pred n) a
infixl 6 +
instance Additive Integer where
azero = 0
(+) = (Prelude.+)
scale = scaleNum
instance Additive Int where
azero = 0
(+) = (Prelude.+)
scale = scaleNum
instance Additive Int8 where
azero = 0
(+) = (Prelude.+)
scale = scaleNum
instance Additive Int16 where
azero = 0
(+) = (Prelude.+)
scale = scaleNum
instance Additive Int32 where
azero = 0
(+) = (Prelude.+)
scale = scaleNum
instance Additive Int64 where
azero = 0
(+) = (Prelude.+)
scale = scaleNum
instance Additive Word where
azero = 0
(+) = (Prelude.+)
scale = scaleNum
instance Additive Natural where
azero = 0
(+) = (Prelude.+)
scale = scaleNum
instance Additive Word8 where
azero = 0
(+) = (Prelude.+)
scale = scaleNum
instance Additive Word16 where
azero = 0
(+) = (Prelude.+)
scale = scaleNum
instance Additive Word32 where
azero = 0
(+) = (Prelude.+)
scale = scaleNum
instance Additive Word64 where
azero = 0
(+) = (Prelude.+)
scale = scaleNum
instance Additive Prelude.Float where
azero = 0.0
(+) = (Prelude.+)
scale = scaleNum
instance Additive Prelude.Double where
azero = 0.0
(+) = (Prelude.+)
scale = scaleNum
scaleNum :: (Prelude.Num a, IsNatural n) => n -> a -> a
scaleNum n a = (Prelude.fromIntegral $ toNatural n) Prelude.* a