Move the Integer type definition into GHC.Integer.Internals
[packages/integer-gmp.git] / GHC / Integer.lhs
index ed2cf6f..137eff1 100644 (file)
@@ -1,5 +1,5 @@
 \begin{code}
-{-# OPTIONS_GHC -fno-implicit-prelude #-}
+{-# OPTIONS_GHC -XNoImplicitPrelude #-}
 {-# OPTIONS_HADDOCK hide #-}
 -----------------------------------------------------------------------------
 -- |
@@ -68,6 +68,8 @@ import GHC.Prim (
 #endif
  )
 
+import GHC.Integer.Internals (Integer(..))
+
 #if WORD_SIZE_IN_BITS < 64
 import GHC.IntWord64 (
             Int64#, Word64#,
@@ -78,6 +80,7 @@ import GHC.IntWord64 (
 #endif
 
 import GHC.Bool
+import GHC.Ordering
 
 default ()              -- Double isn't available yet,
                         -- and we shouldn't be using defaults anyway
@@ -89,19 +92,6 @@ default ()              -- Double isn't available yet,
 %*                                                      *
 %*********************************************************
 
-\begin{code}
--- | Arbitrary-precision integers.
-data Integer
-   = S# Int#                            -- small integers
-#ifndef ILX
-   | J# Int# ByteArray#                 -- large integers
-#else
-   | J# Void BigInteger                 -- .NET big ints
-
-foreign type dotnet "BigInteger" BigInteger
-#endif
-\end{code}
-
 Convenient boxed Integer PrimOps.
 
 \begin{code}
@@ -141,8 +131,8 @@ int64ToInteger i = if ((i `leInt64#` intToInt64# 0x7FFFFFFF#) &&
                    else case int64ToInteger# i of
                         (# s, d #) -> J# s d
     where -- XXX Move the (&&) definition below us?
-          True && True = True
-          _ && _ = False
+          True  && x = x
+          False && _ = False
 #endif
 
 toInt# :: Integer -> Int#
@@ -341,29 +331,25 @@ geInteger (J# s d)   (S# i)     = cmpIntegerInt# s d i >=# 0#
 geInteger (S# i)     (J# s d)   = cmpIntegerInt# s d i <=# 0#
 geInteger (J# s1 d1) (J# s2 d2) = (cmpInteger# s1 d1 s2 d2) >=# 0#
 
--- GT => 1
--- EQ => 0
--- LT => -1
--- XXX Should we just define Ordering higher up?
-compareInteger :: Integer -> Integer -> Int#
+compareInteger :: Integer -> Integer -> Ordering
 compareInteger (S# i)  (S# j)
-   =      if i ==# j then 0#
-     else if i <=# j then -1#
-     else                 1#
+   =      if i ==# j then EQ
+     else if i <=# j then LT
+     else                 GT
 compareInteger (J# s d) (S# i)
    = case cmpIntegerInt# s d i of { res# ->
-     if res# <# 0# then -1# else
-     if res# ># 0# then 1# else 0#
+     if res# <# 0# then LT else
+     if res# ># 0# then GT else EQ
      }
 compareInteger (S# i) (J# s d)
    = case cmpIntegerInt# s d i of { res# ->
-     if res# ># 0# then -1# else
-     if res# <# 0# then 1# else 0#
+     if res# ># 0# then LT else
+     if res# <# 0# then GT else EQ
      }
 compareInteger (J# s1 d1) (J# s2 d2)
    = case cmpInteger# s1 d1 s2 d2 of { res# ->
-     if res# <# 0# then -1# else
-     if res# ># 0# then 1# else 0#
+     if res# <# 0# then LT else
+     if res# ># 0# then GT else EQ
      }
 \end{code}