module GHC.Vis.GTK.Common (
visSignal,
visRunning,
visState,
visBoxes,
evaluate,
--printOne,
--printAll
)
where
import Control.Concurrent
import Control.DeepSeq
import Data.IORef
import System.IO.Unsafe
import GHC.Vis.Internal
import GHC.Vis.Types
import GHC.HeapView
visSignal :: MVar Signal
visSignal = unsafePerformIO (newEmptyMVar :: IO (MVar Signal))
visRunning :: MVar Bool
visRunning = unsafePerformIO (newMVar False)
visState :: IORef State
visState = unsafePerformIO $ newIORef $ State (0, 0) ListView
visBoxes :: MVar [(Box, String)]
visBoxes = unsafePerformIO (newMVar [] :: IO (MVar [(Box, String)]))
evaluate :: String -> IO ()
evaluate identifier = do (_,hm) <- printAll
show (map go hm) `deepseq` return ()
where go (Box a,(Just n, y)) | n == identifier = seq a (Just n, y)
| otherwise = (Just n, y)
go (_,(x,y)) = (x,y)
printAll :: IO (String, HeapMap)
printAll = do
bs <- readMVar visBoxes
(t,(_,h,_)) <- parseBoxesHeap bs
return (show t, h)