module DPut where import Control.Concurrent.STM import qualified Data.Map.Strict as Map import System.IO (stderr,hPutStrLn) import Data.Maybe import System.IO.Unsafe (unsafePerformIO) data DebugTag = XAnnounce | XDHT | XOnion | XNetCrypto | XPing | XMisc deriving (Eq,Ord,Show,Read) {-# NOINLINE verbosityMap #-} verbosityMap :: TVar (Map.Map DebugTag Bool) verbosityMap = unsafePerformIO $ newTVarIO (Map.empty) dput :: DebugTag -> String -> IO () dput tag msg = do mp <- atomically $ readTVar verbosityMap if fromMaybe True (Map.lookup tag mp) then System.IO.hPutStrLn stderr msg else return () setQuiet :: DebugTag -> IO () setQuiet tag = atomically $ modifyTVar' (verbosityMap) (Map.insert tag False) setVerbose :: DebugTag -> IO () setVerbose tag = atomically $ modifyTVar' (verbosityMap) (Map.insert tag True)