{-# LANGUAGE DefaultSignatures #-}

module Language.Hasmtlib.Integraled where

import qualified Prelude as P
import Numeric.Natural  
import Data.Word
import Data.Functor.Identity
import Data.Functor.Const

-- | 'P.Integral'-like class for clean API.
--    In context hide the Preludes 'P.Integral'.  
class Integraled a where
  quot :: a -> a -> a
  a
n `quot` a
d          =  a
q  where (a
q,a
_) = a -> a -> (a, a)
forall a. Integraled a => a -> a -> (a, a)
quotRem a
n a
d
  
  rem :: a -> a -> a
  a
n `rem` a
d           =  a
r  where (a
_,a
r) = a -> a -> (a, a)
forall a. Integraled a => a -> a -> (a, a)
quotRem a
n a
d

  div :: a -> a -> a
  a
n `div` a
d           =  a
q  where (a
q,a
_) = a -> a -> (a, a)
forall a. Integraled a => a -> a -> (a, a)
divMod a
n a
d

  mod :: a -> a -> a
  a
n `mod` a
d           =  a
r  where (a
_,a
r) = a -> a -> (a, a)
forall a. Integraled a => a -> a -> (a, a)
divMod a
n a
d  

  quotRem :: a -> a -> (a, a)
  default quotRem :: P.Integral a => a -> a -> (a, a)
  quotRem = a -> a -> (a, a)
forall a. Integral a => a -> a -> (a, a)
P.quotRem
  
  divMod  :: a -> a -> (a, a)
  default divMod  :: P.Integral a => a -> a -> (a, a)
  divMod = a -> a -> (a, a)
forall a. Integral a => a -> a -> (a, a)
P.quotRem
  
instance Integraled P.Int
instance Integraled P.Integer
instance Integraled P.Word
instance Integraled Natural
instance Integraled Word8
instance Integraled Word16
instance Integraled Word32
instance Integraled Word64
instance P.Integral a => Integraled (Identity a)
instance P.Integral a => Integraled (Const a b)