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
