{-# OPTIONS_HADDOCK not-home #-}-- | Copyright : (c) 2010 - 2011 Simon Meier-- License : BSD3-style (see LICENSE)---- Maintainer : Simon Meier <iridcode@gmail.com>-- Portability : GHC---- Constructing 'Builder's using ASCII-based encodings.--moduleData.ByteString.Builder.ASCII(-- ** Formatting numbers as text-- | Formatting of numbers as ASCII text.---- Note that you can also use these functions for the ISO/IEC 8859-1 and-- UTF-8 encodings, as the ASCII encoding is equivalent on the-- codepoints 0-127.-- *** Decimal numbers-- | Decimal encoding of numbers using ASCII encoded characters.int8Dec ,int16Dec ,int32Dec ,int64Dec ,intDec ,integerDec ,word8Dec ,word16Dec ,word32Dec ,word64Dec ,wordDec ,floatDec ,doubleDec -- *** Hexadecimal numbers-- | Encoding positive integers as hexadecimal numbers using lower-case-- ASCII characters. The shortest-- possible representation is used. For example,---- >>> toLazyByteString (word16Hex 0x0a10)-- Chunk "a10" Empty---- Note that there is no support for using upper-case characters. Please-- contact the maintainer, if your application cannot work without-- hexadecimal encodings that use upper-case characters.--,word8Hex ,word16Hex ,word32Hex ,word64Hex ,wordHex -- *** Fixed-width hexadecimal numbers--,int8HexFixed ,int16HexFixed ,int32HexFixed ,int64HexFixed ,word8HexFixed ,word16HexFixed ,word32HexFixed ,word64HexFixed ,floatHexFixed ,doubleHexFixed ,byteStringHex ,lazyByteStringHex )whereimportData.ByteString asSimportData.ByteString.Lazy asLimportData.ByteString.Builder.Internal (Builder )importqualifiedData.ByteString.Builder.Prim asPimportqualifiedData.ByteString.Builder.Prim.Internal asPimportData.ByteString.Builder.RealFloat (floatDec ,doubleDec )importData.ByteString.Internal.Type (c_int_dec_padded9 ,c_long_long_int_dec_padded18 )importForeignimportData.List.NonEmpty(NonEmpty(..))-------------------------------------------------------------------------------- Decimal Encoding-------------------------------------------------------------------------------- Signed integers-------------------- | Decimal encoding of an 'Int8' using the ASCII digits.---- e.g.---- > toLazyByteString (int8Dec 42) = "42"-- > toLazyByteString (int8Dec (-1)) = "-1"--{-# INLINEint8Dec #-}int8Dec ::Int8->Builder int8Dec :: Int8 -> Builder int8Dec =BoundedPrim Int8 -> Int8 -> Builder forall a. BoundedPrim a -> a -> Builder P.primBounded BoundedPrim Int8 P.int8Dec -- | Decimal encoding of an 'Int16' using the ASCII digits.{-# INLINEint16Dec #-}int16Dec ::Int16->Builder int16Dec :: Int16 -> Builder int16Dec =BoundedPrim Int16 -> Int16 -> Builder forall a. BoundedPrim a -> a -> Builder P.primBounded BoundedPrim Int16 P.int16Dec -- | Decimal encoding of an 'Int32' using the ASCII digits.{-# INLINEint32Dec #-}int32Dec ::Int32->Builder int32Dec :: Int32 -> Builder int32Dec =BoundedPrim Int32 -> Int32 -> Builder forall a. BoundedPrim a -> a -> Builder P.primBounded BoundedPrim Int32 P.int32Dec -- | Decimal encoding of an 'Int64' using the ASCII digits.{-# INLINEint64Dec #-}int64Dec ::Int64->Builder int64Dec :: Int64 -> Builder int64Dec =BoundedPrim Int64 -> Int64 -> Builder forall a. BoundedPrim a -> a -> Builder P.primBounded BoundedPrim Int64 P.int64Dec -- | Decimal encoding of an 'Int' using the ASCII digits.{-# INLINEintDec #-}intDec ::Int->Builder intDec :: Int -> Builder intDec =BoundedPrim Int -> Int -> Builder forall a. BoundedPrim a -> a -> Builder P.primBounded BoundedPrim Int P.intDec -- Unsigned integers---------------------- | Decimal encoding of a 'Word8' using the ASCII digits.{-# INLINEword8Dec #-}word8Dec ::Word8->Builder word8Dec :: Word8 -> Builder word8Dec =BoundedPrim Word8 -> Word8 -> Builder forall a. BoundedPrim a -> a -> Builder P.primBounded BoundedPrim Word8 P.word8Dec -- | Decimal encoding of a 'Word16' using the ASCII digits.{-# INLINEword16Dec #-}word16Dec ::Word16->Builder word16Dec :: Word16 -> Builder word16Dec =BoundedPrim Word16 -> Word16 -> Builder forall a. BoundedPrim a -> a -> Builder P.primBounded BoundedPrim Word16 P.word16Dec -- | Decimal encoding of a 'Word32' using the ASCII digits.{-# INLINEword32Dec #-}word32Dec ::Word32->Builder word32Dec :: Word32 -> Builder word32Dec =BoundedPrim Word32 -> Word32 -> Builder forall a. BoundedPrim a -> a -> Builder P.primBounded BoundedPrim Word32 P.word32Dec -- | Decimal encoding of a 'Word64' using the ASCII digits.{-# INLINEword64Dec #-}word64Dec ::Word64->Builder word64Dec :: Word64 -> Builder word64Dec =BoundedPrim Word64 -> Word64 -> Builder forall a. BoundedPrim a -> a -> Builder P.primBounded BoundedPrim Word64 P.word64Dec -- | Decimal encoding of a 'Word' using the ASCII digits.{-# INLINEwordDec #-}wordDec ::Word->Builder wordDec :: Word -> Builder wordDec =BoundedPrim Word -> Word -> Builder forall a. BoundedPrim a -> a -> Builder P.primBounded BoundedPrim Word P.wordDec -------------------------------------------------------------------------------- Hexadecimal Encoding-------------------------------------------------------------------------------- without lead----------------- | Shortest hexadecimal encoding of a 'Word8' using lower-case characters.{-# INLINEword8Hex #-}word8Hex ::Word8->Builder word8Hex :: Word8 -> Builder word8Hex =BoundedPrim Word8 -> Word8 -> Builder forall a. BoundedPrim a -> a -> Builder P.primBounded BoundedPrim Word8 P.word8Hex -- | Shortest hexadecimal encoding of a 'Word16' using lower-case characters.{-# INLINEword16Hex #-}word16Hex ::Word16->Builder word16Hex :: Word16 -> Builder word16Hex =BoundedPrim Word16 -> Word16 -> Builder forall a. BoundedPrim a -> a -> Builder P.primBounded BoundedPrim Word16 P.word16Hex -- | Shortest hexadecimal encoding of a 'Word32' using lower-case characters.{-# INLINEword32Hex #-}word32Hex ::Word32->Builder word32Hex :: Word32 -> Builder word32Hex =BoundedPrim Word32 -> Word32 -> Builder forall a. BoundedPrim a -> a -> Builder P.primBounded BoundedPrim Word32 P.word32Hex -- | Shortest hexadecimal encoding of a 'Word64' using lower-case characters.{-# INLINEword64Hex #-}word64Hex ::Word64->Builder word64Hex :: Word64 -> Builder word64Hex =BoundedPrim Word64 -> Word64 -> Builder forall a. BoundedPrim a -> a -> Builder P.primBounded BoundedPrim Word64 P.word64Hex -- | Shortest hexadecimal encoding of a 'Word' using lower-case characters.{-# INLINEwordHex #-}wordHex ::Word->Builder wordHex :: Word -> Builder wordHex =BoundedPrim Word -> Word -> Builder forall a. BoundedPrim a -> a -> Builder P.primBounded BoundedPrim Word P.wordHex -- fixed width; leading zeroes-------------------------------- | Encode a 'Int8' using 2 nibbles (hexadecimal digits).{-# INLINEint8HexFixed #-}int8HexFixed ::Int8->Builder int8HexFixed :: Int8 -> Builder int8HexFixed =FixedPrim Int8 -> Int8 -> Builder forall a. FixedPrim a -> a -> Builder P.primFixed FixedPrim Int8 P.int8HexFixed -- | Encode a 'Int16' using 4 nibbles.{-# INLINEint16HexFixed #-}int16HexFixed ::Int16->Builder int16HexFixed :: Int16 -> Builder int16HexFixed =FixedPrim Int16 -> Int16 -> Builder forall a. FixedPrim a -> a -> Builder P.primFixed FixedPrim Int16 P.int16HexFixed -- | Encode a 'Int32' using 8 nibbles.{-# INLINEint32HexFixed #-}int32HexFixed ::Int32->Builder int32HexFixed :: Int32 -> Builder int32HexFixed =FixedPrim Int32 -> Int32 -> Builder forall a. FixedPrim a -> a -> Builder P.primFixed FixedPrim Int32 P.int32HexFixed -- | Encode a 'Int64' using 16 nibbles.{-# INLINEint64HexFixed #-}int64HexFixed ::Int64->Builder int64HexFixed :: Int64 -> Builder int64HexFixed =FixedPrim Int64 -> Int64 -> Builder forall a. FixedPrim a -> a -> Builder P.primFixed FixedPrim Int64 P.int64HexFixed -- | Encode a 'Word8' using 2 nibbles (hexadecimal digits).{-# INLINEword8HexFixed #-}word8HexFixed ::Word8->Builder word8HexFixed :: Word8 -> Builder word8HexFixed =FixedPrim Word8 -> Word8 -> Builder forall a. FixedPrim a -> a -> Builder P.primFixed FixedPrim Word8 P.word8HexFixed -- | Encode a 'Word16' using 4 nibbles.{-# INLINEword16HexFixed #-}word16HexFixed ::Word16->Builder word16HexFixed :: Word16 -> Builder word16HexFixed =FixedPrim Word16 -> Word16 -> Builder forall a. FixedPrim a -> a -> Builder P.primFixed FixedPrim Word16 P.word16HexFixed -- | Encode a 'Word32' using 8 nibbles.{-# INLINEword32HexFixed #-}word32HexFixed ::Word32->Builder word32HexFixed :: Word32 -> Builder word32HexFixed =FixedPrim Word32 -> Word32 -> Builder forall a. FixedPrim a -> a -> Builder P.primFixed FixedPrim Word32 P.word32HexFixed -- | Encode a 'Word64' using 16 nibbles.{-# INLINEword64HexFixed #-}word64HexFixed ::Word64->Builder word64HexFixed :: Word64 -> Builder word64HexFixed =FixedPrim Word64 -> Word64 -> Builder forall a. FixedPrim a -> a -> Builder P.primFixed FixedPrim Word64 P.word64HexFixed -- | Encode an IEEE 'Float' using 8 nibbles.{-# INLINEfloatHexFixed #-}floatHexFixed ::Float->Builder floatHexFixed :: Float -> Builder floatHexFixed =FixedPrim Float -> Float -> Builder forall a. FixedPrim a -> a -> Builder P.primFixed FixedPrim Float P.floatHexFixed -- | Encode an IEEE 'Double' using 16 nibbles.{-# INLINEdoubleHexFixed #-}doubleHexFixed ::Double->Builder doubleHexFixed :: Double -> Builder doubleHexFixed =FixedPrim Double -> Double -> Builder forall a. FixedPrim a -> a -> Builder P.primFixed FixedPrim Double P.doubleHexFixed -- | Encode each byte of a 'S.StrictByteString' using its fixed-width hex encoding.{-# NOINLINEbyteStringHex #-}-- share codebyteStringHex ::S.StrictByteString ->Builder byteStringHex :: StrictByteString -> Builder byteStringHex =FixedPrim Word8 -> StrictByteString -> Builder P.primMapByteStringFixed FixedPrim Word8 P.word8HexFixed -- | Encode each byte of a 'L.LazyByteString' using its fixed-width hex encoding.{-# NOINLINElazyByteStringHex #-}-- share codelazyByteStringHex ::L.LazyByteString ->Builder lazyByteStringHex :: LazyByteString -> Builder lazyByteStringHex =FixedPrim Word8 -> LazyByteString -> Builder P.primMapLazyByteStringFixed FixedPrim Word8 P.word8HexFixed -------------------------------------------------------------------------------- Fast decimal 'Integer' encoding.-------------------------------------------------------------------------------- An optimized version of the integer serialization code-- in blaze-textual (c) 2011 MailRank, Inc. Bryan O'Sullivan-- <bos@mailrank.com>. It is 2.5x faster on Int-sized integers and 4.5x faster-- on larger integers.-- | Maximal power of 10 fitting into an 'Int' without using the MSB.-- 10 ^ 9 for 32 bit ints (31 * log 2 / log 10 = 9.33)-- 10 ^ 18 for 64 bit ints (63 * log 2 / log 10 = 18.96)---- FIXME: Think about also using the MSB. For 64 bit 'Int's this makes a-- difference.maxPow10 ::IntegermaxPow10 :: Integer maxPow10 =Int -> Integer forall a. Integral a => a -> Integer toInteger(Int -> Integer) -> Int -> Integer forall a b. (a -> b) -> a -> b $(Int 10::Int)Int -> Int -> Int forall a b. (Num a, Integral b) => a -> b -> a ^Int -> Int -> Int forall a. a -> a -> a P.caseWordSize_32_64 (Int 9::Int)Int 18-- | Decimal encoding of an 'Integer' using the ASCII digits.integerDec ::Integer->Builder integerDec :: Integer -> Builder integerDec Integer i |Int i' <-Integer -> Int forall a. Num a => Integer -> a fromIntegerInteger i ,Int -> Integer forall a. Integral a => a -> Integer toIntegerInt i' Integer -> Integer -> Bool forall a. Eq a => a -> a -> Bool ==Integer i =Int -> Builder intDec Int i' |Integer i Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool <Integer 0=FixedPrim Char -> Char -> Builder forall a. FixedPrim a -> a -> Builder P.primFixed FixedPrim Char P.char8 Char '-'Builder -> Builder -> Builder forall a. Monoid a => a -> a -> a `mappend`Integer -> Builder go (-Integer i )|Bool otherwise=Integer -> Builder go Integer i wherego ::Integer->Builder go :: Integer -> Builder go Integer n |Integer n Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool <Integer maxPow10 =Int -> Builder intDec (Integer -> Int forall a. Num a => Integer -> a fromIntegerInteger n )|Bool otherwise=caseNonEmpty Integer -> NonEmpty Int putH (Integer -> Integer -> NonEmpty Integer splitf (Integer maxPow10 Integer -> Integer -> Integer forall a. Num a => a -> a -> a *Integer maxPow10 )Integer n )ofInt x :|[Int] xs ->Int -> Builder intDec Int x Builder -> Builder -> Builder forall a. Monoid a => a -> a -> a `mappend`BoundedPrim Int -> [Int] -> Builder forall a. BoundedPrim a -> [a] -> Builder P.primMapListBounded BoundedPrim Int intDecPadded [Int] xs splitf ::Integer->Integer->NonEmptyIntegersplitf :: Integer -> Integer -> NonEmpty Integer splitf Integer pow10 Integer n0 |Integer pow10 Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool >Integer n0 =Integer n0 Integer -> [Integer] -> NonEmpty Integer forall a. a -> [a] -> NonEmpty a :|[]|Bool otherwise=NonEmpty Integer -> NonEmpty Integer splith (Integer -> Integer -> NonEmpty Integer splitf (Integer pow10 Integer -> Integer -> Integer forall a. Num a => a -> a -> a *Integer pow10 )Integer n0 )wheresplith :: NonEmpty Integer -> NonEmpty Integer splith (Integer n :|[Integer] ns )=caseInteger n Integer -> Integer -> (Integer, Integer) forall a. Integral a => a -> a -> (a, a) `quotRem`Integer pow10 of(Integer q ,Integer r )|Integer q Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool >Integer 0->Integer q Integer -> [Integer] -> NonEmpty Integer forall a. a -> [a] -> NonEmpty a :|Integer r Integer -> [Integer] -> [Integer] forall a. a -> [a] -> [a] :[Integer] -> [Integer] splitb [Integer] ns |Bool otherwise->Integer r Integer -> [Integer] -> NonEmpty Integer forall a. a -> [a] -> NonEmpty a :|[Integer] -> [Integer] splitb [Integer] ns splitb :: [Integer] -> [Integer] splitb []=[]splitb (Integer n :[Integer] ns )=caseInteger n Integer -> Integer -> (Integer, Integer) forall a. Integral a => a -> a -> (a, a) `quotRem`Integer pow10 of(Integer q ,Integer r )->Integer q Integer -> [Integer] -> [Integer] forall a. a -> [a] -> [a] :Integer r Integer -> [Integer] -> [Integer] forall a. a -> [a] -> [a] :[Integer] -> [Integer] splitb [Integer] ns putH ::NonEmptyInteger->NonEmptyIntputH :: NonEmpty Integer -> NonEmpty Int putH (Integer n :|[Integer] ns )=caseInteger n Integer -> Integer -> (Integer, Integer) forall a. Integral a => a -> a -> (a, a) `quotRem`Integer maxPow10 of(Integer x ,Integer y )|Int q Int -> Int -> Bool forall a. Ord a => a -> a -> Bool >Int 0->Int q Int -> [Int] -> NonEmpty Int forall a. a -> [a] -> NonEmpty a :|Int r Int -> [Int] -> [Int] forall a. a -> [a] -> [a] :[Integer] -> [Int] putB [Integer] ns |Bool otherwise->Int r Int -> [Int] -> NonEmpty Int forall a. a -> [a] -> NonEmpty a :|[Integer] -> [Int] putB [Integer] ns whereq :: Int q =Integer -> Int forall a. Num a => Integer -> a fromIntegerInteger x r :: Int r =Integer -> Int forall a. Num a => Integer -> a fromIntegerInteger y putB ::[Integer]->[Int]putB :: [Integer] -> [Int] putB []=[]putB (Integer n :[Integer] ns )=caseInteger n Integer -> Integer -> (Integer, Integer) forall a. Integral a => a -> a -> (a, a) `quotRem`Integer maxPow10 of(Integer q ,Integer r )->Integer -> Int forall a. Num a => Integer -> a fromIntegerInteger q Int -> [Int] -> [Int] forall a. a -> [a] -> [a] :Integer -> Int forall a. Num a => Integer -> a fromIntegerInteger r Int -> [Int] -> [Int] forall a. a -> [a] -> [a] :[Integer] -> [Int] putB [Integer] ns {-# INLINEintDecPadded #-}intDecPadded ::P.BoundedPrim IntintDecPadded :: BoundedPrim Int intDecPadded =FixedPrim Int -> BoundedPrim Int forall a. FixedPrim a -> BoundedPrim a P.liftFixedToBounded (FixedPrim Int -> BoundedPrim Int) -> FixedPrim Int -> BoundedPrim Int forall a b. (a -> b) -> a -> b $FixedPrim Int -> FixedPrim Int -> FixedPrim Int forall a. a -> a -> a P.caseWordSize_32_64 (Int -> (Int -> Ptr Word8 -> IO ()) -> FixedPrim Int forall a. Int -> (a -> Ptr Word8 -> IO ()) -> FixedPrim a P.fixedPrim Int 9((Int -> Ptr Word8 -> IO ()) -> FixedPrim Int) -> (Int -> Ptr Word8 -> IO ()) -> FixedPrim Int forall a b. (a -> b) -> a -> b $CInt -> Ptr Word8 -> IO () c_int_dec_padded9 (CInt -> Ptr Word8 -> IO ()) -> (Int -> CInt) -> Int -> Ptr Word8 -> IO () forall b c a. (b -> c) -> (a -> b) -> a -> c .Int -> CInt forall a b. (Integral a, Num b) => a -> b fromIntegral)(Int -> (Int -> Ptr Word8 -> IO ()) -> FixedPrim Int forall a. Int -> (a -> Ptr Word8 -> IO ()) -> FixedPrim a P.fixedPrim Int 18((Int -> Ptr Word8 -> IO ()) -> FixedPrim Int) -> (Int -> Ptr Word8 -> IO ()) -> FixedPrim Int forall a b. (a -> b) -> a -> b $CLLong -> Ptr Word8 -> IO () c_long_long_int_dec_padded18 (CLLong -> Ptr Word8 -> IO ()) -> (Int -> CLLong) -> Int -> Ptr Word8 -> IO () forall b c a. (b -> c) -> (a -> b) -> a -> c .Int -> CLLong forall a b. (Integral a, Num b) => a -> b fromIntegral)