module GHC.Debug.Client.Search(module GHC.Debug.Client.Search, HeapGraph(..), HeapGraphEntry(..)) where

import GHC.Debug.Types
import GHC.Debug.Types.Graph
import qualified Data.IntMap as IM

-- Find all entries in the HeapGraph matching a specific predicate
findClosures :: (HeapGraphEntry a -> Bool) -> HeapGraph a -> [HeapGraphEntry a]
findClosures :: forall a.
(HeapGraphEntry a -> Bool) -> HeapGraph a -> [HeapGraphEntry a]
findClosures HeapGraphEntry a -> Bool
f = HeapGraph a -> [HeapGraphEntry a]
go
  where
    go :: HeapGraph a -> [HeapGraphEntry a]
go (HeapGraph NonEmpty ClosurePtr
_ IntMap (HeapGraphEntry a)
gs) =
      ([HeapGraphEntry a] -> HeapGraphEntry a -> [HeapGraphEntry a])
-> [HeapGraphEntry a]
-> IntMap (HeapGraphEntry a)
-> [HeapGraphEntry a]
forall a b. (a -> b -> a) -> a -> IntMap b -> a
IM.foldl' (\[HeapGraphEntry a]
hges HeapGraphEntry a
hge -> if HeapGraphEntry a -> Bool
f HeapGraphEntry a
hge then HeapGraphEntry a
hgeHeapGraphEntry a -> [HeapGraphEntry a] -> [HeapGraphEntry a]
forall a. a -> [a] -> [a]
:[HeapGraphEntry a]
hges else [HeapGraphEntry a]
hges) [] IntMap (HeapGraphEntry a)
gs

findConstructors :: String -> HeapGraph a -> [HeapGraphEntry a]
findConstructors :: forall a. String -> HeapGraph a -> [HeapGraphEntry a]
findConstructors String
con_name HeapGraph a
hg = (HeapGraphEntry a -> Bool) -> HeapGraph a -> [HeapGraphEntry a]
forall a.
(HeapGraphEntry a -> Bool) -> HeapGraph a -> [HeapGraphEntry a]
findClosures HeapGraphEntry a -> Bool
forall {a}. HeapGraphEntry a -> Bool
predicate HeapGraph a
hg
    where
      predicate :: HeapGraphEntry a -> Bool
predicate HeapGraphEntry a
h = DebugClosure PapHI ConstrDesc StackHI (Maybe ClosurePtr) -> Bool
forall {pap} {s} {b}. DebugClosure pap ConstrDesc s b -> Bool
checkConstrTable (HeapGraphEntry a
-> DebugClosure PapHI ConstrDesc StackHI (Maybe ClosurePtr)
forall a.
HeapGraphEntry a
-> DebugClosure PapHI ConstrDesc StackHI (Maybe ClosurePtr)
hgeClosure HeapGraphEntry a
h)

      checkConstrTable :: DebugClosure pap ConstrDesc s b -> Bool
checkConstrTable (ConstrClosure StgInfoTableWithPtr
_ [b]
_ [Word]
_ (ConstrDesc String
_ String
_ String
n)) = String
n String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
con_name
      checkConstrTable DebugClosure pap ConstrDesc s b
_ = Bool
False

findWithInfoTable :: InfoTablePtr -> HeapGraph a -> [HeapGraphEntry a]
findWithInfoTable :: forall a. InfoTablePtr -> HeapGraph a -> [HeapGraphEntry a]
findWithInfoTable InfoTablePtr
itp = (HeapGraphEntry a -> Bool) -> HeapGraph a -> [HeapGraphEntry a]
forall a.
(HeapGraphEntry a -> Bool) -> HeapGraph a -> [HeapGraphEntry a]
findClosures HeapGraphEntry a -> Bool
forall {a}. HeapGraphEntry a -> Bool
p
  where
    p :: HeapGraphEntry a -> Bool
p = (InfoTablePtr
itp InfoTablePtr -> InfoTablePtr -> Bool
forall a. Eq a => a -> a -> Bool
==) (InfoTablePtr -> Bool)
-> (HeapGraphEntry a -> InfoTablePtr) -> HeapGraphEntry a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StgInfoTableWithPtr -> InfoTablePtr
tableId (StgInfoTableWithPtr -> InfoTablePtr)
-> (HeapGraphEntry a -> StgInfoTableWithPtr)
-> HeapGraphEntry a
-> InfoTablePtr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DebugClosure PapHI ConstrDesc StackHI (Maybe ClosurePtr)
-> StgInfoTableWithPtr
forall pap string s b.
DebugClosure pap string s b -> StgInfoTableWithPtr
info (DebugClosure PapHI ConstrDesc StackHI (Maybe ClosurePtr)
 -> StgInfoTableWithPtr)
-> (HeapGraphEntry a
    -> DebugClosure PapHI ConstrDesc StackHI (Maybe ClosurePtr))
-> HeapGraphEntry a
-> StgInfoTableWithPtr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HeapGraphEntry a
-> DebugClosure PapHI ConstrDesc StackHI (Maybe ClosurePtr)
forall a.
HeapGraphEntry a
-> DebugClosure PapHI ConstrDesc StackHI (Maybe ClosurePtr)
hgeClosure