module TextBuilderDev.Utf8View where

import TextBuilderDev.Prelude

-- |
-- A matching function, which chooses the continuation to run.
type Utf8View =
  forall x.
  (Word8 -> x) ->
  (Word8 -> Word8 -> x) ->
  (Word8 -> Word8 -> Word8 -> x) ->
  (Word8 -> Word8 -> Word8 -> Word8 -> x) ->
  x

{-# INLINE unicodeCodePoint #-}
unicodeCodePoint :: Int -> Utf8View
unicodeCodePoint :: Int -> Utf8View
unicodeCodePoint Int
x Word8 -> x
case1 Word8 -> Word8 -> x
case2 Word8 -> Word8 -> Word8 -> x
case3 Word8 -> Word8 -> Word8 -> Word8 -> x
case4
  | Int
x forall a. Ord a => a -> a -> Bool
< Int
0x80 = Word8 -> x
case1 (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x)
  | Int
x forall a. Ord a => a -> a -> Bool
< Int
0x800 =
      Word8 -> Word8 -> x
case2
        (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ Int
x forall a. Bits a => a -> Int -> a
`shiftR` Int
6 forall a. Bits a => a -> a -> a
.|. Int
0xC0)
        (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ (Int
x forall a. Bits a => a -> a -> a
.&. Int
0x3F) forall a. Bits a => a -> a -> a
.|. Int
0x80)
  | Int
x forall a. Ord a => a -> a -> Bool
< Int
0x10000 =
      Word8 -> Word8 -> Word8 -> x
case3
        (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ Int
x forall a. Bits a => a -> Int -> a
`shiftR` Int
12 forall a. Bits a => a -> a -> a
.|. Int
0xE0)
        (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ (Int
x forall a. Bits a => a -> Int -> a
`shiftR` Int
6) forall a. Bits a => a -> a -> a
.&. Int
0x3F forall a. Bits a => a -> a -> a
.|. Int
0x80)
        (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ (Int
x forall a. Bits a => a -> a -> a
.&. Int
0x3F) forall a. Bits a => a -> a -> a
.|. Int
0x80)
  | Bool
otherwise =
      Word8 -> Word8 -> Word8 -> Word8 -> x
case4
        (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ Int
x forall a. Bits a => a -> Int -> a
`shiftR` Int
18 forall a. Bits a => a -> a -> a
.|. Int
0xF0)
        (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ (Int
x forall a. Bits a => a -> Int -> a
`shiftR` Int
12) forall a. Bits a => a -> a -> a
.&. Int
0x3F forall a. Bits a => a -> a -> a
.|. Int
0x80)
        (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ (Int
x forall a. Bits a => a -> Int -> a
`shiftR` Int
6) forall a. Bits a => a -> a -> a
.&. Int
0x3F forall a. Bits a => a -> a -> a
.|. Int
0x80)
        (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ (Int
x forall a. Bits a => a -> a -> a
.&. Int
0x3F) forall a. Bits a => a -> a -> a
.|. Int
0x80)