{-# LANGUAGE DerivingStrategies, GeneralisedNewtypeDeriving, UnboxedTuples #-}
module Parsley.Internal.Backend.Machine.Types.Input.Offset (
Offset, mkOffset, offset, moveOne, moveN, same, updateDeepestKnown, unsafeDeepestKnown
) where
import Parsley.Internal.Backend.Machine.InputRep (StaRep)
import Data.Maybe (fromJust)
data Offset o = Offset {
forall o. Offset o -> StaRep o
offset :: !(StaRep o),
forall o. Offset o -> Maybe (StaRep o)
deepestKnownChar :: !(Maybe (StaRep o)),
forall o. Offset o -> Word
unique :: {-# UNPACK #-} !Word,
forall o. Offset o -> Amount
moved :: {-# UNPACK #-} !Amount
}
newtype Amount = Amount Word deriving newtype (Amount -> Amount -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Amount -> Amount -> Bool
$c/= :: Amount -> Amount -> Bool
== :: Amount -> Amount -> Bool
$c== :: Amount -> Amount -> Bool
Eq, Integer -> Amount
Amount -> Amount
Amount -> Amount -> Amount
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
fromInteger :: Integer -> Amount
$cfromInteger :: Integer -> Amount
signum :: Amount -> Amount
$csignum :: Amount -> Amount
abs :: Amount -> Amount
$cabs :: Amount -> Amount
negate :: Amount -> Amount
$cnegate :: Amount -> Amount
* :: Amount -> Amount -> Amount
$c* :: Amount -> Amount -> Amount
- :: Amount -> Amount -> Amount
$c- :: Amount -> Amount -> Amount
+ :: Amount -> Amount -> Amount
$c+ :: Amount -> Amount -> Amount
Num, Int -> Amount -> ShowS
[Amount] -> ShowS
Amount -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Amount] -> ShowS
$cshowList :: [Amount] -> ShowS
show :: Amount -> String
$cshow :: Amount -> String
showsPrec :: Int -> Amount -> ShowS
$cshowsPrec :: Int -> Amount -> ShowS
Show)
same :: Offset o -> Offset o -> Maybe Bool
same :: forall o. Offset o -> Offset o -> Maybe Bool
same Offset o
o1 Offset o
o2
| forall o. Offset o -> Word
unique Offset o
o1 forall a. Eq a => a -> a -> Bool
== forall o. Offset o -> Word
unique Offset o
o2 = forall a. a -> Maybe a
Just (forall o. Offset o -> Amount
moved Offset o
o1 forall a. Eq a => a -> a -> Bool
== forall o. Offset o -> Amount
moved Offset o
o2)
| Bool
otherwise = forall a. Maybe a
Nothing
moveOne :: Offset o -> StaRep o -> Offset o
moveOne :: forall o. Offset o -> StaRep o -> Offset o
moveOne = forall o. Word -> Offset o -> StaRep o -> Offset o
moveN Word
1
moveN :: Word -> Offset o -> StaRep o -> Offset o
moveN :: forall o. Word -> Offset o -> StaRep o -> Offset o
moveN Word
n Offset o
off StaRep o
o = Offset o
off { offset :: StaRep o
offset = StaRep o
o, moved :: Amount
moved = forall o. Offset o -> Amount
moved Offset o
off forall a. Num a => a -> a -> a
+ Word -> Amount
Amount Word
n }
mkOffset :: StaRep o -> Word -> Offset o
mkOffset :: forall o. StaRep o -> Word -> Offset o
mkOffset StaRep o
offset Word
unique = forall o.
StaRep o -> Maybe (StaRep o) -> Word -> Amount -> Offset o
Offset StaRep o
offset forall a. Maybe a
Nothing Word
unique Amount
0
updateDeepestKnown :: StaRep o -> Offset o -> Offset o
updateDeepestKnown :: forall o. StaRep o -> Offset o -> Offset o
updateDeepestKnown StaRep o
known Offset o
offset = Offset o
offset { deepestKnownChar :: Maybe (StaRep o)
deepestKnownChar = forall a. a -> Maybe a
Just StaRep o
known }
unsafeDeepestKnown :: Offset o -> StaRep o
unsafeDeepestKnown :: forall o. Offset o -> StaRep o
unsafeDeepestKnown = forall a. HasCallStack => Maybe a -> a
fromJust forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall o. Offset o -> Maybe (StaRep o)
deepestKnownChar
instance Show (Offset o) where
show :: Offset o -> String
show Offset o
o = forall a. Show a => a -> String
show (forall o. Offset o -> Word
unique Offset o
o) forall a. [a] -> [a] -> [a]
++ String
"+" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (forall o. Offset o -> Amount
moved Offset o
o)