{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE DefaultSignatures #-}

module Precursor.Algebra.Ring where

import qualified Prelude
import           Precursor.Algebra.Semiring
import           Data.Int  (Int, Int16, Int32, Int64, Int8)
import           GHC.Float (Double, Float)

-- | A 'Ring' is a 'Semiring' with an additive inverse, such that:
--
-- * @∀ r. r ∈ 'Ring' ∃ i. r '-' i = 'zero'@
class Semiring a => Ring a where
  infixl 6 -
  -- | A binary operation such that:
  --
  -- * @∀ r. r ∈ 'Ring' ∃ i. r '-' i = 'zero'@
  (-) :: a -> a -> a

  default (-) :: Prelude.Num a => a -> a -> a
  (-) = (Prelude.-)

instance Ring Int
instance Ring Int8
instance Ring Int16
instance Ring Int32
instance Ring Int64
instance Ring Prelude.Integer
instance Ring Float
instance Ring Double