Repository : ssh://darcs.haskell.org//srv/darcs/packages/base

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/fdb3ef3ee78d953923b0ddd1e971042a932bf8b5

>---------------------------------------------------------------

commit fdb3ef3ee78d953923b0ddd1e971042a932bf8b5
Author: Ian Lynagh <[email protected]>
Date:   Thu Sep 15 18:46:17 2011 +0100

    Eliminate the orphaned Enum Integer instance
    
    Also allows us to make GHC.Enum depend on GHC.Num rather than the
    other way round.

>---------------------------------------------------------------

 GHC/Enum.lhs |   77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 GHC/Num.lhs  |   76 ---------------------------------------------------------
 2 files changed, 77 insertions(+), 76 deletions(-)

diff --git a/GHC/Enum.lhs b/GHC/Enum.lhs
index abcc624..61ee894 100644
--- a/GHC/Enum.lhs
+++ b/GHC/Enum.lhs
@@ -26,6 +26,8 @@ module GHC.Enum(
    ) where
 
 import GHC.Base
+import GHC.Integer
+import GHC.Num
 import Data.Tuple       ()              -- for dependencies
 default ()              -- Double isn't available yet
 \end{code}
@@ -585,3 +587,78 @@ efdtIntDnFB c n x1 x2 y    -- Be careful about underflow!
                in I# x1 `c` go_dn x2
 \end{code}
 
+
+%*********************************************************
+%*                                                      *
+\subsection{The @Integer@ instance for @Enum@}
+%*                                                      *
+%*********************************************************
+
+\begin{code}
+instance  Enum Integer  where
+    succ x               = x + 1
+    pred x               = x - 1
+    toEnum (I# n)        = smallInteger n
+    fromEnum n           = I# (integerToInt n)
+
+    {-# INLINE enumFrom #-}
+    {-# INLINE enumFromThen #-}
+    {-# INLINE enumFromTo #-}
+    {-# INLINE enumFromThenTo #-}
+    enumFrom x             = enumDeltaInteger  x 1
+    enumFromThen x y       = enumDeltaInteger  x (y-x)
+    enumFromTo x lim       = enumDeltaToInteger x 1     lim
+    enumFromThenTo x y lim = enumDeltaToInteger x (y-x) lim
+
+{-# RULES
+"enumDeltaInteger"      [~1] forall x y.  enumDeltaInteger x y     = build (\c 
_ -> enumDeltaIntegerFB c x y)
+"efdtInteger"           [~1] forall x y l.enumDeltaToInteger x y l = build (\c 
n -> enumDeltaToIntegerFB c n x y l)
+"enumDeltaInteger"      [1] enumDeltaIntegerFB   (:)    = enumDeltaInteger
+"enumDeltaToInteger"    [1] enumDeltaToIntegerFB (:) [] = enumDeltaToInteger
+ #-}
+
+enumDeltaIntegerFB :: (Integer -> b -> b) -> Integer -> Integer -> b
+enumDeltaIntegerFB c x d = x `seq` (x `c` enumDeltaIntegerFB c (x+d) d)
+
+enumDeltaInteger :: Integer -> Integer -> [Integer]
+enumDeltaInteger x d = x `seq` (x : enumDeltaInteger (x+d) d)
+-- strict accumulator, so
+--     head (drop 1000000 [1 .. ]
+-- works
+
+{-# NOINLINE [0] enumDeltaToIntegerFB #-}
+-- Don't inline this until RULE "enumDeltaToInteger" has had a chance to fire
+enumDeltaToIntegerFB :: (Integer -> a -> a) -> a
+                     -> Integer -> Integer -> Integer -> a
+enumDeltaToIntegerFB c n x delta lim
+  | delta >= 0 = up_fb c n x delta lim
+  | otherwise  = dn_fb c n x delta lim
+
+enumDeltaToInteger :: Integer -> Integer -> Integer -> [Integer]
+enumDeltaToInteger x delta lim
+  | delta >= 0 = up_list x delta lim
+  | otherwise  = dn_list x delta lim
+
+up_fb :: (Integer -> a -> a) -> a -> Integer -> Integer -> Integer -> a
+up_fb c n x0 delta lim = go (x0 :: Integer)
+                      where
+                        go x | x > lim   = n
+                             | otherwise = x `c` go (x+delta)
+dn_fb :: (Integer -> a -> a) -> a -> Integer -> Integer -> Integer -> a
+dn_fb c n x0 delta lim = go (x0 :: Integer)
+                      where
+                        go x | x < lim   = n
+                             | otherwise = x `c` go (x+delta)
+
+up_list :: Integer -> Integer -> Integer -> [Integer]
+up_list x0 delta lim = go (x0 :: Integer)
+                    where
+                        go x | x > lim   = []
+                             | otherwise = x : go (x+delta)
+dn_list :: Integer -> Integer -> Integer -> [Integer]
+dn_list x0 delta lim = go (x0 :: Integer)
+                    where
+                        go x | x < lim   = []
+                             | otherwise = x : go (x+delta)
+\end{code}
+
diff --git a/GHC/Num.lhs b/GHC/Num.lhs
index bbdc89f..148bdfa 100644
--- a/GHC/Num.lhs
+++ b/GHC/Num.lhs
@@ -37,7 +37,6 @@
 module GHC.Num (module GHC.Num, module GHC.Integer) where
 
 import GHC.Base
-import GHC.Enum
 import GHC.Show
 import GHC.Integer
 
@@ -239,78 +238,3 @@ instance  Num Integer  where
     signum = signumInteger
 \end{code}
 
-
-%*********************************************************
-%*                                                      *
-\subsection{The @Integer@ instance for @Enum@}
-%*                                                      *
-%*********************************************************
-
-\begin{code}
-instance  Enum Integer  where
-    succ x               = x + 1
-    pred x               = x - 1
-    toEnum (I# n)        = smallInteger n
-    fromEnum n           = I# (integerToInt n)
-
-    {-# INLINE enumFrom #-}
-    {-# INLINE enumFromThen #-}
-    {-# INLINE enumFromTo #-}
-    {-# INLINE enumFromThenTo #-}
-    enumFrom x             = enumDeltaInteger  x 1
-    enumFromThen x y       = enumDeltaInteger  x (y-x)
-    enumFromTo x lim       = enumDeltaToInteger x 1     lim
-    enumFromThenTo x y lim = enumDeltaToInteger x (y-x) lim
-
-{-# RULES
-"enumDeltaInteger"      [~1] forall x y.  enumDeltaInteger x y     = build (\c 
_ -> enumDeltaIntegerFB c x y)
-"efdtInteger"           [~1] forall x y l.enumDeltaToInteger x y l = build (\c 
n -> enumDeltaToIntegerFB c n x y l)
-"enumDeltaInteger"      [1] enumDeltaIntegerFB   (:)    = enumDeltaInteger
-"enumDeltaToInteger"    [1] enumDeltaToIntegerFB (:) [] = enumDeltaToInteger
- #-}
-
-enumDeltaIntegerFB :: (Integer -> b -> b) -> Integer -> Integer -> b
-enumDeltaIntegerFB c x d = x `seq` (x `c` enumDeltaIntegerFB c (x+d) d)
-
-enumDeltaInteger :: Integer -> Integer -> [Integer]
-enumDeltaInteger x d = x `seq` (x : enumDeltaInteger (x+d) d)
--- strict accumulator, so
---     head (drop 1000000 [1 .. ]
--- works
-
-{-# NOINLINE [0] enumDeltaToIntegerFB #-}
--- Don't inline this until RULE "enumDeltaToInteger" has had a chance to fire
-enumDeltaToIntegerFB :: (Integer -> a -> a) -> a
-                     -> Integer -> Integer -> Integer -> a
-enumDeltaToIntegerFB c n x delta lim
-  | delta >= 0 = up_fb c n x delta lim
-  | otherwise  = dn_fb c n x delta lim
-
-enumDeltaToInteger :: Integer -> Integer -> Integer -> [Integer]
-enumDeltaToInteger x delta lim
-  | delta >= 0 = up_list x delta lim
-  | otherwise  = dn_list x delta lim
-
-up_fb :: (Integer -> a -> a) -> a -> Integer -> Integer -> Integer -> a
-up_fb c n x0 delta lim = go (x0 :: Integer)
-                      where
-                        go x | x > lim   = n
-                             | otherwise = x `c` go (x+delta)
-dn_fb :: (Integer -> a -> a) -> a -> Integer -> Integer -> Integer -> a
-dn_fb c n x0 delta lim = go (x0 :: Integer)
-                      where
-                        go x | x < lim   = n
-                             | otherwise = x `c` go (x+delta)
-
-up_list :: Integer -> Integer -> Integer -> [Integer]
-up_list x0 delta lim = go (x0 :: Integer)
-                    where
-                        go x | x > lim   = []
-                             | otherwise = x : go (x+delta)
-dn_list :: Integer -> Integer -> Integer -> [Integer]
-dn_list x0 delta lim = go (x0 :: Integer)
-                    where
-                        go x | x < lim   = []
-                             | otherwise = x : go (x+delta)
-\end{code}
-



_______________________________________________
Cvs-libraries mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-libraries

Reply via email to