{-# LANGUAGE DerivingVia, StandaloneDeriving, ViewPatterns, ImpredicativeTypes #-}
module GHC.Debugger.View.Class
(
DebugView(..)
, VarValue(..)
, VarFields(..)
, VarFieldValue(..)
, BoringTy(..)
, VarValueIO(..)
, debugValueIOWrapper
, VarFieldsIO(..)
, debugFieldsIOWrapper
)
where
class DebugView a where
debugValue :: a -> VarValue
debugFields :: a -> VarFields
data VarValue = VarValue
{
VarValue -> String
varValue :: String
, VarValue -> Bool
varExpandable :: Bool
}
deriving (Int -> VarValue -> ShowS
[VarValue] -> ShowS
VarValue -> String
(Int -> VarValue -> ShowS)
-> (VarValue -> String) -> ([VarValue] -> ShowS) -> Show VarValue
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> VarValue -> ShowS
showsPrec :: Int -> VarValue -> ShowS
$cshow :: VarValue -> String
show :: VarValue -> String
$cshowList :: [VarValue] -> ShowS
showList :: [VarValue] -> ShowS
Show, ReadPrec [VarValue]
ReadPrec VarValue
Int -> ReadS VarValue
ReadS [VarValue]
(Int -> ReadS VarValue)
-> ReadS [VarValue]
-> ReadPrec VarValue
-> ReadPrec [VarValue]
-> Read VarValue
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS VarValue
readsPrec :: Int -> ReadS VarValue
$creadList :: ReadS [VarValue]
readList :: ReadS [VarValue]
$creadPrec :: ReadPrec VarValue
readPrec :: ReadPrec VarValue
$creadListPrec :: ReadPrec [VarValue]
readListPrec :: ReadPrec [VarValue]
Read)
newtype VarFields = VarFields
{ VarFields -> [(String, VarFieldValue)]
varFields :: [(String, VarFieldValue)]
}
data VarFieldValue = forall a. VarFieldValue a
newtype BoringTy a = BoringTy a
instance Show a => DebugView (BoringTy a) where
debugValue :: BoringTy a -> VarValue
debugValue (BoringTy a
x) = String -> Bool -> VarValue
VarValue (a -> String
forall a. Show a => a -> String
show a
x) Bool
False
debugFields :: BoringTy a -> VarFields
debugFields BoringTy a
_ = [(String, VarFieldValue)] -> VarFields
VarFields []
deriving via BoringTy Int instance DebugView Int
deriving via BoringTy Word instance DebugView Word
deriving via BoringTy Double instance DebugView Double
deriving via BoringTy Float instance DebugView Float
deriving via BoringTy Integer instance DebugView Integer
deriving via BoringTy Char instance DebugView Char
deriving via BoringTy String instance DebugView String
instance DebugView (a, b) where
debugValue :: (a, b) -> VarValue
debugValue (a, b)
_ = String -> Bool -> VarValue
VarValue String
"( , )" Bool
True
debugFields :: (a, b) -> VarFields
debugFields (a
x, b
y) = [(String, VarFieldValue)] -> VarFields
VarFields
[ (String
"fst", a -> VarFieldValue
forall a. a -> VarFieldValue
VarFieldValue a
x)
, (String
"snd", b -> VarFieldValue
forall a. a -> VarFieldValue
VarFieldValue b
y) ]
data VarValueIO = VarValueIO
{ VarValueIO -> IO String
varValueIO :: IO String
, VarValueIO -> Bool
varExpandableIO :: Bool
}
debugValueIOWrapper :: DebugView a => a -> IO [VarValueIO]
debugValueIOWrapper :: forall a. DebugView a => a -> IO [VarValueIO]
debugValueIOWrapper a
x = case a -> VarValue
forall a. DebugView a => a -> VarValue
debugValue a
x of
VarValue String
str Bool
b ->
[VarValueIO] -> IO [VarValueIO]
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure [IO String -> Bool -> VarValueIO
VarValueIO (String -> IO String
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
str) Bool
b]
newtype VarFieldsIO = VarFieldsIO
{ VarFieldsIO -> [(IO String, VarFieldValue)]
varFieldsIO :: [(IO String, VarFieldValue)]
}
debugFieldsIOWrapper :: DebugView a => a -> IO [VarFieldsIO]
debugFieldsIOWrapper :: forall a. DebugView a => a -> IO [VarFieldsIO]
debugFieldsIOWrapper a
x = case a -> VarFields
forall a. DebugView a => a -> VarFields
debugFields a
x of
VarFields [(String, VarFieldValue)]
fls ->
[VarFieldsIO] -> IO [VarFieldsIO]
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure [[(IO String, VarFieldValue)] -> VarFieldsIO
VarFieldsIO [ (String -> IO String
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
fl_s, VarFieldValue
b) | (String
fl_s, VarFieldValue
b) <- [(String, VarFieldValue)]
fls]]