-----------------------------------------------------------------------------
-- |
-- Module : GHC.Real
--- Copyright : (c) The FFI Task Force, 1994-2002
+-- Copyright : (c) The University of Glasgow, 1994-2002
-- License : see libraries/base/LICENSE
--
-- Maintainer : cvs-ghc@haskell.org
import GHC.List
import GHC.Enum
import GHC.Show
+import GHC.Err
infixr 8 ^, ^^
infixl 7 /, `quot`, `rem`, `div`, `mod`
properFraction :: (Integral b) => a -> (b,a)
-- | @'truncate' x@ returns the integer nearest @x@ between zero and @x@
truncate :: (Integral b) => a -> b
- -- | @'round' x@ returns the nearest integer to @x@
+ -- | @'round' x@ returns the nearest integer to @x@;
+ -- the even integer if @x@ is equidistant between two integers
round :: (Integral b) => a -> b
-- | @'ceiling' x@ returns the least integer not less than @x@
ceiling :: (Integral b) => a -> b
lcm 0 _ = 0
lcm x y = abs ((x `quot` (gcd x y)) * y)
+#ifdef OPTIMISE_INTEGER_GCD_LCM
{-# RULES
"gcd/Int->Int->Int" gcd = gcdInt
"gcd/Integer->Integer->Integer" gcd = gcdInteger'
gcdInteger' 0 0 = error "GHC.Real.gcdInteger': gcd 0 0 is undefined"
gcdInteger' a b = gcdInteger a b
+gcdInt :: Int -> Int -> Int
+gcdInt 0 0 = error "GHC.Real.gcdInt: gcd 0 0 is undefined"
+gcdInt a b = fromIntegral (gcdInteger (fromIntegral a) (fromIntegral b))
+#endif
+
integralEnumFrom :: (Integral a, Bounded a) => a -> [a]
integralEnumFrom n = map fromInteger [toInteger n .. toInteger (maxBound `asTypeOf` n)]