module HGraph.Debugging 
       ( module HGraph.Debugging
       , sayString
       , sayErrString
       )
where

import Say
import Control.Exception
import Control.Concurrent.MVar

hasLocked :: String -> IO a -> IO a
hasLocked :: forall a. String -> IO a -> IO a
hasLocked String
msg IO a
action =
  IO a
action IO a -> [Handler a] -> IO a
forall a. IO a -> [Handler a] -> IO a
`catches`
  [ (BlockedIndefinitelyOnMVar -> IO a) -> Handler a
forall a e. Exception e => (e -> IO a) -> Handler a
Handler ((BlockedIndefinitelyOnMVar -> IO a) -> Handler a)
-> (BlockedIndefinitelyOnMVar -> IO a) -> Handler a
forall a b. (a -> b) -> a -> b
$ \exc :: BlockedIndefinitelyOnMVar
exc@BlockedIndefinitelyOnMVar
BlockedIndefinitelyOnMVar -> String -> IO ()
forall (m :: * -> *). MonadIO m => String -> m ()
sayString (String
"[MVar]: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
msg) IO () -> IO a -> IO a
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> BlockedIndefinitelyOnMVar -> IO a
forall e a. Exception e => e -> IO a
throwIO BlockedIndefinitelyOnMVar
exc
  , (BlockedIndefinitelyOnSTM -> IO a) -> Handler a
forall a e. Exception e => (e -> IO a) -> Handler a
Handler ((BlockedIndefinitelyOnSTM -> IO a) -> Handler a)
-> (BlockedIndefinitelyOnSTM -> IO a) -> Handler a
forall a b. (a -> b) -> a -> b
$ \exc :: BlockedIndefinitelyOnSTM
exc@BlockedIndefinitelyOnSTM
BlockedIndefinitelyOnSTM -> String -> IO ()
forall (m :: * -> *). MonadIO m => String -> m ()
sayString (String
"[STM]: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
msg) IO () -> IO a -> IO a
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> BlockedIndefinitelyOnSTM -> IO a
forall e a. Exception e => e -> IO a
throwIO BlockedIndefinitelyOnSTM
exc
  ]