{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE NoFieldSelectors #-}

module TypedSession.State.Render where

import Control.Algebra ((:+:))
import Control.Carrier.State.Strict (runState)
import Control.Carrier.Writer.Strict (runWriter)
import Control.Effect.State
import Control.Effect.Writer
import Control.Monad (when)
import Data.IntMap (IntMap)
import qualified Data.List as L
import Data.Sequence (Seq)
import Data.Set (Set)
import qualified TypedSession.State.Constraint as C
import TypedSession.State.Type
import TypedSession.State.Utils

data StringFill
  = CenterFill Int Char String
  | LeftAlign Int Char String
  deriving (Int -> StringFill -> ShowS
[StringFill] -> ShowS
StringFill -> String
(Int -> StringFill -> ShowS)
-> (StringFill -> String)
-> ([StringFill] -> ShowS)
-> Show StringFill
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> StringFill -> ShowS
showsPrec :: Int -> StringFill -> ShowS
$cshow :: StringFill -> String
show :: StringFill -> String
$cshowList :: [StringFill] -> ShowS
showList :: [StringFill] -> ShowS
Show)

runCenterFill :: String -> StringFill -> String
runCenterFill :: String -> StringFill -> String
runCenterFill String
startSt (CenterFill Int
centerPoint Char
c String
st) =
  let stlen :: Int
stlen = String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
st
      hlen :: Int
hlen = Int
stlen Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
2
      rplen :: Int
rplen = (Int
centerPoint Int -> Int -> Int
forall a. Num a => a -> a -> a
- String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
startSt) Int -> Int -> Int
forall a. Num a => a -> a -> a
- if Int -> Bool
forall a. Integral a => a -> Bool
odd Int
stlen then Int
hlen Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1 else Int
hlen
      rpSt :: String
rpSt = Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
rplen Char
c
   in String
startSt String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
rpSt String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
st
runCenterFill String
startSt v :: StringFill
v@(LeftAlign Int
leftAlignPoint Char
c String
st) =
  if Int
leftAlignPoint Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
startSt
    then ShowS
forall a. HasCallStack => String -> a
error ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String
"np: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
startSt String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" " String -> ShowS
forall a. [a] -> [a] -> [a]
++ StringFill -> String
forall a. Show a => a -> String
show StringFill
v
    else
      let repLen :: Int
repLen = Int
leftAlignPoint Int -> Int -> Int
forall a. Num a => a -> a -> a
- String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
startSt Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
          fillSt :: String
fillSt = Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
repLen Char
c
       in String
startSt String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
fillSt String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
st

getPoint :: StringFill -> Int
getPoint :: StringFill -> Int
getPoint = \case
  CenterFill Int
cp Char
_ String
_ -> Int
cp
  LeftAlign Int
lp Char
_ String
_ -> Int
lp

runCenterFills :: [StringFill] -> String
runCenterFills :: [StringFill] -> String
runCenterFills [StringFill]
ls =
  let ls' :: [StringFill]
ls' = (StringFill -> Int) -> [StringFill] -> [StringFill]
forall b a. Ord b => (a -> b) -> [a] -> [a]
L.sortOn StringFill -> Int
getPoint [StringFill]
ls
   in (String -> StringFill -> String)
-> String -> [StringFill] -> String
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' String -> StringFill -> String
runCenterFill String
"" [StringFill]
ls'

-- width :: Int
-- width = 30

-- leftWidth :: Int
-- leftWidth = 20

data StrFillEnv = StrFillEnv
  { StrFillEnv -> Int
width :: Int
  , StrFillEnv -> Int
leftWidth :: Int
  }
  deriving (Int -> StrFillEnv -> ShowS
[StrFillEnv] -> ShowS
StrFillEnv -> String
(Int -> StrFillEnv -> ShowS)
-> (StrFillEnv -> String)
-> ([StrFillEnv] -> ShowS)
-> Show StrFillEnv
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> StrFillEnv -> ShowS
showsPrec :: Int -> StrFillEnv -> ShowS
$cshow :: StrFillEnv -> String
show :: StrFillEnv -> String
$cshowList :: [StrFillEnv] -> ShowS
showList :: [StrFillEnv] -> ShowS
Show)

defaultStrFilEnv :: StrFillEnv
defaultStrFilEnv :: StrFillEnv
defaultStrFilEnv = Int -> Int -> StrFillEnv
StrFillEnv Int
30 Int
20

reSt :: StrFillEnv -> String -> String
reSt :: StrFillEnv -> ShowS
reSt StrFillEnv{Int
width :: StrFillEnv -> Int
width :: Int
width} String
st =
  let st' :: [String]
st' = String -> [String]
words String
st
   in case [String]
st' of
        [] -> ShowS
forall a. HasCallStack => String -> a
error String
"np"
        (String
x : [String]
_) ->
          let lv :: Int
lv = Int
width Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
6
           in if String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
lv
                then Int -> ShowS
forall a. Int -> [a] -> [a]
take (Int
lv Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
2) String
x String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
".."
                else String
x

--------------------------------------------
type XStringFill eta r bst =
  ( XMsg eta -> ([StringFill], Bool)
  , XLabel eta -> [StringFill]
  , XBranch eta -> [StringFill]
  , XBranchSt eta -> [StringFill]
  , XGoto eta -> [StringFill]
  , XTerminal eta -> [StringFill]
  )

renderXFold
  :: forall r eta bst sig m
   . ( Has (Writer [[StringFill]] :+: State Int) sig m
     , ForallX Show eta
     , Enum r
     , Bounded r
     , Show r
     , Show bst
     )
  => StrFillEnv -> XStringFill eta r bst -> XFold m eta r bst
renderXFold :: forall r eta bst (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Writer [[StringFill]] :+: State Int) sig m, ForallX Show eta,
 Enum r, Bounded r, Show r, Show bst) =>
StrFillEnv -> XStringFill eta r bst -> XFold m eta r bst
renderXFold StrFillEnv
sfe (XMsg eta -> ([StringFill], Bool)
xmsg, XLabel eta -> [StringFill]
xlabel, XBranch eta -> [StringFill]
xbranch, XBranchSt eta -> [StringFill]
_xbranchst, XGoto eta -> [StringFill]
xgoto, XTerminal eta -> [StringFill]
xterminal) =
  ( \(XMsg eta
xv, (String
con, [String]
_, r
_, r
_, Protocol eta r bst
_)) -> do
      indentVal <- forall s (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (State s) sig m =>
m s
get @Int
      let va = [Int -> Char -> String -> StringFill
LeftAlign (Int
indentVal Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
3) Char
' ' (StrFillEnv -> ShowS
reSt StrFillEnv
sfe String
con)]
          (xv', isFirst) = xmsg xv
      when isFirst (modify @Int (+ 1))
      tell [va ++ xv']
  , \(XLabel eta
xv, Int
i) -> [[StringFill]] -> m ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Writer w) sig m =>
w -> m ()
tell [[Int -> Char -> String -> StringFill
LeftAlign Int
1 Char
' ' (String
"LABEL " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
i)] [StringFill] -> [StringFill] -> [StringFill]
forall a. [a] -> [a] -> [a]
++ XLabel eta -> [StringFill]
xlabel XLabel eta
xv]
  , \(XBranch eta
xv, (r
r, [BranchSt eta r bst]
_)) -> do
      indentVal <- forall s (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (State s) sig m =>
m s
get @Int
      modify @Int (+ 1)
      tell [[LeftAlign (indentVal * 2 + 3) ' ' ("[Branch " ++ show r ++ "]")] ++ xbranch xv]
      pure (restoreWrapper @Int)
  , \(XBranchSt eta
_, (bst
_, Protocol eta r bst
_)) -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
  , \(XGoto eta
xv, Int
i) -> do
      indentVal <- forall s (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (State s) sig m =>
m s
get @Int
      tell [[LeftAlign (indentVal * 2 + 3) ' ' ("Goto " ++ show i)] ++ xgoto xv]
  , \XTerminal eta
xv -> do
      indentVal <- forall s (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (State s) sig m =>
m s
get @Int
      tell [[LeftAlign (indentVal * 2 + 3) ' ' "Terminal"] ++ xterminal xv]
  )

runRender
  :: forall r eta bst
   . (ForallX Show eta, Show bst, Enum r, Bounded r, Show r)
  => StrFillEnv -> XStringFill eta r bst -> Protocol eta r bst -> String
runRender :: forall r eta bst.
(ForallX Show eta, Show bst, Enum r, Bounded r, Show r) =>
StrFillEnv -> XStringFill eta r bst -> Protocol eta r bst -> String
runRender sfe :: StrFillEnv
sfe@(StrFillEnv{Int
width :: StrFillEnv -> Int
width :: Int
width, Int
leftWidth :: StrFillEnv -> Int
leftWidth :: Int
leftWidth}) XStringFill eta r bst
xst Protocol eta r bst
prot =
  [String] -> String
unlines
    ([String] -> String)
-> (StateC Int (WriterC [[StringFill]] Identity) () -> [String])
-> StateC Int (WriterC [[StringFill]] Identity) ()
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([StringFill] -> String) -> [[StringFill]] -> [String]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [StringFill] -> String
runCenterFills
    ([[StringFill]] -> [String])
-> (StateC Int (WriterC [[StringFill]] Identity) ()
    -> [[StringFill]])
-> StateC Int (WriterC [[StringFill]] Identity) ()
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([[StringFill]], (Int, ())) -> [[StringFill]]
forall a b. (a, b) -> a
fst
    (([[StringFill]], (Int, ())) -> [[StringFill]])
-> (StateC Int (WriterC [[StringFill]] Identity) ()
    -> ([[StringFill]], (Int, ())))
-> StateC Int (WriterC [[StringFill]] Identity) ()
-> [[StringFill]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Identity ([[StringFill]], (Int, ())) -> ([[StringFill]], (Int, ()))
forall a. Identity a -> a
run
    (Identity ([[StringFill]], (Int, ()))
 -> ([[StringFill]], (Int, ())))
-> (StateC Int (WriterC [[StringFill]] Identity) ()
    -> Identity ([[StringFill]], (Int, ())))
-> StateC Int (WriterC [[StringFill]] Identity) ()
-> ([[StringFill]], (Int, ()))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall w (m :: * -> *) a. Monoid w => WriterC w m a -> m (w, a)
runWriter @[[StringFill]]
    (WriterC [[StringFill]] Identity (Int, ())
 -> Identity ([[StringFill]], (Int, ())))
-> (StateC Int (WriterC [[StringFill]] Identity) ()
    -> WriterC [[StringFill]] Identity (Int, ()))
-> StateC Int (WriterC [[StringFill]] Identity) ()
-> Identity ([[StringFill]], (Int, ()))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s (m :: * -> *) a. s -> StateC s m a -> m (s, a)
runState @Int Int
0
    (StateC Int (WriterC [[StringFill]] Identity) () -> String)
-> StateC Int (WriterC [[StringFill]] Identity) () -> String
forall a b. (a -> b) -> a -> b
$ do
      let header :: [StringFill]
header =
            [Int -> Char -> String -> StringFill
CenterFill ((r -> Int
forall a. Enum a => a -> Int
fromEnum r
r Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
width Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
leftWidth) Char
'-' (r -> String
forall a. Show a => a -> String
show r
r) | r
r <- forall r. (Enum r, Bounded r) => [r]
rRange @r]
      [[StringFill]] -> StateC Int (WriterC [[StringFill]] Identity) ()
forall w (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has (Writer w) sig m =>
w -> m ()
tell [[StringFill]
header]
      (XFold (StateC Int (WriterC [[StringFill]] Identity)) eta r bst
-> Protocol eta r bst
-> StateC Int (WriterC [[StringFill]] Identity) ()
forall (m :: * -> *) eta r bst.
Monad m =>
XFold m eta r bst -> Protocol eta r bst -> m ()
xfold (StrFillEnv
-> XStringFill eta r bst
-> XFold (StateC Int (WriterC [[StringFill]] Identity)) eta r bst
forall r eta bst (sig :: (* -> *) -> * -> *) (m :: * -> *).
(Has (Writer [[StringFill]] :+: State Int) sig m, ForallX Show eta,
 Enum r, Bounded r, Show r, Show bst) =>
StrFillEnv -> XStringFill eta r bst -> XFold m eta r bst
renderXFold StrFillEnv
sfe XStringFill eta r bst
xst) Protocol eta r bst
prot)

data Tracer r bst
  = TracerProtocolCreat (Protocol Creat r bst)
  | TracerProtocolIdx (Protocol Idx r bst)
  | TracerReRank (IntMap Int)
  | TracerProtocolAddNum (Protocol AddNums r bst)
  | TracerProtocolGenConst (Protocol (GenConst r) r bst)
  | TracerConstraints (Seq C.Constraint)
  | TracerSubMap C.SubMap
  | TracerProtocolGenConstN (Protocol (GenConst r) r bst)
  | TracerCollectBranchDynVal (Set Int)
  | TracerProtocolMsgT (Protocol (MsgT r bst) r bst)
  | TracerProtocolMsgT1 (Protocol (MsgT1 r bst) r bst)

traceWrapper :: String -> String -> String
traceWrapper :: String -> ShowS
traceWrapper String
desc String
st =
  String
"--------------------"
    String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
desc
    String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"-----------------\n"
    String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
st
    String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"\n"

foo :: (Ord a) => a -> a -> [Char] -> a -> [Char]
foo :: forall a. Ord a => a -> a -> String -> a -> String
foo a
from a
to String
str a
i =
  if
    | a
i a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
from ->
        if a
from a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
to
          then String
"<-" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
str
          else String
str String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"->"
    | a
i a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
to ->
        if a
from a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
to
          then String
str String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"<-"
          else String
"->" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
str
    | Bool
otherwise -> String
str

rtops :: (Enum r) => StrFillEnv -> r -> Int
rtops :: forall r. Enum r => StrFillEnv -> r -> Int
rtops StrFillEnv{Int
width :: StrFillEnv -> Int
width :: Int
width, Int
leftWidth :: StrFillEnv -> Int
leftWidth :: Int
leftWidth} = ((Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
leftWidth) (Int -> Int) -> (r -> Int) -> r -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int
width Int -> Int -> Int
forall a. Num a => a -> a -> a
*) (Int -> Int) -> (r -> Int) -> r -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (Int -> Int) -> (r -> Int) -> r -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r -> Int
forall a. Enum a => a -> Int
fromEnum)

rRange :: forall r. (Enum r, Bounded r) => [r]
rRange :: forall r. (Enum r, Bounded r) => [r]
rRange = [forall a. Bounded a => a
minBound @r .. r
forall a. Bounded a => a
maxBound]

too :: forall r a. (Show a, Enum r, Bounded r) => StrFillEnv -> [a] -> [StringFill]
too :: forall r a.
(Show a, Enum r, Bounded r) =>
StrFillEnv -> [a] -> [StringFill]
too StrFillEnv
sfe [a]
xs = [Int -> Char -> String -> StringFill
CenterFill Int
ps Char
' ' (a -> String
forall a. Show a => a -> String
show a
v) | (a
v, Int
ps) <- [a] -> [Int] -> [(a, Int)]
forall a b. [a] -> [b] -> [(a, b)]
zip [a]
xs ([Int] -> [(a, Int)]) -> [Int] -> [(a, Int)]
forall a b. (a -> b) -> a -> b
$ (r -> Int) -> [r] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (StrFillEnv -> r -> Int
forall r. Enum r => StrFillEnv -> r -> Int
rtops StrFillEnv
sfe) (forall r. (Enum r, Bounded r) => [r]
rRange @r)]

stMsgT :: forall r bst. (Show bst, Ord r, Enum r, Bounded r) => StrFillEnv -> XStringFill (MsgT r bst) r bst
stMsgT :: forall r bst.
(Show bst, Ord r, Enum r, Bounded r) =>
StrFillEnv -> XStringFill (MsgT r bst) r bst
stMsgT StrFillEnv
sfe =
  let
   in ( \([T bst]
ls, (r
from, r
to), Int
idx) ->
          ( [ Int -> Char -> String -> StringFill
CenterFill Int
ps Char
' ' (String -> StringFill) -> String -> StringFill
forall a b. (a -> b) -> a -> b
$ r -> r -> String -> r -> String
forall a. Ord a => a -> a -> String -> a -> String
foo r
from r
to ((if (r
i, Int
idx) (r, Int) -> (r, Int) -> Bool
forall a. Eq a => a -> a -> Bool
== (r
from, Int
0) then ShowS
parensWarapper else ShowS
forall a. a -> a
id) ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ T bst -> String
forall a. Show a => a -> String
show T bst
v) r
i
            | (r
i, (Int
ps, T bst
v)) <- [r] -> [(Int, T bst)] -> [(r, (Int, T bst))]
forall a b. [a] -> [b] -> [(a, b)]
zip (forall r. (Enum r, Bounded r) => [r]
rRange @r) ([(Int, T bst)] -> [(r, (Int, T bst))])
-> [(Int, T bst)] -> [(r, (Int, T bst))]
forall a b. (a -> b) -> a -> b
$ [Int] -> [T bst] -> [(Int, T bst)]
forall a b. [a] -> [b] -> [(a, b)]
zip ((r -> Int) -> [r] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (StrFillEnv -> r -> Int
forall r. Enum r => StrFillEnv -> r -> Int
rtops StrFillEnv
sfe) (forall r. (Enum r, Bounded r) => [r]
rRange @r)) [T bst]
ls
            ]
          , Int
idx Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0
          )
      , \([T bst]
xs, Int
_) -> forall r a.
(Show a, Enum r, Bounded r) =>
StrFillEnv -> [a] -> [StringFill]
too @r StrFillEnv
sfe [T bst]
xs
      , \XBranch (MsgT r bst)
xs -> forall r a.
(Show a, Enum r, Bounded r) =>
StrFillEnv -> [a] -> [StringFill]
too @r StrFillEnv
sfe [T bst]
XBranch (MsgT r bst)
xs
      , \XBranchSt (MsgT r bst)
_ -> []
      , \([T bst]
xs, Int
_) -> forall r a.
(Show a, Enum r, Bounded r) =>
StrFillEnv -> [a] -> [StringFill]
too @r StrFillEnv
sfe [T bst]
xs
      , \XTerminal (MsgT r bst)
xs -> forall r a.
(Show a, Enum r, Bounded r) =>
StrFillEnv -> [a] -> [StringFill]
too @r StrFillEnv
sfe [T bst]
XTerminal (MsgT r bst)
xs
      )

parensWarapper :: String -> String
parensWarapper :: ShowS
parensWarapper String
st = String
"{" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
st String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"}"

instance (Show r, Show bst, Enum r, Bounded r, Eq r, Ord r) => Show (Tracer r bst) where
  show :: Tracer r bst -> String
show = \case
    TracerProtocolCreat Protocol Creat r bst
p -> String -> ShowS
traceWrapper String
"Creat" ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ Protocol Creat r bst -> String
forall a. Show a => a -> String
show Protocol Creat r bst
p
    TracerProtocolIdx Protocol Idx r bst
p -> String -> ShowS
traceWrapper String
"Idx" ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ Protocol Idx r bst -> String
forall a. Show a => a -> String
show Protocol Idx r bst
p
    TracerReRank IntMap Int
p -> String -> ShowS
traceWrapper String
"ReRank" ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ IntMap Int -> String
forall a. Show a => a -> String
show IntMap Int
p
    TracerProtocolAddNum Protocol AddNums r bst
p -> String -> ShowS
traceWrapper String
"AddNum" ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ Protocol AddNums r bst -> String
forall a. Show a => a -> String
show Protocol AddNums r bst
p
    TracerProtocolGenConst Protocol (GenConst r) r bst
p -> String -> ShowS
traceWrapper String
"GenConst" ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ Protocol (GenConst r) r bst -> String
forall a. Show a => a -> String
show Protocol (GenConst r) r bst
p
    TracerConstraints Seq Constraint
p -> String -> ShowS
traceWrapper String
"Constrains" ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ Seq Constraint -> String
forall a. Show a => a -> String
show Seq Constraint
p
    TracerSubMap IntMap Int
p -> String -> ShowS
traceWrapper String
"SubMap" ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ IntMap Int -> String
forall a. Show a => a -> String
show IntMap Int
p
    TracerProtocolGenConstN Protocol (GenConst r) r bst
p -> String -> ShowS
traceWrapper String
"GenConstN" ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ Protocol (GenConst r) r bst -> String
forall a. Show a => a -> String
show Protocol (GenConst r) r bst
p
    TracerCollectBranchDynVal Set Int
dvs -> String -> ShowS
traceWrapper String
"CollectBranchDynVal" ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ Set Int -> String
forall a. Show a => a -> String
show Set Int
dvs
    TracerProtocolMsgT Protocol (MsgT r bst) r bst
p -> String -> ShowS
traceWrapper String
"MsgT" ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ Protocol (MsgT r bst) r bst -> String
forall a. Show a => a -> String
show Protocol (MsgT r bst) r bst
p
    TracerProtocolMsgT1 Protocol (MsgT1 r bst) r bst
p -> String -> ShowS
traceWrapper String
"MsgT1" ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ Protocol (MsgT1 r bst) r bst -> String
forall a. Show a => a -> String
show Protocol (MsgT1 r bst) r bst
p