module Chronos.Internal.FastText where
import Data.Text (Text)
import Control.Monad.ST (ST)
import qualified Data.Text.Internal as I
import qualified Data.Text as Text
import qualified Data.Text.Array as A
import qualified Data.Text.Internal.Unsafe.Char as C
data MArrayAppend s = MArrayAppend (Int -> A.MArray s -> ST s Int) !Int
combine :: MArrayAppend s -> MArrayAppend s -> MArrayAppend s
combine (MArrayAppend f maxSizeA) (MArrayAppend g maxSizeB) = do
MArrayAppend (\i marr -> f i marr >>= (\j -> g j marr)) (maxSizeA + maxSizeB)
runMArrayAppend :: (forall s. MArrayAppend s) -> Text
runMArrayAppend x =
let (!arr, !word16Used) = A.run2 $ case x of
MArrayAppend f maxSize -> do
marr <- A.new maxSize
finalSize <- f 0 marr
return (marr,finalSize)
in I.Text arr 0 word16Used
singleton :: Char -> MArrayAppend s
singleton c = MArrayAppend (\i marr -> do
C.unsafeWrite marr i c
) 2
fromText :: Text -> MArrayAppend s
fromText (I.Text arr start len) = MArrayAppend (\i marr -> do
let j = len + i
A.copyI marr i arr start j
return j ) len