packages feed

hasmtlib-1.0.0: src/Language/Hasmtlib/Integraled.hs

{-# 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
  n `quot` d          =  q  where (q,_) = quotRem n d
  
  rem :: a -> a -> a
  n `rem` d           =  r  where (_,r) = quotRem n d

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

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

  quotRem :: a -> a -> (a, a)
  default quotRem :: P.Integral a => a -> a -> (a, a)
  quotRem = P.quotRem
  
  divMod  :: a -> a -> (a, a)
  default divMod  :: P.Integral a => a -> a -> (a, a)
  divMod = 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)