module Debug.Vampire.Trace (vNewExprStruct, vLog) where import Debug.Vampire.Data import Data.IORef import System.IO.Unsafe instance Show (a -> b) where show _ = "[function]" vNewExprStruct :: String -> IORef ExprStruct' vNewExprStruct expr = unsafePerformIO $ newIORef ExprStruct' {expr = expr, value = Nothing, children = []} {-# NOINLINE vNewExprStruct #-} vLog :: Show a => IORef ExprStruct' -> a -> IORef ExprStruct' -> a vLog parent result current = unsafePerformIO $ do modifyIORef' current $ \s -> s {value = Just (show result)} modifyIORef' parent $ \s@ExprStruct' {children = c} -> s {children = current:c} return result {-# NOINLINE vLog #-}