{-# LANGUAGE GADTs, ViewPatterns #-}
module GHC.Debugger.Runtime.Term.Key where
import Prelude hiding ((<>))
import GHC
import GHC.Utils.Outputable
import GHC.Types.Id
import GHC.Tc.Utils.TcType
import GHC.Runtime.Eval
import GHC.Types.Unique.Supply (uniqFromTag)
import GHC.Types.Name.Env
data TermKey where
FromId :: Id -> TermKey
FromPath :: TermKey -> PathFragment -> TermKey
data PathFragment
= PositionalIndex Int
| LabeledField Name
deriving (PathFragment -> PathFragment -> Bool
(PathFragment -> PathFragment -> Bool)
-> (PathFragment -> PathFragment -> Bool) -> Eq PathFragment
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PathFragment -> PathFragment -> Bool
== :: PathFragment -> PathFragment -> Bool
$c/= :: PathFragment -> PathFragment -> Bool
/= :: PathFragment -> PathFragment -> Bool
Eq, Eq PathFragment
Eq PathFragment =>
(PathFragment -> PathFragment -> Ordering)
-> (PathFragment -> PathFragment -> Bool)
-> (PathFragment -> PathFragment -> Bool)
-> (PathFragment -> PathFragment -> Bool)
-> (PathFragment -> PathFragment -> Bool)
-> (PathFragment -> PathFragment -> PathFragment)
-> (PathFragment -> PathFragment -> PathFragment)
-> Ord PathFragment
PathFragment -> PathFragment -> Bool
PathFragment -> PathFragment -> Ordering
PathFragment -> PathFragment -> PathFragment
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
$ccompare :: PathFragment -> PathFragment -> Ordering
compare :: PathFragment -> PathFragment -> Ordering
$c< :: PathFragment -> PathFragment -> Bool
< :: PathFragment -> PathFragment -> Bool
$c<= :: PathFragment -> PathFragment -> Bool
<= :: PathFragment -> PathFragment -> Bool
$c> :: PathFragment -> PathFragment -> Bool
> :: PathFragment -> PathFragment -> Bool
$c>= :: PathFragment -> PathFragment -> Bool
>= :: PathFragment -> PathFragment -> Bool
$cmax :: PathFragment -> PathFragment -> PathFragment
max :: PathFragment -> PathFragment -> PathFragment
$cmin :: PathFragment -> PathFragment -> PathFragment
min :: PathFragment -> PathFragment -> PathFragment
Ord)
instance Outputable TermKey where
ppr :: TermKey -> SDoc
ppr (FromId Id
i) = Id -> SDoc
forall a. Outputable a => a -> SDoc
ppr Id
i
ppr (FromPath TermKey
_ PathFragment
last_p) = PathFragment -> SDoc
forall a. Outputable a => a -> SDoc
ppr PathFragment
last_p
instance Outputable PathFragment where
ppr :: PathFragment -> SDoc
ppr (PositionalIndex Int
i) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"_" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> Int -> SDoc
forall a. Outputable a => a -> SDoc
ppr Int
i
ppr (LabeledField Name
n) = Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr Name
n
unconsTermKey :: TermKey -> (Id, [PathFragment])
unconsTermKey :: TermKey -> (Id, [PathFragment])
unconsTermKey = [PathFragment] -> TermKey -> (Id, [PathFragment])
go [] where
go :: [PathFragment] -> TermKey -> (Id, [PathFragment])
go [PathFragment]
acc (FromId Id
i) = (Id
i, [PathFragment] -> [PathFragment]
forall a. [a] -> [a]
reverse [PathFragment]
acc)
go [PathFragment]
acc (FromPath TermKey
k PathFragment
p) = [PathFragment] -> TermKey -> (Id, [PathFragment])
go (PathFragment
pPathFragment -> [PathFragment] -> [PathFragment]
forall a. a -> [a] -> [a]
:[PathFragment]
acc) TermKey
k