{-# language Safe #-}

module D10.Num.Arithmetic where

import D10.Num (D10, d10Int, intMod10)

import qualified Prelude as P
import Prelude (Integral)

-- | Addition modulo 10.
--
-- >>> [d10|2|] + [d10|3|]
-- [d10|5|]
--
-- >>> [d10|6|] + [d10|7|]
-- [d10|3|]

(+) :: Integral a => D10 a -> D10 a -> D10 a
D10 a
x + :: D10 a -> D10 a -> D10 a
+ D10 a
y = Int -> D10 a
forall a. Num a => Int -> D10 a
intMod10 (D10 a -> Int
forall a. Integral a => D10 a -> Int
d10Int D10 a
x Int -> Int -> Int
forall a. Num a => a -> a -> a
P.+ D10 a -> Int
forall a. Integral a => D10 a -> Int
d10Int D10 a
y)

-- | Subtraction modulo 10.
--
-- >>> [d10|7|] - [d10|5|]
-- [d10|2|]
--
-- >>> [d10|3|] - [d10|7|]
-- [d10|6|]

(-) :: Integral a => D10 a -> D10 a -> D10 a
D10 a
x - :: D10 a -> D10 a -> D10 a
- D10 a
y = Int -> D10 a
forall a. Num a => Int -> D10 a
intMod10 (D10 a -> Int
forall a. Integral a => D10 a -> Int
d10Int D10 a
x Int -> Int -> Int
forall a. Num a => a -> a -> a
P.- D10 a -> Int
forall a. Integral a => D10 a -> Int
d10Int D10 a
y)

-- | Multiplication modulo 10.
--
-- >>> [d10|2|] * [d10|4|]
-- [d10|8|]
--
-- >>> [d10|7|] * [d10|8|]
-- [d10|6|]

(*) :: Integral a => D10 a -> D10 a -> D10 a
D10 a
x * :: D10 a -> D10 a -> D10 a
* D10 a
y = Int -> D10 a
forall a. Num a => Int -> D10 a
intMod10 (D10 a -> Int
forall a. Integral a => D10 a -> Int
d10Int D10 a
x Int -> Int -> Int
forall a. Num a => a -> a -> a
P.* D10 a -> Int
forall a. Integral a => D10 a -> Int
d10Int D10 a
y)