packages feed

scientific 0.3.4.0 → 0.3.4.1

raw patch · 6 files changed

+140/−119 lines, 6 filesdep ~basedep ~containersPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: base, containers

API changes (from Hackage documentation)

Files

changelog view
@@ -1,3 +1,6 @@+0.3.4.1+	* Fix build on GHC-7.0.4+ 0.3.4.0 	* Added fromRationalRepetend & toRationalRepetend 	  for safely converting from and to rationals
scientific.cabal view
@@ -1,5 +1,5 @@ name:                scientific-version:             0.3.4.0+version:             0.3.4.1 synopsis:            Numbers represented using scientific notation description:   @Data.Scientific@ provides the number type 'Scientific'. Scientific numbers are@@ -63,6 +63,7 @@   exposed-modules:     Data.Scientific                        Data.Text.Lazy.Builder.Scientific   other-modules:       Math.NumberTheory.Logarithms+                       GHC.Integer.Logarithms.Compat                        Utils   other-extensions:    DeriveDataTypeable, BangPatterns   ghc-options:         -Wall@@ -72,7 +73,7 @@                      , text        >= 0.8   && < 1.3                      , hashable    >= 1.1.2 && < 1.3                      , vector      >= 0.5   && < 0.12-                     , containers  >= 0.5   && < 0.6+                     , containers  >= 0.1   && < 0.6                      , binary      >= 0.4.1 && < 0.8    if flag(integer-simple)
src/Data/Scientific.hs view
@@ -102,7 +102,7 @@ import           Data.Data                    (Data) import           Data.Function                (on) import           Data.Hashable                (Hashable(..))-import qualified Data.Map.Strict     as M     (Map, empty, insert, lookup)+import qualified Data.Map            as M     (Map, empty, insert, lookup) import           Data.Ratio                   ((%), numerator, denominator) import           Data.Typeable                (Typeable) import qualified Data.Vector         as V@@ -127,10 +127,16 @@ import           Data.Bits                    (shiftR) #endif -import GHC.Integer (quotRemInteger, divInteger, quotInteger)+import GHC.Integer (quotRemInteger, quotInteger)  import Utils (roundTo) +#if MIN_VERSION_integer_gmp(0,5,1)+import GHC.Integer (divInteger)+#else+divInteger :: Integer -> Integer -> Integer+divInteger = div+#endif  ---------------------------------------------------------------------- -- Type@@ -983,5 +989,6 @@  normalizePositive :: Integer -> Int -> (Integer, Int) normalizePositive c !e = case quotRemInteger c 10 of-                           (# c', 0 #) -> normalizePositive c' (e+1)-                           _           -> (c, e)+                           (# c', r #)+                               | r == 0    -> normalizePositive c' (e+1)+                               | otherwise -> (c, e)
src/Data/Text/Lazy/Builder/Scientific.hs view
@@ -14,6 +14,8 @@ import Data.Text.Lazy.Builder       (Builder, fromString, singleton, fromText) import Data.Text.Lazy.Builder.Int   (decimal) import qualified Data.Text as T     (replicate)+import Utils (roundTo, i2d)+ #if MIN_VERSION_base(4,5,0) import Data.Monoid                  ((<>)) #else@@ -22,8 +24,6 @@ (<>) = mappend infixr 6 <> #endif--import Utils (roundTo, i2d)  -- | A @Text@ @Builder@ which renders a scientific number to full -- precision, using standard decimal notation for arguments whose
+ src/GHC/Integer/Logarithms/Compat.hs view
@@ -0,0 +1,120 @@+{-# LANGUAGE CPP, MagicHash, UnboxedTuples #-}++module GHC.Integer.Logarithms.Compat+    ( integerLog2#+    , wordLog2#+    ) where++#if __GLASGOW_HASKELL__ >= 702+import GHC.Integer.Logarithms (integerLog2#, wordLog2#)+#else+#include "MachDeps.h"++import GHC.Integer.GMP.Internals (Integer(S#, J#))++import GHC.Base ( indexWordArray#, uncheckedIShiftL#, indexInt8Array#+                , word2Int#, ByteArray#, newByteArray#, writeInt8Array#+                , (==#), (<#), (+#), (*#)+                , unsafeFreezeByteArray#, realWorld#+                , neWord#, (-#), uncheckedShiftRL#+                , Int#, Word#, int2Word#+                )++#if (WORD_SIZE_IN_BITS != 32) && (WORD_SIZE_IN_BITS != 64)+#error Only word sizes 32 and 64 are supported.+#endif+++#if WORD_SIZE_IN_BITS == 32++#define WSHIFT 5+#define MMASK 31++#else++#define WSHIFT 6+#define MMASK 63++#endif++-- | Calculate the integer base 2 logarithm of an 'Integer'.+--   The calculation is much more efficient than for the general case.+--+--   The argument must be strictly positive, that condition is /not/ checked.+integerLog2# :: Integer -> Int#+integerLog2# (S# i) = wordLog2# (int2Word# i)+integerLog2# (J# s ba) = check (s -# 1#)+  where+    check i = case indexWordArray# ba i of+                0## -> check (i -# 1#)+                w   -> wordLog2# w +# (uncheckedIShiftL# i WSHIFT#)++-- | This function calculates the integer base 2 logarithm of a 'Word#'.+--   @'wordLog2#' 0## = -1#@.+{-# INLINE wordLog2# #-}+wordLog2# :: Word# -> Int#+wordLog2# w =+  case leadingZeros of+   BA lz ->+    let zeros u = indexInt8Array# lz (word2Int# u) in+#if WORD_SIZE_IN_BITS == 64+    case uncheckedShiftRL# w 56# of+     a ->+      if a `neWord#` 0##+       then 64# -# zeros a+       else+        case uncheckedShiftRL# w 48# of+         b ->+          if b `neWord#` 0##+           then 56# -# zeros b+           else+            case uncheckedShiftRL# w 40# of+             c ->+              if c `neWord#` 0##+               then 48# -# zeros c+               else+                case uncheckedShiftRL# w 32# of+                 d ->+                  if d `neWord#` 0##+                   then 40# -# zeros d+                   else+#endif+                    case uncheckedShiftRL# w 24# of+                     e ->+                      if e `neWord#` 0##+                       then 32# -# zeros e+                       else+                        case uncheckedShiftRL# w 16# of+                         f ->+                          if f `neWord#` 0##+                           then 24# -# zeros f+                           else+                            case uncheckedShiftRL# w 8# of+                             g ->+                              if g `neWord#` 0##+                               then 16# -# zeros g+                               else 8# -# zeros w++-- Lookup table+data BA = BA ByteArray#++leadingZeros :: BA+leadingZeros =+    let mkArr s =+          case newByteArray# 256# s of+            (# s1, mba #) ->+              case writeInt8Array# mba 0# 9# s1 of+                s2 ->+                  let fillA lim val idx st =+                        if idx ==# 256#+                          then st+                          else if idx <# lim+                                then case writeInt8Array# mba idx val st of+                                        nx -> fillA lim val (idx +# 1#) nx+                                else fillA (2# *# lim) (val -# 1#) idx st+                  in case fillA 2# 8# 1# s2 of+                      s3 -> case unsafeFreezeByteArray# mba s3 of+                              (# _, ba #) -> ba+    in case mkArr realWorld# of+        b -> BA b+#endif
src/Math/NumberTheory/Logarithms.hs view
@@ -20,117 +20,7 @@ #endif                 ) -#if __GLASGOW_HASKELL__ >= 702-import GHC.Integer.Logarithms (integerLog2#, wordLog2#)-#else-#include "MachDeps.h"--import GHC.Integer.GMP.Internals (Integer(S#, J#))--import GHC.Base ( indexWordArray#, uncheckedIShiftL#, indexInt8Array#-                , word2Int#, ByteArray#, newByteArray#, writeInt8Array#-                , (==#), (<#), (+#), (*#)-                , unsafeFreezeByteArray#, realWorld#-                )--#if (WORD_SIZE_IN_BITS != 32) && (WORD_SIZE_IN_BITS != 64)-#error Only word sizes 32 and 64 are supported.-#endif---#if WORD_SIZE_IN_BITS == 32--#define WSHIFT 5-#define MMASK 31--#else--#define WSHIFT 6-#define MMASK 63--#endif---- | Calculate the integer base 2 logarithm of an 'Integer'.---   The calculation is much more efficient than for the general case.------   The argument must be strictly positive, that condition is /not/ checked.-integerLog2# :: Integer -> Int#-integerLog2# (S# i) = wordLog2# (int2Word# i)-integerLog2# (J# s ba) = check (s -# 1#)-  where-    check i = case indexWordArray# ba i of-                0## -> check (i -# 1#)-                w   -> wordLog2# w +# (uncheckedIShiftL# i WSHIFT#)---- | This function calculates the integer base 2 logarithm of a 'Word#'.---   @'wordLog2#' 0## = -1#@.-{-# INLINE wordLog2# #-}-wordLog2# :: Word# -> Int#-wordLog2# w =-  case leadingZeros of-   BA lz ->-    let zeros u = indexInt8Array# lz (word2Int# u) in-#if WORD_SIZE_IN_BITS == 64-    case uncheckedShiftRL# w 56# of-     a ->-      if a `neWord#` 0##-       then 64# -# zeros a-       else-        case uncheckedShiftRL# w 48# of-         b ->-          if b `neWord#` 0##-           then 56# -# zeros b-           else-            case uncheckedShiftRL# w 40# of-             c ->-              if c `neWord#` 0##-               then 48# -# zeros c-               else-                case uncheckedShiftRL# w 32# of-                 d ->-                  if d `neWord#` 0##-                   then 40# -# zeros d-                   else-#endif-                    case uncheckedShiftRL# w 24# of-                     e ->-                      if e `neWord#` 0##-                       then 32# -# zeros e-                       else-                        case uncheckedShiftRL# w 16# of-                         f ->-                          if f `neWord#` 0##-                           then 24# -# zeros f-                           else-                            case uncheckedShiftRL# w 8# of-                             g ->-                              if g `neWord#` 0##-                               then 16# -# zeros g-                               else 8# -# zeros w---- Lookup table-data BA = BA ByteArray#--leadingZeros :: BA-leadingZeros =-    let mkArr s =-          case newByteArray# 256# s of-            (# s1, mba #) ->-              case writeInt8Array# mba 0# 9# s1 of-                s2 ->-                  let fillA lim val idx st =-                        if idx ==# 256#-                          then st-                          else if idx <# lim-                                then case writeInt8Array# mba idx val st of-                                        nx -> fillA lim val (idx +# 1#) nx-                                else fillA (2# *# lim) (val -# 1#) idx st-                  in case fillA 2# 8# 1# s2 of-                      s3 -> case unsafeFreezeByteArray# mba s3 of-                              (# _, ba #) -> ba-    in case mkArr realWorld# of-        b -> BA b-#endif+import GHC.Integer.Logarithms.Compat (integerLog2#, wordLog2#)  -- | Only defined for positive inputs! integerLog10' :: Integer -> Int