module Network.AMQP.Helpers where
import Control.Exception
import Control.Concurrent.Chan
import Control.Concurrent.MVar
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString.Lazy.Char8 as BL
import Control.Applicative
toStrict :: BL.ByteString -> BS.ByteString
toStrict x = BS.concat $ BL.toChunks x
toLazy :: BS.ByteString -> BL.ByteString
toLazy x = BL.fromChunks [x]
data Lock = Lock (MVar Bool) (MVar ())
newLock = do
a <- newMVar False
b <- newMVar ()
return $ Lock a b
openLock :: Lock -> IO ()
openLock (Lock a b) = do
tryPutMVar b ()
return ()
closeLock :: Lock -> IO ()
closeLock (Lock a b) = do
withMVar a $ \killed ->
if killed
then return ()
else tryTakeMVar b >> return ()
return ()
waitLock (Lock a b) = readMVar b
killLock (Lock a b) = do
modifyMVar_ a $ \x -> return True
tryPutMVar b ()