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 #-}