module ByteString.StrictBuilder.UTF8 where
import ByteString.StrictBuilder.Prelude
type UTF8Char =
forall a.
(Word8 -> a) ->
(Word8 -> Word8 -> a) ->
(Word8 -> Word8 -> Word8 -> a) ->
(Word8 -> Word8 -> Word8 -> Word8 -> a) ->
a
{-# INLINE char #-}
char :: Char -> UTF8Char
char =
unicodeCodePoint . ord
{-# INLINE unicodeCodePoint #-}
unicodeCodePoint :: Int -> UTF8Char
unicodeCodePoint x f1 f2 f3 f4 =
if x <= 0x7F
then
f1 (fromIntegral x)
else
if x <= 0x07FF
then
f2
(fromIntegral ((x `shiftR` 6) + 0xC0))
(fromIntegral ((x .&. 0x3F) + 0x80))
else
if x <= 0xFFFF
then
f3
(fromIntegral (x `shiftR` 12) + 0xE0)
(fromIntegral ((x `shiftR` 6) .&. 0x3F) + 0x80)
(fromIntegral (x .&. 0x3F) + 0x80)
else
f4
(fromIntegral (x `shiftR` 18) + 0xF0)
(fromIntegral ((x `shiftR` 12) .&. 0x3F) + 0x80)
(fromIntegral ((x `shiftR` 6) .&. 0x3F) + 0x80)
(fromIntegral (x .&. 0x3F) + 0x80)