module Mikan.Utils.ShortText
(
unsafeCreate
, lengthBytes
, unwords
, toByteArray
, unsafeFromByteArray
, copyBytes
) where
import Prelude hiding (unwords)
import Control.Monad.ST
import Control.Monad.Primitive
import Data.ByteString.Short qualified as SBS
import Data.Primitive.ByteArray
import Data.Text.Short (ShortText)
import Data.Text.Short qualified as TS
import Data.Text.Short.Unsafe qualified as TS
import Mikan.Utils.MinimalArray.Lifted qualified as AL
import Mikan.Utils.Text qualified as T
{-# INLINE unsafeCreate #-}
unsafeCreate :: Int -> (forall s. MutableByteArray s -> ST s ()) -> ShortText
unsafeCreate :: Int -> (forall s. MutableByteArray s -> ST s ()) -> ShortText
unsafeCreate Int
n forall s. MutableByteArray s -> ST s ()
go = (forall s. ST s ShortText) -> ShortText
forall a. (forall s. ST s a) -> a
runST do
arr <- Int -> ST s (MutableByteArray (PrimState (ST s)))
forall (m :: * -> *).
PrimMonad m =>
Int -> m (MutableByteArray (PrimState m))
newByteArray Int
n
go arr
TS.fromShortByteStringUnsafe . SBS.ShortByteString <$> unsafeFreezeByteArray arr
{-# INLINE lengthBytes #-}
lengthBytes :: ShortText -> Int
lengthBytes :: ShortText -> Int
lengthBytes = ShortByteString -> Int
SBS.length (ShortByteString -> Int)
-> (ShortText -> ShortByteString) -> ShortText -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShortText -> ShortByteString
TS.toShortByteString
{-# INLINE unwords #-}
unwords :: [ShortText] -> ShortText
unwords :: [ShortText] -> ShortText
unwords = ShortText -> [ShortText] -> ShortText
TS.intercalate ShortText
" "
{-# INLINE toByteArray #-}
toByteArray :: ShortText -> ByteArray
toByteArray :: ShortText -> ByteArray
toByteArray = ShortByteString -> ByteArray
SBS.unShortByteString (ShortByteString -> ByteArray)
-> (ShortText -> ShortByteString) -> ShortText -> ByteArray
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShortText -> ShortByteString
TS.toShortByteString
{-# INLINE unsafeFromByteArray #-}
unsafeFromByteArray :: ByteArray -> ShortText
unsafeFromByteArray :: ByteArray -> ShortText
unsafeFromByteArray = ShortByteString -> ShortText
TS.fromShortByteStringUnsafe (ShortByteString -> ShortText)
-> (ByteArray -> ShortByteString) -> ByteArray -> ShortText
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteArray -> ShortByteString
SBS.ShortByteString
{-# INLINE copyBytes #-}
copyBytes
:: (PrimMonad m)
=> MutableByteArray (PrimState m)
-> Int
-> ShortText
-> Int
-> Int
-> m ()
copyBytes :: forall (m :: * -> *).
PrimMonad m =>
MutableByteArray (PrimState m)
-> Int -> ShortText -> Int -> Int -> m ()
copyBytes MutableByteArray (PrimState m)
dest Int
destOff ShortText
src Int
srcOff Int
len =
MutableByteArray (PrimState m)
-> Int -> ByteArray -> Int -> Int -> m ()
forall (m :: * -> *).
PrimMonad m =>
MutableByteArray (PrimState m)
-> Int -> ByteArray -> Int -> Int -> m ()
copyByteArray MutableByteArray (PrimState m)
dest Int
destOff (ShortText -> ByteArray
toByteArray ShortText
src) Int
srcOff Int
len