{-# LANGUAGE CPP, MagicHash #-}
module Data.Text.Internal.Unsafe.Char
(
ord
, unsafeChr
, unsafeChr8
, unsafeChr32
, unsafeWrite
) where
import Control.Monad.ST (ST)
import Data.Bits ((.&.))
import Data.Text.Internal.Unsafe.Shift (shiftR)
import GHC.Exts (Char(..), Int(..), chr#, ord#, word2Int#)
import GHC.Word (Word8(..), Word16(..), Word32(..))
import qualified Data.Text.Array as A
import Data.Text.Internal.PrimCompat ( word8ToWord#, word16ToWord#, word32ToWord# )
#if defined(ASSERTS)
import GHC.Stack (HasCallStack)
#endif
ord :: Char -> Int
ord :: Char -> Int
ord (C# Char#
c#) = Int# -> Int
I# (Char# -> Int#
ord# Char#
c#)
{-# INLINE ord #-}
unsafeChr :: Word16 -> Char
unsafeChr :: Word16 -> Char
unsafeChr (W16# Word#
w#) = Char# -> Char
C# (Int# -> Char#
chr# (Word# -> Int#
word2Int# (Word# -> Word#
word16ToWord# Word#
w#)))
{-# INLINE unsafeChr #-}
unsafeChr8 :: Word8 -> Char
unsafeChr8 :: Word8 -> Char
unsafeChr8 (W8# Word#
w#) = Char# -> Char
C# (Int# -> Char#
chr# (Word# -> Int#
word2Int# (Word# -> Word#
word8ToWord# Word#
w#)))
{-# INLINE unsafeChr8 #-}
unsafeChr32 :: Word32 -> Char
unsafeChr32 :: Word32 -> Char
unsafeChr32 (W32# Word#
w#) = Char# -> Char
C# (Int# -> Char#
chr# (Word# -> Int#
word2Int# (Word# -> Word#
word32ToWord# Word#
w#)))
{-# INLINE unsafeChr32 #-}
unsafeWrite ::
#if defined(ASSERTS)
HasCallStack =>
#endif
A.MArray s -> Int -> Char -> ST s Int
unsafeWrite :: MArray s -> Int -> Char -> ST s Int
unsafeWrite MArray s
marr Int
i Char
c
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0x10000 = do
MArray s -> Int -> Word16 -> ST s ()
forall s. MArray s -> Int -> Word16 -> ST s ()
A.unsafeWrite MArray s
marr Int
i (Int -> Word16
intToWord16 Int
n)
Int -> ST s Int
forall (m :: * -> *) a. Monad m => a -> m a
return Int
1
| Bool
otherwise = do
MArray s -> Int -> Word16 -> ST s ()
forall s. MArray s -> Int -> Word16 -> ST s ()
A.unsafeWrite MArray s
marr Int
i Word16
lo
MArray s -> Int -> Word16 -> ST s ()
forall s. MArray s -> Int -> Word16 -> ST s ()
A.unsafeWrite MArray s
marr (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) Word16
hi
Int -> ST s Int
forall (m :: * -> *) a. Monad m => a -> m a
return Int
2
where n :: Int
n = Char -> Int
ord Char
c
m :: Int
m = Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
0x10000
lo :: Word16
lo = Int -> Word16
intToWord16 (Int -> Word16) -> Int -> Word16
forall a b. (a -> b) -> a -> b
$ (Int
m Int -> Int -> Int
forall a. UnsafeShift a => a -> Int -> a
`shiftR` Int
10) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
0xD800
hi :: Word16
hi = Int -> Word16
intToWord16 (Int -> Word16) -> Int -> Word16
forall a b. (a -> b) -> a -> b
$ (Int
m Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
0x3FF) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
0xDC00
{-# INLINE unsafeWrite #-}
intToWord16 :: Int -> Word16
intToWord16 :: Int -> Word16
intToWord16 = Int -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral