{-# LANGUAGE Safe #-}
{-# LANGUAGE GADTs, NamedFieldPuns, BinaryLiterals, NumericUnderscores, DataKinds, BangPatterns #-}
{-# OPTIONS_HADDOCK hide #-}
{-# OPTIONS_GHC -Wno-missing-import-lists #-}
module Text.Gigaparsec.Internal.Errors.DefuncError (
    DefuncError(presentationOffset),
    specialisedError, expectedError, unexpectedError, emptyError,
    merge, withHints, withReason, withReasonAndOffset, label,
    amend, entrench, dislodge, markAsLexical,
    isVanilla, isExpectedEmpty, isLexical
  ) where

import Data.Word (Word32)
import Data.Bits ((.&.), (.|.), testBit, clearBit, setBit, complement, bit)
import Data.Set (Set)
import Data.Set qualified as Set (null)

import Text.Gigaparsec.Internal.Errors.CaretControl (CaretWidth, Span, isFlexible)
import Text.Gigaparsec.Internal.Errors.DefuncTypes (
    DefuncError(..), DefuncError_(..), ErrKindSingleton(..),
    ErrorOp(..), BaseError(..),
    DefuncHints(..)
  )
import Text.Gigaparsec.Internal.Errors.ErrorItem (ExpectItem)

{-# INLINABLE isVanilla #-}
isVanilla :: DefuncError -> Bool
isVanilla :: DefuncError -> Bool
isVanilla DefuncError{Word32
flags :: Word32
flags :: DefuncError -> Word32
flags} = Word32 -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
testBit Word32
flags Int
vanillaBit

{-# INLINABLE isExpectedEmpty #-}
isExpectedEmpty :: DefuncError -> Bool
isExpectedEmpty :: DefuncError -> Bool
isExpectedEmpty DefuncError{Word32
flags :: DefuncError -> Word32
flags :: Word32
flags} = Word32 -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
testBit Word32
flags Int
expectedEmptyBit

{-# INLINABLE entrenchedBy #-}
entrenchedBy :: DefuncError -> Word32
entrenchedBy :: DefuncError -> Word32
entrenchedBy DefuncError{Word32
flags :: DefuncError -> Word32
flags :: Word32
flags} = Word32
flags Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32
entrenchedMask

{-# INLINABLE entrenched #-}
entrenched :: DefuncError -> Bool
entrenched :: DefuncError -> Bool
entrenched DefuncError
err = DefuncError -> Word32
entrenchedBy DefuncError
err Word32 -> Word32 -> Bool
forall a. Ord a => a -> a -> Bool
> Word32
0

{-# INLINABLE isFlexibleCaret #-}
isFlexibleCaret :: DefuncError -> Bool
isFlexibleCaret :: DefuncError -> Bool
isFlexibleCaret DefuncError{Word32
flags :: DefuncError -> Word32
flags :: Word32
flags} = Word32 -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
testBit Word32
flags Int
flexibleCaretBit

{-# INLINABLE isLexical #-}
isLexical :: DefuncError -> Bool
isLexical :: DefuncError -> Bool
isLexical DefuncError{Word32
flags :: DefuncError -> Word32
flags :: Word32
flags} = Word32 -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
testBit Word32
flags Int
lexicalBit

-- Base Errors
specialisedError :: Word -> Word -> Word -> [String] -> CaretWidth -> DefuncError
specialisedError :: Word -> Word -> Word -> [String] -> CaretWidth -> DefuncError
specialisedError !Word
pOff !Word
line !Word
col ![String]
msgs CaretWidth
caret =
  ErrKindSingleton 'Specialised
-> Word32
-> Word
-> Word
-> DefuncError_ 'Specialised
-> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Specialised
IsSpecialised Word32
flags Word
pOff Word
pOff (Word -> Word -> BaseError 'Specialised -> DefuncError_ 'Specialised
forall (k :: ErrKind).
Word -> Word -> BaseError k -> DefuncError_ k
Base Word
line Word
col ([String] -> CaretWidth -> BaseError 'Specialised
ClassicSpecialised [String]
msgs CaretWidth
caret))
  where flags :: Word32
        !flags :: Word32
flags
          | CaretWidth -> Bool
isFlexible CaretWidth
caret = Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
setBit (Int -> Word32
forall a. Bits a => Int -> a
bit Int
expectedEmptyBit) Int
flexibleCaretBit
          | Bool
otherwise        = Int -> Word32
forall a. Bits a => Int -> a
bit Int
expectedEmptyBit

emptyError :: Word -> Word -> Word -> Span -> DefuncError
emptyError :: Word -> Word -> Word -> Word -> DefuncError
emptyError !Word
pOff !Word
line !Word
col !Word
unexWidth =
  ErrKindSingleton 'Vanilla
-> Word32 -> Word -> Word -> DefuncError_ 'Vanilla -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Vanilla
IsVanilla Word32
flags Word
pOff Word
pOff (Word -> Word -> BaseError 'Vanilla -> DefuncError_ 'Vanilla
forall (k :: ErrKind).
Word -> Word -> BaseError k -> DefuncError_ k
Base Word
line Word
col (Word -> BaseError 'Vanilla
Empty Word
unexWidth))
  where flags :: Word32
        !flags :: Word32
flags = Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
setBit (Int -> Word32
forall a. Bits a => Int -> a
bit Int
vanillaBit) Int
expectedEmptyBit

expectedError :: Word -> Word -> Word -> Set ExpectItem -> Span -> DefuncError
expectedError :: Word -> Word -> Word -> Set ExpectItem -> Word -> DefuncError
expectedError !Word
pOff !Word
line !Word
col !Set ExpectItem
exs !Word
unexWidth =
  ErrKindSingleton 'Vanilla
-> Word32 -> Word -> Word -> DefuncError_ 'Vanilla -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Vanilla
IsVanilla Word32
flags Word
pOff Word
pOff (Word -> Word -> BaseError 'Vanilla -> DefuncError_ 'Vanilla
forall (k :: ErrKind).
Word -> Word -> BaseError k -> DefuncError_ k
Base Word
line Word
col (Set ExpectItem -> Word -> BaseError 'Vanilla
Expected Set ExpectItem
exs Word
unexWidth))
  where flags :: Word32
        !flags :: Word32
flags
          | Set ExpectItem -> Bool
forall a. Set a -> Bool
Set.null Set ExpectItem
exs = Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
setBit (Int -> Word32
forall a. Bits a => Int -> a
bit Int
vanillaBit) Int
expectedEmptyBit
          | Bool
otherwise    = Int -> Word32
forall a. Bits a => Int -> a
bit Int
vanillaBit

unexpectedError :: Word -> Word -> Word -> Set ExpectItem -> String -> CaretWidth -> DefuncError
unexpectedError :: Word
-> Word
-> Word
-> Set ExpectItem
-> String
-> CaretWidth
-> DefuncError
unexpectedError !Word
pOff !Word
line !Word
col !Set ExpectItem
exs !String
unex CaretWidth
caretWidth =
  ErrKindSingleton 'Vanilla
-> Word32 -> Word -> Word -> DefuncError_ 'Vanilla -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Vanilla
IsVanilla Word32
flags Word
pOff Word
pOff (Word -> Word -> BaseError 'Vanilla -> DefuncError_ 'Vanilla
forall (k :: ErrKind).
Word -> Word -> BaseError k -> DefuncError_ k
Base Word
line Word
col (Set ExpectItem -> String -> CaretWidth -> BaseError 'Vanilla
Unexpected Set ExpectItem
exs String
unex CaretWidth
caretWidth))
  where flags :: Word32
        !flags :: Word32
flags
          | Set ExpectItem -> Bool
forall a. Set a -> Bool
Set.null Set ExpectItem
exs = Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
setBit (Int -> Word32
forall a. Bits a => Int -> a
bit Int
vanillaBit) Int
expectedEmptyBit
          | Bool
otherwise    = Int -> Word32
forall a. Bits a => Int -> a
bit Int
vanillaBit

-- Operations
merge :: DefuncError -> DefuncError -> DefuncError
merge :: DefuncError -> DefuncError -> DefuncError
merge err1 :: DefuncError
err1@(DefuncError ErrKindSingleton k
k1 Word32
flags1 Word
pOff1 Word
uOff1 DefuncError_ k
errTy1)
      err2 :: DefuncError
err2@(DefuncError ErrKindSingleton k
k2 Word32
flags2 Word
pOff2 Word
uOff2 DefuncError_ k
errTy2) =
  case Word -> Word -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Word
uOff1 Word
uOff2 of
    Ordering
GT -> DefuncError
err1
    Ordering
LT -> DefuncError
err2
    Ordering
EQ -> case Word -> Word -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Word
pOff1 Word
pOff2 of
      Ordering
GT -> DefuncError
err1
      Ordering
LT -> DefuncError
err2
      Ordering
EQ -> case ErrKindSingleton k
k1 of
        ErrKindSingleton k
IsSpecialised -> case ErrKindSingleton k
k2 of
          ErrKindSingleton k
IsSpecialised ->
            ErrKindSingleton 'Specialised
-> Word32
-> Word
-> Word
-> DefuncError_ 'Specialised
-> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Specialised
IsSpecialised (Word32 -> Word32 -> Word32
combineFlags Word32
flags1 Word32
flags2) Word
pOff1 Word
uOff1 (ErrorOp 'Specialised -> DefuncError_ 'Specialised
forall (k :: ErrKind). ErrorOp k -> DefuncError_ k
Op (DefuncError_ 'Specialised
-> DefuncError_ 'Specialised -> ErrorOp 'Specialised
forall (k :: ErrKind).
DefuncError_ k -> DefuncError_ k -> ErrorOp k
Merged DefuncError_ k
DefuncError_ 'Specialised
errTy1 DefuncError_ k
DefuncError_ 'Specialised
errTy2))
          ErrKindSingleton k
IsVanilla | DefuncError -> Bool
isFlexibleCaret DefuncError
err1 ->
            ErrKindSingleton 'Specialised
-> Word32
-> Word
-> Word
-> DefuncError_ 'Specialised
-> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Specialised
IsSpecialised Word32
flags1 Word
pOff1 Word
uOff1 (ErrorOp 'Specialised -> DefuncError_ 'Specialised
forall (k :: ErrKind). ErrorOp k -> DefuncError_ k
Op (DefuncError_ 'Specialised
-> DefuncError_ 'Vanilla -> ErrorOp 'Specialised
AdjustCaret DefuncError_ k
DefuncError_ 'Specialised
errTy1 DefuncError_ k
DefuncError_ 'Vanilla
errTy2))
          ErrKindSingleton k
_ -> DefuncError
err1
        ErrKindSingleton k
IsVanilla -> case ErrKindSingleton k
k2 of
          ErrKindSingleton k
IsVanilla ->
            ErrKindSingleton 'Vanilla
-> Word32 -> Word -> Word -> DefuncError_ 'Vanilla -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Vanilla
IsVanilla (Word32 -> Word32 -> Word32
combineFlags Word32
flags1 Word32
flags2) Word
pOff1 Word
uOff1 (ErrorOp 'Vanilla -> DefuncError_ 'Vanilla
forall (k :: ErrKind). ErrorOp k -> DefuncError_ k
Op (DefuncError_ 'Vanilla -> DefuncError_ 'Vanilla -> ErrorOp 'Vanilla
forall (k :: ErrKind).
DefuncError_ k -> DefuncError_ k -> ErrorOp k
Merged DefuncError_ k
DefuncError_ 'Vanilla
errTy1 DefuncError_ k
DefuncError_ 'Vanilla
errTy2))
          ErrKindSingleton k
IsSpecialised | DefuncError -> Bool
isFlexibleCaret DefuncError
err2 ->
            ErrKindSingleton 'Specialised
-> Word32
-> Word
-> Word
-> DefuncError_ 'Specialised
-> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Specialised
IsSpecialised Word32
flags1 Word
pOff1 Word
uOff1 (ErrorOp 'Specialised -> DefuncError_ 'Specialised
forall (k :: ErrKind). ErrorOp k -> DefuncError_ k
Op (DefuncError_ 'Specialised
-> DefuncError_ 'Vanilla -> ErrorOp 'Specialised
AdjustCaret DefuncError_ k
DefuncError_ 'Specialised
errTy2 DefuncError_ k
DefuncError_ 'Vanilla
errTy1))
          ErrKindSingleton k
_ -> DefuncError
err2
  where combineFlags :: Word32 -> Word32 -> Word32
combineFlags Word32
f1 Word32
f2 =
          (Word32
f1 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32
f2 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32 -> Word32
forall a. Bits a => a -> a
complement Word32
entrenchedMask) Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.|. Word32 -> Word32 -> Word32
forall a. Ord a => a -> a -> a
max (Word32
f1 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32
entrenchedMask) (Word32
f2 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32
entrenchedMask)

withHints :: DefuncHints -> DefuncError -> DefuncError
withHints :: DefuncHints -> DefuncError -> DefuncError
withHints DefuncHints
Blank DefuncError
err = DefuncError
err
withHints DefuncHints
hints (DefuncError ErrKindSingleton k
IsVanilla Word32
flags Word
pOff Word
uOff DefuncError_ k
errTy) =
  ErrKindSingleton 'Vanilla
-> Word32 -> Word -> Word -> DefuncError_ 'Vanilla -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Vanilla
IsVanilla (Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
clearBit Word32
flags Int
expectedEmptyBit) Word
pOff Word
uOff (ErrorOp 'Vanilla -> DefuncError_ 'Vanilla
forall (k :: ErrKind). ErrorOp k -> DefuncError_ k
Op (DefuncError_ 'Vanilla -> DefuncHints -> ErrorOp 'Vanilla
WithHints DefuncError_ k
DefuncError_ 'Vanilla
errTy DefuncHints
hints))
withHints DefuncHints
_ DefuncError
err = DefuncError
err

withReasonAndOffset :: String -> Word -> DefuncError -> DefuncError
withReasonAndOffset :: String -> Word -> DefuncError -> DefuncError
withReasonAndOffset !String
reason !Word
off (DefuncError ErrKindSingleton k
IsVanilla Word32
flags Word
pOff Word
uOff DefuncError_ k
errTy) | Word
pOff Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
off =
  ErrKindSingleton 'Vanilla
-> Word32 -> Word -> Word -> DefuncError_ 'Vanilla -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Vanilla
IsVanilla Word32
flags Word
pOff Word
uOff (ErrorOp 'Vanilla -> DefuncError_ 'Vanilla
forall (k :: ErrKind). ErrorOp k -> DefuncError_ k
Op (DefuncError_ 'Vanilla -> String -> ErrorOp 'Vanilla
WithReason DefuncError_ k
DefuncError_ 'Vanilla
errTy String
reason))
withReasonAndOffset String
_ Word
_ DefuncError
err = DefuncError
err

withReason :: String -> DefuncError -> DefuncError
withReason :: String -> DefuncError -> DefuncError
withReason !String
reason DefuncError
err = String -> Word -> DefuncError -> DefuncError
withReasonAndOffset String
reason (DefuncError -> Word
presentationOffset DefuncError
err) DefuncError
err

label :: Word -> Set String -> DefuncError -> DefuncError
label :: Word -> Set String -> DefuncError -> DefuncError
label !Word
off !Set String
labels (DefuncError ErrKindSingleton k
IsVanilla Word32
flags Word
pOff Word
uOff DefuncError_ k
errTy) | Word
pOff Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
off =
  ErrKindSingleton 'Vanilla
-> Word32 -> Word -> Word -> DefuncError_ 'Vanilla -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Vanilla
IsVanilla Word32
flags' Word
pOff Word
uOff (ErrorOp 'Vanilla -> DefuncError_ 'Vanilla
forall (k :: ErrKind). ErrorOp k -> DefuncError_ k
Op (DefuncError_ 'Vanilla -> Set String -> ErrorOp 'Vanilla
WithLabel DefuncError_ k
DefuncError_ 'Vanilla
errTy Set String
labels))
  where !flags' :: Word32
flags'
          | Set String -> Bool
forall a. Set a -> Bool
Set.null Set String
labels = Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
setBit Word32
flags Int
expectedEmptyBit
          | Bool
otherwise       = Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
clearBit Word32
flags Int
expectedEmptyBit
label Word
_ Set String
_ DefuncError
err = DefuncError
err

amend :: Bool -> Word -> Word -> Word -> DefuncError -> DefuncError
amend :: Bool -> Word -> Word -> Word -> DefuncError -> DefuncError
amend !Bool
partial !Word
pOff !Word
line !Word
col err :: DefuncError
err@(DefuncError ErrKindSingleton k
k Word32
flags Word
_ Word
uOff DefuncError_ k
errTy)
  | DefuncError -> Bool
entrenched DefuncError
err = DefuncError
err
  | Bool
otherwise = ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton k
k Word32
flags Word
pOff Word
uOff' (ErrorOp k -> DefuncError_ k
forall (k :: ErrKind). ErrorOp k -> DefuncError_ k
Op (Word -> Word -> DefuncError_ k -> ErrorOp k
forall (k :: ErrKind). Word -> Word -> DefuncError_ k -> ErrorOp k
Amended Word
line Word
col DefuncError_ k
errTy))
  where
    !uOff' :: Word
uOff' = if Bool
partial then Word
uOff else Word
pOff

entrench :: DefuncError -> DefuncError
entrench :: DefuncError -> DefuncError
entrench (DefuncError ErrKindSingleton k
k Word32
flags Word
pOff Word
uOff DefuncError_ k
errTy) = ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton k
k (Word32
flags Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
1) Word
pOff Word
uOff DefuncError_ k
errTy

dislodge :: Word32 -> DefuncError -> DefuncError
dislodge :: Word32 -> DefuncError -> DefuncError
dislodge Word32
by err :: DefuncError
err@(DefuncError ErrKindSingleton k
k Word32
flags Word
pOff Word
uOff DefuncError_ k
errTy)
  | Word32
eBy Word32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
== Word32
0  = DefuncError
err
  | Word32
eBy Word32 -> Word32 -> Bool
forall a. Ord a => a -> a -> Bool
> Word32
by  = ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton k
k (Word32
flags Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
by) Word
pOff Word
uOff DefuncError_ k
errTy
  | Bool
otherwise = ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton k
k (Word32
flags Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32 -> Word32
forall a. Bits a => a -> a
complement Word32
entrenchedMask) Word
pOff Word
uOff DefuncError_ k
errTy
  where !eBy :: Word32
eBy = DefuncError -> Word32
entrenchedBy DefuncError
err

markAsLexical :: Word -> DefuncError -> DefuncError
markAsLexical :: Word -> DefuncError -> DefuncError
markAsLexical !Word
off (DefuncError ErrKindSingleton k
IsVanilla Word32
flags Word
pOff Word
uOff DefuncError_ k
errTy) | Word
off Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< Word
pOff =
  ErrKindSingleton 'Vanilla
-> Word32 -> Word -> Word -> DefuncError_ 'Vanilla -> DefuncError
forall (k :: ErrKind).
ErrKindSingleton k
-> Word32 -> Word -> Word -> DefuncError_ k -> DefuncError
DefuncError ErrKindSingleton 'Vanilla
IsVanilla (Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
setBit Word32
flags Int
lexicalBit) Word
pOff Word
uOff DefuncError_ k
DefuncError_ 'Vanilla
errTy
markAsLexical Word
_ DefuncError
err = DefuncError
err

-- FLAG MASKS
{-# INLINE vanillaBit #-}
{-# INLINE expectedEmptyBit #-}
{-# INLINE lexicalBit #-}
{-# INLINE flexibleCaretBit #-}
{-# INLINE entrenchedMask #-}
vanillaBit, expectedEmptyBit, lexicalBit, flexibleCaretBit :: Int
vanillaBit :: Int
vanillaBit       = Int
31
expectedEmptyBit :: Int
expectedEmptyBit = Int
30
lexicalBit :: Int
lexicalBit       = Int
29
flexibleCaretBit :: Int
flexibleCaretBit = Int
28
entrenchedMask :: Word32
entrenchedMask :: Word32
entrenchedMask    = Word32
0b00001111_11111111_11111111_11111111