module Useful where import Data.IORef import Prelude import Test.Tasty.HUnit compareTest :: String -> ((String -> IO ()) -> IO r) -> IO r compareTest expected action = do resultsRef <- newIORef "" let appendStr :: String -> IO () appendStr s = modifyIORef resultsRef $ \t -> t ++ s r <- action appendStr found <- readIORef resultsRef assertEqual "" expected found return r withMessage :: Monad m => (String -> m ()) -> String -> m r -> m r withMessage appendStr s m = do appendStr $ "+" <> s r <- m appendStr $ "-" <> s return r