[commit: base] master: Eliminate the orphaned Enum Integer instance (fdb3ef3)
Ian Lynagh
igloo at earth.li
Fri Sep 16 02:19:18 CEST 2011
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 <igloo at earth.li>
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}
-
More information about the Cvs-libraries
mailing list