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 ()