[project @ 2001-12-21 15:07:20 by simonmar]
[ghc-base.git] / GHC / Enum.lhs
index 7e59d98..7e5f9d9 100644 (file)
@@ -1,5 +1,5 @@
 % -----------------------------------------------------------------------------
-% $Id: Enum.lhs,v 1.4 2001/07/04 11:29:26 simonmar Exp $
+% $Id: Enum.lhs,v 1.6 2001/12/21 15:07:22 simonmar Exp $
 %
 % (c) The University of Glasgow, 1992-2000
 %
@@ -205,11 +205,13 @@ instance  Enum Char  where
     {-# INLINE enumFromThenTo #-}
     enumFromThenTo (C# x1) (C# x2) (C# y) = efdtChar (ord# x1) (ord# x2) (ord# y)
 
+{-# NOINLINE [1] eftChar #-}
+{-# NOINLINE [1] efdChar #-}
+{-# NOINLINE [1] efdtChar #-}
 eftChar  = eftCharList
 efdChar  = efdCharList
 efdtChar = efdtCharList
 
-
 {-# RULES
 "eftChar"      forall x y.     eftChar x y       = build (\c n -> eftCharFB c n x y)
 "efdChar"      forall x1 x2.   efdChar x1 x2     = build (\ c n -> efdCharFB c n x1 x2)
@@ -222,7 +224,7 @@ efdtChar = efdtCharList
 
 -- We can do better than for Ints because we don't
 -- have hassles about arithmetic overflow at maxBound
-{-# INLINE eftCharFB #-}
+{-# INLINE [0] eftCharFB #-}
 eftCharFB c n x y = go x
                 where
                    go x | x ># y    = n
@@ -233,6 +235,7 @@ eftCharList x y | x ># y    = []
 
 
 -- For enumFromThenTo we give up on inlining
+{-# NOINLINE [0] efdCharFB #-}
 efdCharFB c n x1 x2
   | delta >=# 0# = go_up_char_fb c n x1 delta 0x10FFFF#
   | otherwise    = go_dn_char_fb c n x1 delta 0#
@@ -245,6 +248,7 @@ efdCharList x1 x2
   where
     delta = x2 -# x1
 
+{-# NOINLINE [0] efdtCharFB #-}
 efdtCharFB c n x1 x2 lim
   | delta >=# 0# = go_up_char_fb c n x1 delta lim
   | otherwise    = go_dn_char_fb c n x1 delta lim
@@ -313,7 +317,8 @@ instance  Enum Int  where
     fromEnum x = x
 
     {-# INLINE enumFrom #-}
-    enumFrom (I# x) = eftInt x 2147483647#
+    enumFrom (I# x) = eftInt x maxInt#
+        where I# maxInt# = maxInt
        -- Blarg: technically I guess enumFrom isn't strict!
 
     {-# INLINE enumFromTo #-}
@@ -325,6 +330,9 @@ instance  Enum Int  where
     {-# INLINE enumFromThenTo #-}
     enumFromThenTo (I# x1) (I# x2) (I# y) = efdtInt x1 x2 y
 
+{-# NOINLINE [1] eftInt #-}
+{-# NOINLINE [1] efdInt #-}
+{-# NOINLINE [1] efdtInt #-}
 eftInt         = eftIntList
 efdInt         = efdIntList
 efdtInt = efdtIntList
@@ -340,7 +348,7 @@ efdtInt = efdtIntList
  #-}
 
 
-{-# INLINE eftIntFB #-}
+{-# INLINE [0] eftIntFB #-}
 eftIntFB c n x y | x ># y    = n       
                 | otherwise = go x
                 where
@@ -358,6 +366,7 @@ eftIntList x y | x ># y    = []
 
 -- For enumFromThenTo we give up on inlining; so we don't worry
 -- about duplicating occurrences of "c"
+{-# NOINLINE [0] efdtIntFB #-}
 efdtIntFB c n x1 x2 y
   | delta >=# 0# = if x1 ># y then n else go_up_int_fb c n x1 delta lim
   | otherwise    = if x1 <# y then n else go_dn_int_fb c n x1 delta lim 
@@ -372,15 +381,16 @@ efdtIntList x1 x2 y
     delta = x2 -# x1
     lim   = y -# delta
 
+{-# NOINLINE [0] efdIntFB #-}
 efdIntFB c n x1 x2
-  | delta >=# 0# = go_up_int_fb c n x1 delta (  2147483647#  -# delta)
-  | otherwise    = go_dn_int_fb c n x1 delta ((-2147483648#) -# delta)
+  | delta >=# 0# = case maxInt of I# y -> go_up_int_fb c n x1 delta (y -# delta)
+  | otherwise    = case minInt of I# y -> go_dn_int_fb c n x1 delta (y -# delta)
   where
     delta = x2 -# x1
 
 efdIntList x1 x2
-  | delta >=# 0# = go_up_int_list x1 delta (  2147483647#  -# delta)
-  | otherwise    = go_dn_int_list x1 delta ((-2147483648#) -# delta)
+  | delta >=# 0# = case maxInt of I# y -> go_up_int_list x1 delta (y -# delta)
+  | otherwise    = case minInt of I# y -> go_dn_int_list x1 delta (y -# delta)
   where
     delta = x2 -# x1