module Data.Text.Builder.Common.Internal where
import Data.Text (Text)
import Control.Monad.ST
import Data.Monoid
import Text.Printf
import Data.Char (ord)
import Data.Foldable (fold)
import qualified Data.Text as Text
import qualified Data.Text.Array as A
import qualified Data.Text.Internal.Unsafe.Char as TC
portableTextArray :: Text -> A.Array
portableTextArray :: Text -> Array
portableTextArray = forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> (Array, Int)
portableUntext
{-# INLINE portableTextArray #-}
portableTextLength :: Text -> Int
portableTextLength :: Text -> Int
portableTextLength = forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> (Array, Int)
portableUntext
{-# INLINE portableTextLength #-}
portableUntext :: Text -> (A.Array,Int)
portableUntext :: Text -> (Array, Int)
portableUntext Text
t =
let str :: String
str = Text -> String
Text.unpack Text
t
Sum Int
len = forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (forall a. a -> Sum a
Sum forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
charUtf16Size) String
str
arr :: Array
arr = (forall s. ST s (MArray s)) -> Array
A.run forall a b. (a -> b) -> a -> b
$ do
MArray s
marr <- forall s. Int -> ST s (MArray s)
A.new Int
len
forall s. MArray s -> String -> ST s ()
writeString MArray s
marr String
str
forall (m :: * -> *) a. Monad m => a -> m a
return MArray s
marr
in (Array
arr,Int
len)
{-# NOINLINE portableUntext #-}
writeString :: A.MArray s -> String -> ST s ()
writeString :: forall s. MArray s -> String -> ST s ()
writeString MArray s
marr = Int -> String -> ST s ()
go Int
0 where
go :: Int -> String -> ST s ()
go Int
i String
s = case String
s of
Char
c : String
cs -> do
Int
n <- forall s. MArray s -> Int -> Char -> ST s Int
TC.unsafeWrite MArray s
marr Int
i Char
c
Int -> String -> ST s ()
go (Int
i forall a. Num a => a -> a -> a
+ Int
n) String
cs
[] -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
charUtf16Size :: Char -> Int
charUtf16Size :: Char -> Int
charUtf16Size Char
c = if Char -> Int
ord Char
c forall a. Ord a => a -> a -> Bool
< Int
0x10000 then Int
1 else Int
2
hexValuesWord12Upper :: A.Array
hexValuesWord12Upper :: Array
hexValuesWord12Upper = Text -> Array
portableTextArray forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold
forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (String -> Text
Text.pack forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall r. PrintfType r => String -> r
printf String
"%03X") [Int
0 :: Int ..Int
4096]
{-# NOINLINE hexValuesWord12Upper #-}
hexValuesWord12Lower :: A.Array
hexValuesWord12Lower :: Array
hexValuesWord12Lower = Text -> Array
portableTextArray forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold
forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (String -> Text
Text.pack forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall r. PrintfType r => String -> r
printf String
"%03x") [Int
0 :: Int ..Int
4096]
{-# NOINLINE hexValuesWord12Lower #-}
hexValuesWord8Upper :: A.Array
hexValuesWord8Upper :: Array
hexValuesWord8Upper = Text -> Array
portableTextArray forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold
forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (String -> Text
Text.pack forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall r. PrintfType r => String -> r
printf String
"%02X") [Int
0 :: Int ..Int
255]
{-# NOINLINE hexValuesWord8Upper #-}
hexValuesWord8Lower :: A.Array
hexValuesWord8Lower :: Array
hexValuesWord8Lower = Text -> Array
portableTextArray forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold
forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (String -> Text
Text.pack forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall r. PrintfType r => String -> r
printf String
"%02x") [Int
0 :: Int ..Int
255]
{-# NOINLINE hexValuesWord8Lower #-}
twoDecimalDigits :: A.Array
twoDecimalDigits :: Array
twoDecimalDigits = Text -> Array
portableTextArray
forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (String -> Text
Text.pack forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall r. PrintfType r => String -> r
printf String
"%02d") [Int
0 :: Int ..Int
99]
{-# NOINLINE twoDecimalDigits #-}
threeDecimalDigits :: A.Array
threeDecimalDigits :: Array
threeDecimalDigits = Text -> Array
portableTextArray
forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (String -> Text
Text.pack forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall r. PrintfType r => String -> r
printf String
"%03d") [Int
0 :: Int ..Int
255]
{-# NOINLINE threeDecimalDigits #-}