module Parsley.Internal.Backend.Machine.Types.Offset (module Parsley.Internal.Backend.Machine.Types.Offset) where
import Parsley.Internal.Backend.Machine.InputRep (Rep)
import Parsley.Internal.Common.Utils (Code)
data Offset o = Offset {
Offset o -> Code (Rep o)
offset :: Code (Rep o),
Offset o -> Word
unique :: Word,
Offset o -> Word
moved :: Word
}
instance Show (Offset o) where show :: Offset o -> String
show Offset o
o = Word -> String
forall a. Show a => a -> String
show (Offset o -> Word
forall o. Offset o -> Word
unique Offset o
o) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"+" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Word -> String
forall a. Show a => a -> String
show (Offset o -> Word
forall o. Offset o -> Word
moved Offset o
o)
same :: Offset o -> Offset o -> Maybe Bool
same :: Offset o -> Offset o -> Maybe Bool
same Offset o
o1 Offset o
o2
| Offset o -> Word
forall o. Offset o -> Word
unique Offset o
o1 Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Offset o -> Word
forall o. Offset o -> Word
unique Offset o
o2 = Bool -> Maybe Bool
forall a. a -> Maybe a
Just (Offset o -> Word
forall o. Offset o -> Word
moved Offset o
o1 Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Offset o -> Word
forall o. Offset o -> Word
moved Offset o
o2)
| Bool
otherwise = Maybe Bool
forall a. Maybe a
Nothing
moveOne :: Offset o -> Code (Rep o) -> Offset o
moveOne :: Offset o -> Code (Rep o) -> Offset o
moveOne Offset o
off Code (Rep o)
o = Offset o
off { offset :: Code (Rep o)
offset = Code (Rep o)
o, moved :: Word
moved = Offset o -> Word
forall o. Offset o -> Word
moved Offset o
off Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
1 }
mkOffset :: Code (Rep o) -> Word -> Offset o
mkOffset :: Code (Rep o) -> Word -> Offset o
mkOffset Code (Rep o)
offset Word
unique = Code (Rep o) -> Word -> Word -> Offset o
forall o. Code (Rep o) -> Word -> Word -> Offset o
Offset Code (Rep o)
offset Word
unique Word
0