packages feed

bytebuild 0.3.11.0 → 0.3.12.0

raw patch · 8 files changed

+147/−26 lines, 8 filesdep ~basedep ~primitivedep ~primitive-checkedPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: base, primitive, primitive-checked, text

API changes (from Hackage documentation)

- Data.Bytes.Builder.Bounded.Class: type family BoundedBuilderLength a :: Nat;
+ Data.Bytes.Builder.Bounded.Class: type BoundedBuilderLength a :: Nat;

Files

CHANGELOG.md view
@@ -5,6 +5,10 @@ `small-bytearray-builder` is now just a compatibility shim to ease the migration process. +## 0.3.12.0 -- 2022-12-01++* Support GHC 9.4.+ ## 0.3.11.0 -- 2022-04-12  * Support GHC 9.2
bytebuild.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.2 name: bytebuild-version: 0.3.11.0+version: 0.3.12.0 synopsis: Build byte arrays description:   This is similar to the builder facilities provided by@@ -45,10 +45,11 @@     Data.Bytes.Builder.Bounded.Unsafe   other-modules:     Compat+    Op   reexported-modules:     Data.Bytes.Chunks   build-depends:-    , base >=4.12.0.0 && <4.17+    , base >=4.12.0.0 && <4.18     , byteslice >=0.2.6 && <0.3     , bytestring >=0.10.8.2 && <0.12     , haskell-src-meta >=0.8@@ -68,8 +69,10 @@       hs-source-dirs: src-9.0   if flag(checked)     build-depends: primitive-checked >= 0.7 && <0.8+    hs-source-dirs: src-checked   else     build-depends: primitive >= 0.7 && <0.8+    hs-source-dirs: src-unchecked   ghc-options: -Wall -O2   hs-source-dirs: src   default-language: Haskell2010@@ -99,7 +102,7 @@     , tasty >=1.2.3 && <1.5     , tasty-hunit >=0.10.0.2 && <0.11     , tasty-quickcheck >=0.10.1 && <0.11-    , text >=1.2 && <1.3+    , text >=1.2 && <2.2     , vector     , wide-word >=0.1.0.9 && <0.2 
+ src-checked/Op.hs view
@@ -0,0 +1,45 @@+{-# language MagicHash #-}+{-# language UnboxedTuples #-}++module Op+  ( writeCharArray#+  , copyByteArray#+  , copyMutableByteArray#+  ) where++import GHC.Exts ((<#),(>=#),State#,Int#,MutableByteArray#,ByteArray#,Char#)+import GHC.Int (Int(I#))+import qualified GHC.Exts as Exts++writeCharArray# :: MutableByteArray# s -> Int# -> Char# -> State# s -> State# s+writeCharArray# arr i v st = case i <# 0# of+  1# -> error ("writeCharArray#: negative index " ++ show (I# i))+  _ -> case Exts.getSizeofMutableByteArray# arr st of+    (# st', sz #) -> case i >=# sz of+      1# -> error ("writeCharArray#: index " ++ show (I# i) ++ " >= length " ++ show (I# sz))+      _ -> Exts.writeCharArray# arr i v st'++copyByteArray# :: ByteArray# -> Int# -> MutableByteArray# s -> Int# -> Int# -> State# s -> State# s+copyByteArray# src soff dst doff len s0 =+  case Exts.getSizeofMutableByteArray# dst s0 of+    (# s1, sz #)+      | I# soff >= 0+      , I# doff >= 0+      , I# len >= 0+      , I# doff + I# len <= I# sz+      , I# soff + I# len <= I# (Exts.sizeofByteArray# src)+        -> Exts.copyByteArray# src soff dst doff len s1+      | otherwise -> error "copyByteArray#: index range out of bounds"++copyMutableByteArray# :: MutableByteArray# s -> Int# -> MutableByteArray# s -> Int# -> Int# -> State# s -> State# s+copyMutableByteArray# src soff dst doff len s0 =+  case Exts.getSizeofMutableByteArray# dst s0 of+    (# s1, szDst #) -> case Exts.getSizeofMutableByteArray# src s1 of+      (# s2, szSrc #)+        | I# soff >= 0+        , I# doff >= 0+        , I# len >= 0+        , I# doff + I# len <= I# szDst+        , I# soff + I# len <= I# szSrc+          -> Exts.copyMutableByteArray# src soff dst doff len s2+        | otherwise -> error "copyMutableByteArray#: index range out of bounds"
+ src-unchecked/Op.hs view
@@ -0,0 +1,9 @@+{-# language MagicHash #-}++module Op+  ( writeCharArray#+  , copyByteArray#+  , copyMutableByteArray#+  ) where++import GHC.Exts (copyMutableByteArray#,writeCharArray#,copyByteArray#,copyMutableByteArray#)
src/Data/Bytes/Builder.hs view
@@ -182,6 +182,7 @@ import qualified Data.Primitive as PM import qualified Data.Text.Short as TS import qualified GHC.Exts as Exts+import qualified Op as Op  -- | Run a builder. run ::@@ -384,9 +385,9 @@       1# -> case Exts.newByteArray# 0# s0 of         (# s1, buf1 #) -> (# s1, buf1, 0#, 0#, Immutable src# soff# slen# (Mutable buf0 off0 cs0) #)       _ -> case Exts.newByteArray# 4080# s0 of-        (# s1, buf1 #) -> case Exts.copyByteArray# src# soff# buf1 0# slen# s1 of+        (# s1, buf1 #) -> case Op.copyByteArray# src# soff# buf1 0# slen# s1 of           s2 -> (# s2, buf1, slen#, 4080# -# slen#, Mutable buf0 off0 cs0 #)-    _ -> let !s1 = Exts.copyByteArray# src# soff# buf0 off0 slen# s0 in+    _ -> let s1 = Op.copyByteArray# src# soff# buf0 off0 slen# s0 in       (# s1, buf0, off0 +# slen#, len0 -# slen#, cs0 #)   ) @@ -397,9 +398,9 @@ copy (Bytes (ByteArray src# ) (I# soff# ) (I# slen# )) = Builder   (\buf0 off0 len0 cs0 s0 -> case len0 <# slen# of     1# -> case Exts.newByteArray# newSz s0 of-        (# s1, buf1 #) -> case Exts.copyByteArray# src# soff# buf1 0# slen# s1 of+        (# s1, buf1 #) -> case Op.copyByteArray# src# soff# buf1 0# slen# s1 of           s2 -> (# s2, buf1, slen#, newSz -# slen#, Mutable buf0 off0 cs0 #)-    _ -> let !s1 = Exts.copyByteArray# src# soff# buf0 off0 slen# s0 in+    _ -> let !s1 = Op.copyByteArray# src# soff# buf0 off0 slen# s0 in       (# s1, buf0, off0 +# slen#, len0 -# slen#, cs0 #)   )   where@@ -411,10 +412,10 @@ copyCons (W8# w0) (Bytes (ByteArray src# ) (I# soff# ) (I# slen# )) = Builder   (\buf0 off0 len0 cs0 s0 -> case len0 <# (slen# +# 1#) of     1# -> case Exts.newByteArray# newSz s0 of-        (# s1, buf1 #) -> case Exts.copyByteArray# src# soff# buf1 1# slen# s1 of+        (# s1, buf1 #) -> case Op.copyByteArray# src# soff# buf1 1# slen# s1 of           s2 -> case Exts.writeWord8Array# buf1 0# w0 s2 of             s3 -> (# s3, buf1, slen# +# 1#, newSz -# (slen# +# 1#), Mutable buf0 off0 cs0 #)-    _ -> let !s1 = Exts.copyByteArray# src# soff# buf0 (off0 +# 1#) slen# s0+    _ -> let !s1 = Op.copyByteArray# src# soff# buf0 (off0 +# 1#) slen# s0              !s2 = Exts.writeWord8Array# buf0 off0 w0 s1           in (# s2, buf0, off0 +# (slen# +# 1#), len0 -# (slen# +# 1#), cs0 #)   )@@ -507,11 +508,11 @@       (Bytes (ByteArray srcB# ) (I# soffB# ) (I# slenB# )) = Builder   (\buf0 off0 len0 cs0 s0 -> case len0 <# slen# of     1# -> case Exts.newByteArray# newSz s0 of-        (# s1, buf1 #) -> case Exts.copyByteArray# srcA# soffA# buf1 0# slenA# s1 of-          s2 -> case Exts.copyByteArray# srcB# soffB# buf1 slenA# slenB# s2 of+        (# s1, buf1 #) -> case Op.copyByteArray# srcA# soffA# buf1 0# slenA# s1 of+          s2 -> case Op.copyByteArray# srcB# soffB# buf1 slenA# slenB# s2 of             s3 -> (# s3, buf1, slen#, newSz -# slen#, Mutable buf0 off0 cs0 #)-    _ -> let !s1 = Exts.copyByteArray# srcA# soffA# buf0 off0 slenA# s0-             !s2 = Exts.copyByteArray# srcB# soffB# buf0 (off0 +# slenA# ) slenB# s1 in+    _ -> let !s1 = Op.copyByteArray# srcA# soffA# buf0 off0 slenA# s0+             !s2 = Op.copyByteArray# srcB# soffB# buf0 (off0 +# slenA# ) slenB# s1 in       (# s2, buf0, off0 +# slen#, len0 -# slen#, cs0 #)   )   where
src/Data/Bytes/Builder/Bounded.hs view
@@ -1,3 +1,4 @@+{-# language CPP #-} {-# language BangPatterns #-} {-# language BinaryLiterals #-} {-# language DataKinds #-}@@ -227,7 +228,12 @@ -- | Requires up to 19 bytes. Encodes an unsigned 64-bit integer as decimal. -- This encoding never starts with a zero unless the argument was zero. word64Dec :: Word64 -> Builder 19-word64Dec (W64# w) = wordCommonDec# w+word64Dec (W64# w) = wordCommonDec#+#if MIN_VERSION_base(4,17,0)+    (word64ToWord# w)+#else+    w+#endif  -- | Requires up to 10 bytes. Encodes an unsigned 32-bit integer as decimal. -- This encoding never starts with a zero unless the argument was zero.@@ -262,7 +268,12 @@ -- Negative numbers are preceded by a minus sign. Positive numbers -- are not preceded by anything. int64Dec :: Int64 -> Builder 20-int64Dec (I64# w) = intCommonDec# w+int64Dec (I64# w) = intCommonDec#+#if MIN_VERSION_base(4,17,0)+    (int64ToInt# w)+#else+    w+#endif  -- | Requires up to 11 bytes. Encodes a signed 32-bit integer as decimal. -- This encoding never starts with a zero unless the argument was zero.@@ -318,7 +329,12 @@     writeByteArray arr off0 (c2w '0')     pure (off0 + 1)   where-  w = W64# w#+  w = W64#+#if MIN_VERSION_base(4,17,0)+    (wordToWord64# w#)+#else+    w#+#endif  internalWordLoop :: MutableByteArray s -> Int -> Word -> ST s Int {-# inline internalWordLoop #-}@@ -350,7 +366,12 @@     writeByteArray arr off0 (c2w '-')     internalWordLoop arr (off0 + 1) (fromIntegral (negate w))   where-  w = I64# w#+  w = I64#+#if MIN_VERSION_base(4,17,0)+    (intToInt64# w#)+#else+    w#+#endif  -- Convert a number between 0 and 16 to the ASCII -- representation of its hexadecimal character.@@ -422,14 +443,25 @@ -- uppercase for the alphabetical digits. For example, this encodes the -- number 1022 as @00000000000003FE@. word64PaddedUpperHex :: Word64 -> Builder 16-word64PaddedUpperHex (W64# w) = word64PaddedUpperHex# w+word64PaddedUpperHex (W64# w) = word64PaddedUpperHex#+#if MIN_VERSION_base(4,17,0)+    (word64ToWord# w)+#else+    w+#endif + -- | Requires exactly 16 bytes. Encodes a 64-bit unsigned integer as -- hexadecimal, zero-padding the encoding to 16 digits. This uses -- lowercase for the alphabetical digits. For example, this encodes the -- number 1022 as @00000000000003fe@. word64PaddedLowerHex :: Word64 -> Builder 16-word64PaddedLowerHex (W64# w) = word64PaddedLowerHex# w+word64PaddedLowerHex (W64# w) = word64PaddedLowerHex#+#if MIN_VERSION_base(4,17,0)+    (word64ToWord# w)+#else+    w+#endif  -- | Requires exactly 12 bytes. Discards the upper 16 bits of a -- 64-bit unsigned integer and then encodes the lower 48 bits as@@ -437,7 +469,12 @@ -- lowercase for the alphabetical digits. For example, this encodes the -- number 1022 as @0000000003fe@. word48PaddedLowerHex :: Word64 -> Builder 12-word48PaddedLowerHex (W64# w) = word48PaddedLowerHex# w+word48PaddedLowerHex (W64# w) = word48PaddedLowerHex#+#if MIN_VERSION_base(4,17,0)+    (word64ToWord# w)+#else+    w+#endif  -- | Requires exactly 8 bytes. Encodes a 32-bit unsigned integer as -- hexadecimal, zero-padding the encoding to 8 digits. This uses@@ -735,7 +772,7 @@ wordPaddedDec4 :: Word -> Builder 4 wordPaddedDec4 !w = Unsafe.construct $ \arr off -> do   putRem10-    (putRem10 $ putRem10 $ putRem10 +    (putRem10 $ putRem10 $ putRem10      (\_ _ _ -> pure ())     ) arr (off + 3) w   pure (off + 4)@@ -862,7 +899,13 @@ -- | Encode a 64-bit word with LEB-128. word64LEB128 :: Word64 -> Builder 10 {-# inline word64LEB128 #-}-word64LEB128 (W64# w) = lebCommon (W# w)+word64LEB128 (W64# w) = lebCommon (W#+#if MIN_VERSION_base(4,17,0)+    (word64ToWord# w)+#else+    w+#endif+  )  lebCommon :: Word -> Builder n lebCommon !w = case quotRem w 128 of@@ -935,7 +978,12 @@     byteFourFour w = (0b00111111 .&. w) .|. 0b10000000  int64BE :: Int64 -> Builder 8-int64BE (I64# i) = word64BE (W64# (int2Word# i))+int64BE (I64# i) = word64BE (W64# (+#if MIN_VERSION_base(4,17,0)+  wordToWord64# (int2Word# (int64ToInt# i))))+#else+  int2Word# i))+#endif  int32BE :: Int32 -> Builder 4 int32BE (I32# i) = word32BE (W32# (C.wordToWord32# (int2Word# (C.int32ToInt# i))))@@ -944,7 +992,13 @@ int16BE (I16# i) = word16BE (W16# (C.wordToWord16# (int2Word# (C.int16ToInt# i))))  int64LE :: Int64 -> Builder 8-int64LE (I64# i) = word64LE (W64# (int2Word# i))+int64LE (I64# i) = word64LE (W64# (+#if MIN_VERSION_base(4,17,0)+  wordToWord64# (int2Word# (int64ToInt# i))))+#else+  int2Word# i))+#endif+  int32LE :: Int32 -> Builder 4 int32LE (I32# i) = word32LE (W32# (C.wordToWord32# (int2Word# (C.int32ToInt# i))))
src/Data/Bytes/Builder/Unsafe.hs view
@@ -53,6 +53,7 @@ import qualified Data.Bytes.Builder.Bounded.Unsafe as UnsafeBounded import qualified Data.Primitive as PM import qualified GHC.Exts as Exts+import qualified Op  -- | An unmaterialized sequence of bytes that may be pasted -- into a mutable byte array.@@ -203,11 +204,11 @@ copyReverseCommits# _ off Initial s0 = (# s0, off #) copyReverseCommits# marr prevOff (Mutable arr sz cs) s0 =   let !off = prevOff -# sz in-  case Exts.copyMutableByteArray# arr 0# marr off sz s0 of+  case Op.copyMutableByteArray# arr 0# marr off sz s0 of     s1 -> copyReverseCommits# marr off cs s1 copyReverseCommits# marr prevOff (Immutable arr soff sz cs) s0 =   let !off = prevOff -# sz in-  case Exts.copyByteArray# arr soff marr off sz s0 of+  case Op.copyByteArray# arr soff marr off sz s0 of     s1 -> copyReverseCommits# marr off cs s1  -- | Create a builder from a cons-list of 'Char'. These
test/Main.hs view
@@ -260,6 +260,10 @@           Chunks.concat (run 16 (word64LEB128 16))           @=?           Latin1.fromString "\x10"+      , THU.testCase "1000000" $+          Chunks.concat (run 16 (word64LEB128 1000000))+          @=?+          Exts.fromList [0xc0,0x84,0x3d]       , THU.testCase "deadbeef-smile" $ do         let inp = Latin1.fromString "\xDE\xAD\xBE\xEF"         (Chunks.concat . run 16) (sevenEightSmile inp)