module Control.Concurrent.ExceptionCollection

    ( ExceptionCollection(..)

    , createExceptionCollection

    , logException

    , readExceptions

    , collectExceptions

    , hasExceptions

    ) where



import Control.Concurrent.MVar



data ExceptionCollection e = ExceptionCollection (MVar [e])





createExceptionCollection :: IO (ExceptionCollection e)

createExceptionCollection

    = do

        exceptionsM <- newMVar []

        return (ExceptionCollection exceptionsM)



        

logException :: ExceptionCollection e

             -> e

             -> IO ()

logException (ExceptionCollection exceptionsM) e

    = do

        raisedExceptions <- takeMVar exceptionsM

        putMVar exceptionsM (raisedExceptions ++ [e])





hasExceptions :: ExceptionCollection e

              -> IO Bool

hasExceptions (ExceptionCollection exceptionsM)

    = do

        raisedExceptions <- readMVar exceptionsM

        return (not $ null raisedExceptions)





readExceptions :: ExceptionCollection e

               -> IO [e]

readExceptions (ExceptionCollection exceptionsM)

    = readMVar exceptionsM

    



collectExceptions :: ExceptionCollection e

                  -> IO [e]

collectExceptions (ExceptionCollection exceptionsM)

    = do

        raisedExceptions <- takeMVar exceptionsM

        putMVar exceptionsM []

        return raisedExceptions