module Iri.PercentEncoding where

import Iri.Prelude

{-# INLINE matchHexByte #-}
matchHexByte :: a -> (Word8 -> a) -> Word8 -> a
matchHexByte :: forall a. a -> (Word8 -> a) -> Word8 -> a
matchHexByte a
failure Word8 -> a
success Word8
x =
  if Word8
x Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
>= Word8
48 Bool -> Bool -> Bool
&& Word8
x Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word8
57
    then Word8 -> a
success (Word8
x Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
- Word8
48)
    else
      if Word8
x Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
>= Word8
65 Bool -> Bool -> Bool
&& Word8
x Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word8
70
        then Word8 -> a
success (Word8
x Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
- Word8
55)
        else
          if Word8
x Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
>= Word8
97 Bool -> Bool -> Bool
&& Word8
x Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word8
102
            then Word8 -> a
success (Word8
x Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
- Word8
87)
            else a
failure

{-# INLINE matchPercentEncodedBytes #-}
matchPercentEncodedBytes :: a -> (Word8 -> a) -> Word8 -> Word8 -> a
matchPercentEncodedBytes :: forall a. a -> (Word8 -> a) -> Word8 -> Word8 -> a
matchPercentEncodedBytes a
failure Word8 -> a
success Word8
byte1 Word8
byte2 =
  a -> (Word8 -> a) -> Word8 -> a
forall a. a -> (Word8 -> a) -> Word8 -> a
matchHexByte a
failure Word8 -> a
firstByteSuccess Word8
byte1
  where
    firstByteSuccess :: Word8 -> a
firstByteSuccess Word8
decodedByte1 =
      a -> (Word8 -> a) -> Word8 -> a
forall a. a -> (Word8 -> a) -> Word8 -> a
matchHexByte a
failure Word8 -> a
secondByteSuccess Word8
byte2
      where
        secondByteSuccess :: Word8 -> a
secondByteSuccess Word8
decodedByte2 =
          Word8 -> a
success (Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
shiftL Word8
decodedByte1 Int
4 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
decodedByte2)