{-# OPTIONS_GHC -Wno-incomplete-patterns #-}
{-# LANGUAGE DerivingStrategies, GeneralisedNewtypeDeriving #-}
module Parsley.Internal.Backend.Machine.Identifiers (
ΦVar(..), IΦVar,
module Parsley.Internal.Core.Identifiers,
) where
import Data.GADT.Compare (GEq, GCompare, gcompare, geq, GOrdering(..))
import Data.Kind (Type)
import Data.Typeable ((:~:)(Refl))
import Data.Word (Word64)
import Parsley.Internal.Core.Identifiers
import Unsafe.Coerce (unsafeCoerce)
newtype ΦVar (a :: Type) = ΦVar IΦVar
newtype IΦVar = IΦVar Word64 deriving newtype (Eq IΦVar
IΦVar -> IΦVar -> Bool
IΦVar -> IΦVar -> Ordering
IΦVar -> IΦVar -> IΦVar
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: IΦVar -> IΦVar -> IΦVar
$cmin :: IΦVar -> IΦVar -> IΦVar
max :: IΦVar -> IΦVar -> IΦVar
$cmax :: IΦVar -> IΦVar -> IΦVar
>= :: IΦVar -> IΦVar -> Bool
$c>= :: IΦVar -> IΦVar -> Bool
> :: IΦVar -> IΦVar -> Bool
$c> :: IΦVar -> IΦVar -> Bool
<= :: IΦVar -> IΦVar -> Bool
$c<= :: IΦVar -> IΦVar -> Bool
< :: IΦVar -> IΦVar -> Bool
$c< :: IΦVar -> IΦVar -> Bool
compare :: IΦVar -> IΦVar -> Ordering
$ccompare :: IΦVar -> IΦVar -> Ordering
Ord, IΦVar -> IΦVar -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: IΦVar -> IΦVar -> Bool
$c/= :: IΦVar -> IΦVar -> Bool
== :: IΦVar -> IΦVar -> Bool
$c== :: IΦVar -> IΦVar -> Bool
Eq, Integer -> IΦVar
IΦVar -> IΦVar
IΦVar -> IΦVar -> IΦVar
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
fromInteger :: Integer -> IΦVar
$cfromInteger :: Integer -> IΦVar
signum :: IΦVar -> IΦVar
$csignum :: IΦVar -> IΦVar
abs :: IΦVar -> IΦVar
$cabs :: IΦVar -> IΦVar
negate :: IΦVar -> IΦVar
$cnegate :: IΦVar -> IΦVar
* :: IΦVar -> IΦVar -> IΦVar
$c* :: IΦVar -> IΦVar -> IΦVar
- :: IΦVar -> IΦVar -> IΦVar
$c- :: IΦVar -> IΦVar -> IΦVar
+ :: IΦVar -> IΦVar -> IΦVar
$c+ :: IΦVar -> IΦVar -> IΦVar
Num, Int -> IΦVar
IΦVar -> Int
IΦVar -> [IΦVar]
IΦVar -> IΦVar
IΦVar -> IΦVar -> [IΦVar]
IΦVar -> IΦVar -> IΦVar -> [IΦVar]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: IΦVar -> IΦVar -> IΦVar -> [IΦVar]
$cenumFromThenTo :: IΦVar -> IΦVar -> IΦVar -> [IΦVar]
enumFromTo :: IΦVar -> IΦVar -> [IΦVar]
$cenumFromTo :: IΦVar -> IΦVar -> [IΦVar]
enumFromThen :: IΦVar -> IΦVar -> [IΦVar]
$cenumFromThen :: IΦVar -> IΦVar -> [IΦVar]
enumFrom :: IΦVar -> [IΦVar]
$cenumFrom :: IΦVar -> [IΦVar]
fromEnum :: IΦVar -> Int
$cfromEnum :: IΦVar -> Int
toEnum :: Int -> IΦVar
$ctoEnum :: Int -> IΦVar
pred :: IΦVar -> IΦVar
$cpred :: IΦVar -> IΦVar
succ :: IΦVar -> IΦVar
$csucc :: IΦVar -> IΦVar
Enum, Int -> IΦVar -> ShowS
[IΦVar] -> ShowS
IΦVar -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IΦVar] -> ShowS
$cshowList :: [IΦVar] -> ShowS
show :: IΦVar -> String
$cshow :: IΦVar -> String
showsPrec :: Int -> IΦVar -> ShowS
$cshowsPrec :: Int -> IΦVar -> ShowS
Show)
instance Show (ΦVar a) where show :: ΦVar a -> String
show (ΦVar IΦVar
φ) = String
"φ" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show IΦVar
φ
instance GEq ΦVar where
geq :: forall a b. ΦVar a -> ΦVar b -> Maybe (a :~: b)
geq (ΦVar IΦVar
u) (ΦVar IΦVar
v)
| IΦVar
u forall a. Eq a => a -> a -> Bool
== IΦVar
v = forall a. a -> Maybe a
Just (forall a b. a -> b
unsafeCoerce forall {k} (a :: k). a :~: a
Refl)
| Bool
otherwise = forall a. Maybe a
Nothing
instance GCompare ΦVar where
gcompare :: forall a b. ΦVar a -> ΦVar b -> GOrdering a b
gcompare φ1 :: ΦVar a
φ1@(ΦVar IΦVar
u) φ2 :: ΦVar b
φ2@(ΦVar IΦVar
v) = case forall a. Ord a => a -> a -> Ordering
compare IΦVar
u IΦVar
v of
Ordering
LT -> forall {k} (a :: k) (b :: k). GOrdering a b
GLT
Ordering
EQ -> case forall k (f :: k -> Type) (a :: k) (b :: k).
GEq f =>
f a -> f b -> Maybe (a :~: b)
geq ΦVar a
φ1 ΦVar b
φ2 of Just a :~: b
Refl -> forall {k} (a :: k). GOrdering a a
GEQ
Ordering
GT -> forall {k} (a :: k) (b :: k). GOrdering a b
GGT