{-# LANGUAGE CPP #-}
module Data.Text.Builder.Linear.Array (
unsafeThaw,
sizeofByteArray,
isPinned,
unsafeTile,
unsafeReplicate,
) where
import Data.Text.Array qualified as A
import GHC.Exts (Int (..), isByteArrayPinned#, isTrue#, setByteArray#, sizeofByteArray#)
import GHC.ST (ST (..))
#if __GLASGOW_HASKELL__ >= 909
import GHC.Exts (unsafeThawByteArray#)
#else
import GHC.Exts (unsafeCoerce#)
#endif
unsafeThaw ∷ A.Array → ST s (A.MArray s)
#if __GLASGOW_HASKELL__ >= 909
unsafeThaw (A.ByteArray a) = ST $ \s# → case unsafeThawByteArray# a s# of
(# s'#, ma #) -> (# s'#, A.MutableByteArray ma #)
#else
unsafeThaw :: forall s. Array -> ST s (MArray s)
unsafeThaw (A.ByteArray ByteArray#
a) = forall s a. STRep s a -> ST s a
ST forall a b. (a -> b) -> a -> b
$ \State# s
s# →
(# State# s
s#, forall s. MutableByteArray# s -> MutableByteArray s
A.MutableByteArray (unsafeCoerce# :: forall a b. a -> b
unsafeCoerce# ByteArray#
a) #)
#endif
sizeofByteArray ∷ A.Array → Int
sizeofByteArray :: Array -> Int
sizeofByteArray (A.ByteArray ByteArray#
a) = Int# -> Int
I# (ByteArray# -> Int#
sizeofByteArray# ByteArray#
a)
isPinned ∷ A.Array → Bool
isPinned :: Array -> Bool
isPinned (A.ByteArray ByteArray#
a) = Int# -> Bool
isTrue# (ByteArray# -> Int#
isByteArrayPinned# ByteArray#
a)
unsafeReplicate
∷ A.MArray s
→ Int
→ Int
→ Int
→ ST s ()
unsafeReplicate :: forall s. MArray s -> Int -> Int -> Int -> ST s ()
unsafeReplicate (A.MutableByteArray MutableByteArray# s
dst#) (I# Int#
dstOff#) (I# Int#
count#) (I# Int#
w#) =
forall s a. STRep s a -> ST s a
ST (\State# s
s# → (# forall d.
MutableByteArray# d -> Int# -> Int# -> Int# -> State# d -> State# d
setByteArray# MutableByteArray# s
dst# Int#
dstOff# Int#
count# Int#
w# State# s
s#, () #))
{-# INLINE unsafeReplicate #-}
unsafeTile
∷ A.MArray s
→ Int
→ Int
→ Int
→ ST s ()
unsafeTile :: forall s. MArray s -> Int -> Int -> Int -> ST s ()
unsafeTile MArray s
dest Int
destOff Int
totalLen = Int -> ST s ()
go
where
go :: Int -> ST s ()
go Int
l
| Int
2 forall a. Num a => a -> a -> a
* Int
l forall a. Ord a => a -> a -> Bool
> Int
totalLen = forall s. MArray s -> Int -> MArray s -> Int -> Int -> ST s ()
A.copyM MArray s
dest (Int
destOff forall a. Num a => a -> a -> a
+ Int
l) MArray s
dest Int
destOff (Int
totalLen forall a. Num a => a -> a -> a
- Int
l)
| Bool
otherwise = forall s. MArray s -> Int -> MArray s -> Int -> Int -> ST s ()
A.copyM MArray s
dest (Int
destOff forall a. Num a => a -> a -> a
+ Int
l) MArray s
dest Int
destOff Int
l forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Int -> ST s ()
go (Int
2 forall a. Num a => a -> a -> a
* Int
l)
{-# INLINE unsafeTile #-}