@@ -2,6 +2,8 @@ module Data.Csv.Conversion.Internal
22 ( decimal
33 , scientific
44 , realFloat
5+ , viaBuilder
6+ , formatBoundedSigned
57 ) where
68
79import Data.ByteString.Builder (Builder , toLazyByteString , word8 , char8 ,
@@ -12,7 +14,6 @@ import Data.Array.Base (unsafeAt)
1214import Data.Array.IArray
1315import qualified Data.ByteString as B
1416import Data.Char (ord )
15- import Data.Int
1617import qualified Data.Monoid as Mon
1718import Data.Scientific (Scientific )
1819import Data.Word
@@ -29,26 +30,6 @@ decimal = toStrict . toLazyByteString . formatDecimal
2930-- TODO: Add an optimized version for Integer.
3031
3132formatDecimal :: Integral a => a -> Builder
32- {-# RULES "formatDecimal/Int" formatDecimal = formatBoundedSigned
33- :: Int -> Builder #-}
34- {-# RULES "formatDecimal/Int8" formatDecimal = formatBoundedSigned
35- :: Int8 -> Builder #-}
36- {-# RULES "formatDecimal/Int16" formatDecimal = formatBoundedSigned
37- :: Int16 -> Builder #-}
38- {-# RULES "formatDecimal/Int32" formatDecimal = formatBoundedSigned
39- :: Int32 -> Builder #-}
40- {-# RULES "formatDecimal/Int64" formatDecimal = formatBoundedSigned
41- :: Int64 -> Builder #-}
42- {-# RULES "formatDecimal/Word" formatDecimal = formatPositive
43- :: Word -> Builder #-}
44- {-# RULES "formatDecimal/Word8" formatDecimal = formatPositive
45- :: Word8 -> Builder #-}
46- {-# RULES "formatDecimal/Word16" formatDecimal = formatPositive
47- :: Word16 -> Builder #-}
48- {-# RULES "formatDecimal/Word32" formatDecimal = formatPositive
49- :: Word32 -> Builder #-}
50- {-# RULES "formatDecimal/Word64" formatDecimal = formatPositive
51- :: Word64 -> Builder #-}
5233{-# NOINLINE formatDecimal #-}
5334formatDecimal i
5435 | i < 0 = minus Mon. <>
@@ -58,11 +39,6 @@ formatDecimal i
5839 | otherwise = formatPositive i
5940
6041formatBoundedSigned :: (Integral a , Bounded a ) => a -> Builder
61- {-# SPECIALIZE formatBoundedSigned :: Int -> Builder #-}
62- {-# SPECIALIZE formatBoundedSigned :: Int8 -> Builder #-}
63- {-# SPECIALIZE formatBoundedSigned :: Int16 -> Builder #-}
64- {-# SPECIALIZE formatBoundedSigned :: Int32 -> Builder #-}
65- {-# SPECIALIZE formatBoundedSigned :: Int64 -> Builder #-}
6642formatBoundedSigned i
6743 | i < 0 = minus Mon. <>
6844 if i == minBound
@@ -71,16 +47,6 @@ formatBoundedSigned i
7147 | otherwise = formatPositive i
7248
7349formatPositive :: Integral a => a -> Builder
74- {-# SPECIALIZE formatPositive :: Int -> Builder #-}
75- {-# SPECIALIZE formatPositive :: Int8 -> Builder #-}
76- {-# SPECIALIZE formatPositive :: Int16 -> Builder #-}
77- {-# SPECIALIZE formatPositive :: Int32 -> Builder #-}
78- {-# SPECIALIZE formatPositive :: Int64 -> Builder #-}
79- {-# SPECIALIZE formatPositive :: Word -> Builder #-}
80- {-# SPECIALIZE formatPositive :: Word8 -> Builder #-}
81- {-# SPECIALIZE formatPositive :: Word16 -> Builder #-}
82- {-# SPECIALIZE formatPositive :: Word32 -> Builder #-}
83- {-# SPECIALIZE formatPositive :: Word64 -> Builder #-}
8450formatPositive = go
8551 where go n | n < 10 = digit n
8652 | otherwise = go (n `quot` 10 ) Mon. <> digit (n `rem` 10 )
@@ -107,8 +73,6 @@ scientific = toStrict . toLazyByteString . scientificBuilder
10773{-# INLINE scientific #-}
10874
10975realFloat :: RealFloat a => a -> B. ByteString
110- {-# SPECIALIZE realFloat :: Float -> B.ByteString #-}
111- {-# SPECIALIZE realFloat :: Double -> B.ByteString #-}
11276realFloat = toStrict . toLazyByteString . formatRealFloat Generic
11377
11478-- | Control the rendering of floating point numbers.
@@ -122,8 +86,6 @@ data FPFormat = Exponent
12286 deriving (Enum , Read , Show )
12387
12488formatRealFloat :: RealFloat a => FPFormat -> a -> Builder
125- {-# SPECIALIZE formatRealFloat :: FPFormat -> Float -> Builder #-}
126- {-# SPECIALIZE formatRealFloat :: FPFormat -> Double -> Builder #-}
12789formatRealFloat fmt x
12890 | isNaN x = string8 " NaN"
12991 | isInfinite x = if x < 0
@@ -178,8 +140,6 @@ formatRealFloat fmt x
178140-- (3) @0 <= di <= base-1@
179141
180142floatToDigits :: (RealFloat a ) => a -> ([Int ], Int )
181- {-# SPECIALIZE floatToDigits :: Float -> ([Int], Int) #-}
182- {-# SPECIALIZE floatToDigits :: Double -> ([Int], Int) #-}
183143floatToDigits 0 = ([0 ], 0 )
184144floatToDigits x =
185145 let
@@ -297,3 +257,8 @@ i2d i = fromIntegral (ord '0' + i)
297257-- | Word8 list rendering
298258word8s :: [Word8 ] -> Builder
299259word8s = BP. primMapListFixed BP. word8
260+
261+ -- | Helper function that build strict bytestring via a provided builder.
262+ viaBuilder :: Builder -> B. ByteString
263+ viaBuilder = toStrict . toLazyByteString
264+ {-# INLINE viaBuilder #-}
0 commit comments