content: module Jhc.Class.Real where
  
  import Jhc.Basics
  import Jhc.Class.Num
  import Jhc.Class.Ord
  import Jhc.Enum
  import Jhc.Float
  import Jhc.Type.Float
  
  infixl 7  /, `quot`, `rem`, `div`, `mod`
  
  type  Rational = Ratio Integer
  
  class  (Num a, Ord a) => Real a  where
      toRational       ::  a -> Rational
      toDouble         ::  a -> Double
      toDouble x = rationalToDouble (toRational x)
  
  class  (Real a, Enum a) => Integral a  where
      quot, rem        :: a -> a -> a
      div, mod         :: a -> a -> a
      quotRem, divMod  :: a -> a -> (a,a)
      toInteger        :: a -> Integer
      toInt            :: a -> Int
  
          -- Minimal complete definition:
          --      quotRem, toInteger
      n `quot` d       =  q  where (q,r) = quotRem n d
      n `rem` d        =  r  where (q,r) = quotRem n d
      n `div` d        =  q  where (q,r) = divMod n d
      n `mod` d        =  r  where (q,r) = divMod n d
      divMod n d       =  n `seq` d `seq` if signum r == - signum d then (q-1, r+d) else qr
                          where qr@(q,r) = quotRem n d
      quotRem n d       =  (n `quot` d, n `rem` d)
      toInteger x = toInteger (toInt x)
      toInt x = toInt (toInteger x)
  
  class  (Num a) => Fractional a  where
      (/)              :: a -> a -> a
      recip            :: a -> a
      fromRational     :: Rational -> a
      fromDouble       :: Double   -> a
  
          -- Minimal complete definition:
          --      fromRational and (recip or (/))
      recip x          =  1 / x
      x / y            =  x * recip y
  
      --fromDouble x = fromRational (doubleToRational x)
  