-- |-- Module : Data.Array.Byte-- Copyright : (c) Roman Leshchinskiy 2009-2012-- License : BSD-style---- Maintainer : libraries@haskell.org-- Portability : non-portable---- Derived from @primitive@ package.{-# LANGUAGE BangPatterns #-}{-# LANGUAGE MagicHash #-}{-# LANGUAGE TypeFamilies #-}{-# LANGUAGE Trustworthy #-}{-# LANGUAGE UnboxedTuples #-}moduleData.Array.Byte(ByteArray (..),MutableByteArray (..),)whereimportData.Bits ((.&.) ,unsafeShiftR )importData.Data (mkNoRepType ,Data (..),Typeable )importqualifiedData.Foldable asFimportData.Semigroup importGHC.Show (intToDigit )importGHC.Exts importGHC.ST (ST (..),runST )importGHC.Word (Word8 (..))-- | Boxed wrapper for 'ByteArray#'.---- Since 'ByteArray#' is an unlifted type and not a member of kind 'Data.Kind.Type',-- things like @[ByteArray#]@ or @IO ByteArray#@ are ill-typed. To work around this-- inconvenience this module provides a standard boxed wrapper, inhabiting 'Data.Kind.Type'.-- Clients are expected to use 'ByteArray' in higher-level APIs,-- but wrap and unwrap 'ByteArray' internally as they please-- and use functions from "GHC.Exts".---- @since 4.17.0.0dataByteArray =ByteArray ByteArray# -- | Boxed wrapper for 'MutableByteArray#'.---- Since 'MutableByteArray#' is an unlifted type and not a member of kind 'Data.Kind.Type',-- things like @[MutableByteArray#]@ or @IO MutableByteArray#@ are ill-typed. To work around this-- inconvenience this module provides a standard boxed wrapper, inhabiting 'Data.Kind.Type'.-- Clients are expected to use 'MutableByteArray' in higher-level APIs,-- but wrap and unwrap 'MutableByteArray' internally as they please-- and use functions from "GHC.Exts".---- @since 4.17.0.0dataMutableByteArray s =MutableByteArray (MutableByteArray# s )-- | Create a new mutable byte array of the specified size in bytes.---- /Note:/ this function does not check if the input is non-negative.newByteArray ::Int ->ST s (MutableByteArray s ){-# INLINEnewByteArray #-}newByteArray :: forall s. Int -> ST s (MutableByteArray s) newByteArray (I# Int# n# )=STRep s (MutableByteArray s) -> ST s (MutableByteArray s) forall s a. STRep s a -> ST s a ST (\State# s s# ->caseInt# -> State# s -> (# State# s, MutableByteArray# s #) forall d. Int# -> State# d -> (# State# d, MutableByteArray# d #) newByteArray# Int# n# State# s s# of(#State# s s'# ,MutableByteArray# s arr# #)->(#State# s s'# ,MutableByteArray# s -> MutableByteArray s forall s. MutableByteArray# s -> MutableByteArray s MutableByteArray MutableByteArray# s arr# #))-- | Convert a mutable byte array to an immutable one without copying. The-- array should not be modified after the conversion.unsafeFreezeByteArray ::MutableByteArray s ->ST s ByteArray {-# INLINEunsafeFreezeByteArray #-}unsafeFreezeByteArray :: forall s. MutableByteArray s -> ST s ByteArray unsafeFreezeByteArray (MutableByteArray MutableByteArray# s arr# )=STRep s ByteArray -> ST s ByteArray forall s a. STRep s a -> ST s a ST (\State# s s# ->caseMutableByteArray# s -> State# s -> (# State# s, ByteArray# #) forall d. MutableByteArray# d -> State# d -> (# State# d, ByteArray# #) unsafeFreezeByteArray# MutableByteArray# s arr# State# s s# of(#State# s s'# ,ByteArray# arr'# #)->(#State# s s'# ,ByteArray# -> ByteArray ByteArray ByteArray# arr'# #))-- | Size of the byte array in bytes.sizeofByteArray ::ByteArray ->Int {-# INLINEsizeofByteArray #-}sizeofByteArray :: ByteArray -> Int sizeofByteArray (ByteArray ByteArray# arr# )=Int# -> Int I# (ByteArray# -> Int# sizeofByteArray# ByteArray# arr# )-- | Read byte at specific index.indexByteArray ::ByteArray ->Int ->Word8 {-# INLINEindexByteArray #-}indexByteArray :: ByteArray -> Int -> Word8 indexByteArray (ByteArray ByteArray# arr# )(I# Int# i# )=Word8# -> Word8 W8# (ByteArray# -> Int# -> Word8# indexWord8Array# ByteArray# arr# Int# i# )-- | Write byte at specific index.writeByteArray ::MutableByteArray s ->Int ->Word8 ->ST s (){-# INLINEwriteByteArray #-}writeByteArray :: forall s. MutableByteArray s -> Int -> Word8 -> ST s () writeByteArray (MutableByteArray MutableByteArray# s arr# )(I# Int# i# )(W8# Word8# x# )=STRep s () -> ST s () forall s a. STRep s a -> ST s a ST (\State# s s# ->caseMutableByteArray# s -> Int# -> Word8# -> State# s -> State# s forall d. MutableByteArray# d -> Int# -> Word8# -> State# d -> State# d writeWord8Array# MutableByteArray# s arr# Int# i# Word8# x# State# s s# ofState# s s'# ->(#State# s s'# ,()#))-- | Explode 'ByteArray' into a list of bytes.byteArrayToList ::ByteArray ->[Word8 ]{-# INLINEbyteArrayToList #-}byteArrayToList :: ByteArray -> [Word8] byteArrayToList ByteArray arr =Int -> [Word8] go Int 0wherego :: Int -> [Word8] go Int i |Int i Int -> Int -> Bool forall a. Ord a => a -> a -> Bool < Int maxI =ByteArray -> Int -> Word8 indexByteArray ByteArray arr Int i Word8 -> [Word8] -> [Word8] forall a. a -> [a] -> [a] : Int -> [Word8] go (Int i Int -> Int -> Int forall a. Num a => a -> a -> a + Int 1)|Bool otherwise =[]maxI :: Int maxI =ByteArray -> Int sizeofByteArray ByteArray arr -- | Create a 'ByteArray' from a list of a known length. If the length-- of the list does not match the given length, this throws an exception.byteArrayFromListN ::Int ->[Word8 ]->ByteArray byteArrayFromListN :: Int -> [Word8] -> ByteArray byteArrayFromListN Int n [Word8] ys =(forall s. ST s ByteArray) -> ByteArray forall a. (forall s. ST s a) -> a runST ((forall s. ST s ByteArray) -> ByteArray) -> (forall s. ST s ByteArray) -> ByteArray forall a b. (a -> b) -> a -> b $ doMutableByteArray s marr <-Int -> ST s (MutableByteArray s) forall s. Int -> ST s (MutableByteArray s) newByteArray Int n letgo :: Int -> [Word8] -> ST s () go !Int ix []=ifInt ix Int -> Int -> Bool forall a. Eq a => a -> a -> Bool == Int n then() -> ST s () forall a. a -> ST s a forall (m :: * -> *) a. Monad m => a -> m a return ()else[Char] -> ST s () forall a. HasCallStack => [Char] -> a error ([Char] -> ST s ()) -> [Char] -> ST s () forall a b. (a -> b) -> a -> b $ [Char] "Data.Array.Byte.byteArrayFromListN: list length less than specified size"go !Int ix (Word8 x : [Word8] xs )=ifInt ix Int -> Int -> Bool forall a. Ord a => a -> a -> Bool < Int n thendoMutableByteArray s -> Int -> Word8 -> ST s () forall s. MutableByteArray s -> Int -> Word8 -> ST s () writeByteArray MutableByteArray s marr Int ix Word8 x Int -> [Word8] -> ST s () go (Int ix Int -> Int -> Int forall a. Num a => a -> a -> a + Int 1)[Word8] xs else[Char] -> ST s () forall a. HasCallStack => [Char] -> a error ([Char] -> ST s ()) -> [Char] -> ST s () forall a b. (a -> b) -> a -> b $ [Char] "Data.Array.Byte.byteArrayFromListN: list length greater than specified size"Int -> [Word8] -> ST s () go Int 0[Word8] ys MutableByteArray s -> ST s ByteArray forall s. MutableByteArray s -> ST s ByteArray unsafeFreezeByteArray MutableByteArray s marr -- | Copy a slice of an immutable byte array to a mutable byte array.---- /Note:/ this function does not do bounds or overlap checking.copyByteArray ::MutableByteArray s -- ^ destination array->Int -- ^ offset into destination array->ByteArray -- ^ source array->Int -- ^ offset into source array->Int -- ^ number of bytes to copy->ST s (){-# INLINEcopyByteArray #-}copyByteArray :: forall s. MutableByteArray s -> Int -> ByteArray -> Int -> Int -> ST s () copyByteArray (MutableByteArray MutableByteArray# s dst# )(I# Int# doff# )(ByteArray ByteArray# src# )(I# Int# soff# )(I# Int# sz# )=STRep s () -> ST s () forall s a. STRep s a -> ST s a ST (\State# s s# ->caseByteArray# -> Int# -> MutableByteArray# s -> Int# -> Int# -> State# s -> State# s forall d. ByteArray# -> Int# -> MutableByteArray# d -> Int# -> Int# -> State# d -> State# d copyByteArray# ByteArray# src# Int# soff# MutableByteArray# s dst# Int# doff# Int# sz# State# s s# ofState# s s'# ->(#State# s s'# ,()#))-- | @since 4.17.0.0instanceData ByteArray wheretoConstr :: ByteArray -> Constr toConstr ByteArray _=[Char] -> Constr forall a. HasCallStack => [Char] -> a error [Char] "toConstr"gunfold :: forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c ByteArray gunfold forall b r. Data b => c (b -> r) -> c r _forall r. r -> c r _=[Char] -> Constr -> c ByteArray forall a. HasCallStack => [Char] -> a error [Char] "gunfold"dataTypeOf :: ByteArray -> DataType dataTypeOf ByteArray _=[Char] -> DataType mkNoRepType [Char] "Data.Array.Byte.ByteArray"-- | @since 4.17.0.0instanceTypeable s =>Data (MutableByteArray s )wheretoConstr :: MutableByteArray s -> Constr toConstr MutableByteArray s _=[Char] -> Constr forall a. HasCallStack => [Char] -> a error [Char] "toConstr"gunfold :: forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (MutableByteArray s) gunfold forall b r. Data b => c (b -> r) -> c r _forall r. r -> c r _=[Char] -> Constr -> c (MutableByteArray s) forall a. HasCallStack => [Char] -> a error [Char] "gunfold"dataTypeOf :: MutableByteArray s -> DataType dataTypeOf MutableByteArray s _=[Char] -> DataType mkNoRepType [Char] "Data.Array.Byte.MutableByteArray"-- | @since 4.17.0.0instanceShow ByteArray whereshowsPrec :: Int -> ByteArray -> ShowS showsPrec Int _ByteArray ba =[Char] -> ShowS showString [Char] "["ShowS -> ShowS -> ShowS forall b c a. (b -> c) -> (a -> b) -> a -> c . Int -> ShowS go Int 0whereshowW8 ::Word8 ->String ->String showW8 :: Word8 -> ShowS showW8 !Word8 w [Char] s =Char '0'Char -> ShowS forall a. a -> [a] -> [a] : Char 'x'Char -> ShowS forall a. a -> [a] -> [a] : Int -> Char intToDigit (Word8 -> Int forall a b. (Integral a, Num b) => a -> b fromIntegral (Word8 -> Int -> Word8 forall a. Bits a => a -> Int -> a unsafeShiftR Word8 w Int 4))Char -> ShowS forall a. a -> [a] -> [a] : Int -> Char intToDigit (Word8 -> Int forall a b. (Integral a, Num b) => a -> b fromIntegral (Word8 w Word8 -> Word8 -> Word8 forall a. Bits a => a -> a -> a .&. Word8 0x0F))Char -> ShowS forall a. a -> [a] -> [a] : [Char] s go :: Int -> ShowS go Int i |Int i Int -> Int -> Bool forall a. Ord a => a -> a -> Bool < ByteArray -> Int sizeofByteArray ByteArray ba =ShowS comma ShowS -> ShowS -> ShowS forall b c a. (b -> c) -> (a -> b) -> a -> c . Word8 -> ShowS showW8 (ByteArray -> Int -> Word8 indexByteArray ByteArray ba Int i ::Word8 )ShowS -> ShowS -> ShowS forall b c a. (b -> c) -> (a -> b) -> a -> c . Int -> ShowS go (Int i Int -> Int -> Int forall a. Num a => a -> a -> a + Int 1)|Bool otherwise =Char -> ShowS showChar Char ']'wherecomma :: ShowS comma |Int i Int -> Int -> Bool forall a. Eq a => a -> a -> Bool == Int 0=ShowS forall a. a -> a id |Bool otherwise =[Char] -> ShowS showString [Char] ", "-- | Compare prefixes of given length.compareByteArraysFromBeginning ::ByteArray ->ByteArray ->Int ->Ordering {-# INLINEcompareByteArraysFromBeginning #-}compareByteArraysFromBeginning :: ByteArray -> ByteArray -> Int -> Ordering compareByteArraysFromBeginning (ByteArray ByteArray# ba1# )(ByteArray ByteArray# ba2# )(I# Int# n# )=Int -> Int -> Ordering forall a. Ord a => a -> a -> Ordering compare (Int# -> Int I# (ByteArray# -> Int# -> ByteArray# -> Int# -> Int# -> Int# compareByteArrays# ByteArray# ba1# Int# 0#ByteArray# ba2# Int# 0#Int# n# ))Int 0-- | Do two byte arrays share the same pointer?sameByteArray ::ByteArray# ->ByteArray# ->Bool sameByteArray :: ByteArray# -> ByteArray# -> Bool sameByteArray ByteArray# ba1 ByteArray# ba2 =case() -> () -> Int# forall a b. a -> b -> Int# reallyUnsafePtrEquality# (ByteArray# -> () forall a b. a -> b unsafeCoerce# ByteArray# ba1 ::())(ByteArray# -> () forall a b. a -> b unsafeCoerce# ByteArray# ba2 ::())ofInt# r ->Int# -> Bool isTrue# Int# r -- | @since 4.17.0.0instanceEq ByteArray whereba1 :: ByteArray ba1 @(ByteArray ByteArray# ba1# )== :: ByteArray -> ByteArray -> Bool == ba2 :: ByteArray ba2 @(ByteArray ByteArray# ba2# )|ByteArray# -> ByteArray# -> Bool sameByteArray ByteArray# ba1# ByteArray# ba2# =Bool True |Int n1 Int -> Int -> Bool forall a. Eq a => a -> a -> Bool /= Int n2 =Bool False |Bool otherwise =ByteArray -> ByteArray -> Int -> Ordering compareByteArraysFromBeginning ByteArray ba1 ByteArray ba2 Int n1 Ordering -> Ordering -> Bool forall a. Eq a => a -> a -> Bool == Ordering EQ wheren1 :: Int n1 =ByteArray -> Int sizeofByteArray ByteArray ba1 n2 :: Int n2 =ByteArray -> Int sizeofByteArray ByteArray ba2 -- | @since 4.17.0.0instanceEq (MutableByteArray s )where== :: MutableByteArray s -> MutableByteArray s -> Bool (==) (MutableByteArray MutableByteArray# s arr# )(MutableByteArray MutableByteArray# s brr# )=Int# -> Bool isTrue# (MutableByteArray# s -> MutableByteArray# s -> Int# forall s. MutableByteArray# s -> MutableByteArray# s -> Int# sameMutableByteArray# MutableByteArray# s arr# MutableByteArray# s brr# )-- | Non-lexicographic ordering. This compares the lengths of-- the byte arrays first and uses a lexicographic ordering if-- the lengths are equal. Subject to change between major versions.-- @since 4.17.0.0instanceOrd ByteArray whereba1 :: ByteArray ba1 @(ByteArray ByteArray# ba1# )compare :: ByteArray -> ByteArray -> Ordering `compare` ba2 :: ByteArray ba2 @(ByteArray ByteArray# ba2# )|ByteArray# -> ByteArray# -> Bool sameByteArray ByteArray# ba1# ByteArray# ba2# =Ordering EQ |Int n1 Int -> Int -> Bool forall a. Eq a => a -> a -> Bool /= Int n2 =Int n1 Int -> Int -> Ordering forall a. Ord a => a -> a -> Ordering `compare` Int n2 |Bool otherwise =ByteArray -> ByteArray -> Int -> Ordering compareByteArraysFromBeginning ByteArray ba1 ByteArray ba2 Int n1 wheren1 :: Int n1 =ByteArray -> Int sizeofByteArray ByteArray ba1 n2 :: Int n2 =ByteArray -> Int sizeofByteArray ByteArray ba2 -- The primop compareByteArrays# (invoked from 'compareByteArraysFromBeginning')-- performs a check for pointer equality as well. However, it-- is included here because it is likely better to check for pointer equality-- before checking for length equality. Getting the length requires deferencing-- the pointers, which could cause accesses to memory that is not in the cache.-- By contrast, a pointer equality check is always extremely cheap.-- | Append two byte arrays.appendByteArray ::ByteArray ->ByteArray ->ByteArray appendByteArray :: ByteArray -> ByteArray -> ByteArray appendByteArray ByteArray a ByteArray b =(forall s. ST s ByteArray) -> ByteArray forall a. (forall s. ST s a) -> a runST ((forall s. ST s ByteArray) -> ByteArray) -> (forall s. ST s ByteArray) -> ByteArray forall a b. (a -> b) -> a -> b $ doMutableByteArray s marr <-Int -> ST s (MutableByteArray s) forall s. Int -> ST s (MutableByteArray s) newByteArray (ByteArray -> Int sizeofByteArray ByteArray a Int -> Int -> Int forall a. Num a => a -> a -> a + ByteArray -> Int sizeofByteArray ByteArray b )MutableByteArray s -> Int -> ByteArray -> Int -> Int -> ST s () forall s. MutableByteArray s -> Int -> ByteArray -> Int -> Int -> ST s () copyByteArray MutableByteArray s marr Int 0ByteArray a Int 0(ByteArray -> Int sizeofByteArray ByteArray a )MutableByteArray s -> Int -> ByteArray -> Int -> Int -> ST s () forall s. MutableByteArray s -> Int -> ByteArray -> Int -> Int -> ST s () copyByteArray MutableByteArray s marr (ByteArray -> Int sizeofByteArray ByteArray a )ByteArray b Int 0(ByteArray -> Int sizeofByteArray ByteArray b )MutableByteArray s -> ST s ByteArray forall s. MutableByteArray s -> ST s ByteArray unsafeFreezeByteArray MutableByteArray s marr -- | Concatenate a list of 'ByteArray's.concatByteArray ::[ByteArray ]->ByteArray concatByteArray :: [ByteArray] -> ByteArray concatByteArray [ByteArray] arrs =(forall s. ST s ByteArray) -> ByteArray forall a. (forall s. ST s a) -> a runST ((forall s. ST s ByteArray) -> ByteArray) -> (forall s. ST s ByteArray) -> ByteArray forall a b. (a -> b) -> a -> b $ doletlen :: Int len =[ByteArray] -> Int -> Int calcLength [ByteArray] arrs Int 0MutableByteArray s marr <-Int -> ST s (MutableByteArray s) forall s. Int -> ST s (MutableByteArray s) newByteArray Int len MutableByteArray s -> Int -> [ByteArray] -> ST s () forall s. MutableByteArray s -> Int -> [ByteArray] -> ST s () pasteByteArrays MutableByteArray s marr Int 0[ByteArray] arrs MutableByteArray s -> ST s ByteArray forall s. MutableByteArray s -> ST s ByteArray unsafeFreezeByteArray MutableByteArray s marr -- | Dump immutable 'ByteArray's into a mutable one, starting from a given offset.pasteByteArrays ::MutableByteArray s ->Int ->[ByteArray ]->ST s ()pasteByteArrays :: forall s. MutableByteArray s -> Int -> [ByteArray] -> ST s () pasteByteArrays !MutableByteArray s _!Int _[]=() -> ST s () forall a. a -> ST s a forall (m :: * -> *) a. Monad m => a -> m a return ()pasteByteArrays !MutableByteArray s marr !Int ix (ByteArray x : [ByteArray] xs )=doMutableByteArray s -> Int -> ByteArray -> Int -> Int -> ST s () forall s. MutableByteArray s -> Int -> ByteArray -> Int -> Int -> ST s () copyByteArray MutableByteArray s marr Int ix ByteArray x Int 0(ByteArray -> Int sizeofByteArray ByteArray x )MutableByteArray s -> Int -> [ByteArray] -> ST s () forall s. MutableByteArray s -> Int -> [ByteArray] -> ST s () pasteByteArrays MutableByteArray s marr (Int ix Int -> Int -> Int forall a. Num a => a -> a -> a + ByteArray -> Int sizeofByteArray ByteArray x )[ByteArray] xs -- | Compute total length of 'ByteArray's, increased by accumulator.calcLength ::[ByteArray ]->Int ->Int calcLength :: [ByteArray] -> Int -> Int calcLength []!Int n =Int n calcLength (ByteArray x : [ByteArray] xs )!Int n =[ByteArray] -> Int -> Int calcLength [ByteArray] xs (ByteArray -> Int sizeofByteArray ByteArray x Int -> Int -> Int forall a. Num a => a -> a -> a + Int n )-- | An array of zero length.emptyByteArray ::ByteArray emptyByteArray :: ByteArray emptyByteArray =(forall s. ST s ByteArray) -> ByteArray forall a. (forall s. ST s a) -> a runST (Int -> ST s (MutableByteArray s) forall s. Int -> ST s (MutableByteArray s) newByteArray Int 0ST s (MutableByteArray s) -> (MutableByteArray s -> ST s ByteArray) -> ST s ByteArray forall a b. ST s a -> (a -> ST s b) -> ST s b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= MutableByteArray s -> ST s ByteArray forall s. MutableByteArray s -> ST s ByteArray unsafeFreezeByteArray )-- | Replicate 'ByteArray' given number of times and concatenate all together.replicateByteArray ::Int ->ByteArray ->ByteArray replicateByteArray :: Int -> ByteArray -> ByteArray replicateByteArray Int n ByteArray arr =(forall s. ST s ByteArray) -> ByteArray forall a. (forall s. ST s a) -> a runST ((forall s. ST s ByteArray) -> ByteArray) -> (forall s. ST s ByteArray) -> ByteArray forall a b. (a -> b) -> a -> b $ doMutableByteArray s marr <-Int -> ST s (MutableByteArray s) forall s. Int -> ST s (MutableByteArray s) newByteArray (Int n Int -> Int -> Int forall a. Num a => a -> a -> a * ByteArray -> Int sizeofByteArray ByteArray arr )letgo :: Int -> ST s () go Int i =ifInt i Int -> Int -> Bool forall a. Ord a => a -> a -> Bool < Int n thendoMutableByteArray s -> Int -> ByteArray -> Int -> Int -> ST s () forall s. MutableByteArray s -> Int -> ByteArray -> Int -> Int -> ST s () copyByteArray MutableByteArray s marr (Int i Int -> Int -> Int forall a. Num a => a -> a -> a * ByteArray -> Int sizeofByteArray ByteArray arr )ByteArray arr Int 0(ByteArray -> Int sizeofByteArray ByteArray arr )Int -> ST s () go (Int i Int -> Int -> Int forall a. Num a => a -> a -> a + Int 1)else() -> ST s () forall a. a -> ST s a forall (m :: * -> *) a. Monad m => a -> m a return ()Int -> ST s () go Int 0MutableByteArray s -> ST s ByteArray forall s. MutableByteArray s -> ST s ByteArray unsafeFreezeByteArray MutableByteArray s marr -- | @since 4.17.0.0instanceSemigroup ByteArray where<> :: ByteArray -> ByteArray -> ByteArray (<>) =ByteArray -> ByteArray -> ByteArray appendByteArray sconcat :: NonEmpty ByteArray -> ByteArray sconcat =[ByteArray] -> ByteArray forall a. Monoid a => [a] -> a mconcat ([ByteArray] -> ByteArray) -> (NonEmpty ByteArray -> [ByteArray]) -> NonEmpty ByteArray -> ByteArray forall b c a. (b -> c) -> (a -> b) -> a -> c . NonEmpty ByteArray -> [ByteArray] forall a. NonEmpty a -> [a] forall (t :: * -> *) a. Foldable t => t a -> [a] F.toList stimes :: forall b. Integral b => b -> ByteArray -> ByteArray stimes b i ByteArray arr |Integer itgr Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool < Integer 1=ByteArray emptyByteArray |Integer itgr Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool <= (Int -> Integer forall a b. (Integral a, Num b) => a -> b fromIntegral (Int forall a. Bounded a => a maxBound ::Int ))=Int -> ByteArray -> ByteArray replicateByteArray (Integer -> Int forall a b. (Integral a, Num b) => a -> b fromIntegral Integer itgr )ByteArray arr |Bool otherwise =[Char] -> ByteArray forall a. HasCallStack => [Char] -> a error [Char] "Data.Array.Byte#stimes: cannot allocate the requested amount of memory"whereitgr :: Integer itgr =b -> Integer forall a. Integral a => a -> Integer toInteger b i ::Integer -- | @since 4.17.0.0instanceMonoid ByteArray wheremempty :: ByteArray mempty =ByteArray emptyByteArray mconcat :: [ByteArray] -> ByteArray mconcat =[ByteArray] -> ByteArray concatByteArray -- | @since 4.17.0.0instanceIsList ByteArray wheretypeItem ByteArray =Word8 toList :: ByteArray -> [Item ByteArray] toList =ByteArray -> [Word8] ByteArray -> [Item ByteArray] byteArrayToList fromList :: [Item ByteArray] -> ByteArray fromList [Item ByteArray] xs =Int -> [Word8] -> ByteArray byteArrayFromListN ([Word8] -> Int forall a. [a] -> Int forall (t :: * -> *) a. Foldable t => t a -> Int length [Word8] [Item ByteArray] xs )[Word8] [Item ByteArray] xs fromListN :: Int -> [Item ByteArray] -> ByteArray fromListN =Int -> [Word8] -> ByteArray Int -> [Item ByteArray] -> ByteArray byteArrayFromListN