module Numeric.Ring.Class
  ( Ring(..)
  , fromIntegral
  ) where

import Data.Int
import Data.Word
import Numeric.Rig.Class
import Numeric.Rng.Class
import Numeric.Additive.Group
import Numeric.Algebra.Unital
import qualified Prelude
import Prelude (Integral(toInteger), Integer, (.))

class (Rig r, Rng r) => Ring r where
  fromInteger :: Integer -> r
  fromInteger n = times n one

fromIntegral :: (Integral n, Ring r) => n -> r
fromIntegral = fromInteger . toInteger

instance Ring Integer where fromInteger = Prelude.fromInteger
instance Ring Int     where fromInteger = Prelude.fromInteger
instance Ring Int8    where fromInteger = Prelude.fromInteger
instance Ring Int16   where fromInteger = Prelude.fromInteger
instance Ring Int32   where fromInteger = Prelude.fromInteger
instance Ring Int64   where fromInteger = Prelude.fromInteger
instance Ring Word    where fromInteger = Prelude.fromInteger
instance Ring Word8   where fromInteger = Prelude.fromInteger
instance Ring Word16  where fromInteger = Prelude.fromInteger
instance Ring Word32  where fromInteger = Prelude.fromInteger
instance Ring Word64  where fromInteger = Prelude.fromInteger
instance Ring () where fromInteger _ = ()
instance (Ring a, Ring b) => Ring (a, b) where
  fromInteger n = (fromInteger n, fromInteger n)
instance (Ring a, Ring b, Ring c) => Ring (a, b, c) where
  fromInteger n = (fromInteger n, fromInteger n, fromInteger n)
instance (Ring a, Ring b, Ring c, Ring d) => Ring (a, b, c, d) where
  fromInteger n = (fromInteger n, fromInteger n, fromInteger n, fromInteger n)
instance (Ring a, Ring b, Ring c, Ring d, Ring e) => Ring (a, b, c, d, e) where
  fromInteger n = (fromInteger n, fromInteger n, fromInteger n, fromInteger n, fromInteger n)