-- |
-- Utilities for construction of Unicode codepoints.
module TextBuilderDev.Unicode where

import TextBuilderDev.Prelude

{-# INLINE utf8CodeUnits3 #-}
utf8CodeUnits3 :: Word8 -> Word8 -> Word8 -> Int
utf8CodeUnits3 :: Word8 -> Word8 -> Word8 -> Int
utf8CodeUnits3 Word8
byte1 Word8
byte2 Word8
byte3 =
  forall a. Bits a => a -> Int -> a
shiftL (forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
byte1 forall a. Num a => a -> a -> a
- Int
0xE0) Int
12
    forall a. Num a => a -> a -> a
+ forall a. Bits a => a -> Int -> a
shiftL (forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
byte2 forall a. Num a => a -> a -> a
- Int
0x80) Int
6
    forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
byte3
    forall a. Num a => a -> a -> a
- Int
0x80

{-# INLINE utf8CodeUnits4 #-}
utf8CodeUnits4 :: Word8 -> Word8 -> Word8 -> Word8 -> Int
utf8CodeUnits4 :: Word8 -> Word8 -> Word8 -> Word8 -> Int
utf8CodeUnits4 Word8
byte1 Word8
byte2 Word8
byte3 Word8
byte4 =
  forall a. Bits a => a -> Int -> a
shiftL (forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
byte1 forall a. Num a => a -> a -> a
- Int
0xF0) Int
18
    forall a. Num a => a -> a -> a
+ forall a. Bits a => a -> Int -> a
shiftL (forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
byte2 forall a. Num a => a -> a -> a
- Int
0x80) Int
12
    forall a. Num a => a -> a -> a
+ forall a. Bits a => a -> Int -> a
shiftL (forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
byte3 forall a. Num a => a -> a -> a
- Int
0x80) Int
6
    forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
byte4
    forall a. Num a => a -> a -> a
- Int
0x80