module Control.Concurrent.SafePrint where import Control.Concurrent.MVar type SafePrintToken = MVar () createSafePrintToken :: IO SafePrintToken createSafePrintToken = newMVar () safePrint :: SafePrintToken -> String -> IO () safePrint safePrintToken message = do takeMVar safePrintToken putStr message putMVar safePrintToken () safePrintLn :: SafePrintToken -> String -> IO () safePrintLn safePrintToken message = do takeMVar safePrintToken putStrLn message putMVar safePrintToken ()