{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE Safe #-}
module BroadcastChan.Throw
( BChanError(..)
, readBChan
, tryReadBChan
, writeBChan
, BroadcastChan
, Direction(..)
, In
, Out
, newBroadcastChan
, newBChanListener
, closeBChan
, isClosedBChan
, getBChanContents
, Action(..)
, Handler(..)
, parMapM_
, parFoldMap
, parFoldMapM
, foldBChan
, foldBChanM
) where
import Control.Monad (when)
import Control.Monad.IO.Unlift (MonadIO(..))
import Control.Exception (Exception, throwIO)
import Data.Typeable (Typeable)
import BroadcastChan hiding (writeBChan, readBChan, tryReadBChan)
import qualified BroadcastChan as Internal
data BChanError
= WriteFailed
| ReadFailed
deriving (BChanError -> BChanError -> Bool
(BChanError -> BChanError -> Bool)
-> (BChanError -> BChanError -> Bool) -> Eq BChanError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BChanError -> BChanError -> Bool
== :: BChanError -> BChanError -> Bool
$c/= :: BChanError -> BChanError -> Bool
/= :: BChanError -> BChanError -> Bool
Eq, ReadPrec [BChanError]
ReadPrec BChanError
Int -> ReadS BChanError
ReadS [BChanError]
(Int -> ReadS BChanError)
-> ReadS [BChanError]
-> ReadPrec BChanError
-> ReadPrec [BChanError]
-> Read BChanError
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS BChanError
readsPrec :: Int -> ReadS BChanError
$creadList :: ReadS [BChanError]
readList :: ReadS [BChanError]
$creadPrec :: ReadPrec BChanError
readPrec :: ReadPrec BChanError
$creadListPrec :: ReadPrec [BChanError]
readListPrec :: ReadPrec [BChanError]
Read, Int -> BChanError -> ShowS
[BChanError] -> ShowS
BChanError -> String
(Int -> BChanError -> ShowS)
-> (BChanError -> String)
-> ([BChanError] -> ShowS)
-> Show BChanError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BChanError -> ShowS
showsPrec :: Int -> BChanError -> ShowS
$cshow :: BChanError -> String
show :: BChanError -> String
$cshowList :: [BChanError] -> ShowS
showList :: [BChanError] -> ShowS
Show, Typeable)
instance Exception BChanError
readBChan :: MonadIO m => BroadcastChan Out a -> m a
readBChan :: forall (m :: * -> *) a. MonadIO m => BroadcastChan Out a -> m a
readBChan BroadcastChan Out a
ch = do
Maybe a
result <- BroadcastChan Out a -> m (Maybe a)
forall (m :: * -> *) a.
MonadIO m =>
BroadcastChan Out a -> m (Maybe a)
Internal.readBChan BroadcastChan Out a
ch
case Maybe a
result of
Maybe a
Nothing -> IO a -> m a
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO a -> m a) -> IO a -> m a
forall a b. (a -> b) -> a -> b
$ BChanError -> IO a
forall e a. Exception e => e -> IO a
throwIO BChanError
ReadFailed
Just a
x -> a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
{-# INLINE readBChan #-}
tryReadBChan :: MonadIO m => BroadcastChan Out a -> m (Maybe a)
tryReadBChan :: forall (m :: * -> *) a.
MonadIO m =>
BroadcastChan Out a -> m (Maybe a)
tryReadBChan BroadcastChan Out a
ch = do
Maybe (Maybe a)
result <- BroadcastChan Out a -> m (Maybe (Maybe a))
forall (m :: * -> *) a.
MonadIO m =>
BroadcastChan Out a -> m (Maybe (Maybe a))
Internal.tryReadBChan BroadcastChan Out a
ch
case Maybe (Maybe a)
result of
Maybe (Maybe a)
Nothing -> Maybe a -> m (Maybe a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
forall a. Maybe a
Nothing
Just Maybe a
Nothing -> IO (Maybe a) -> m (Maybe a)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Maybe a) -> m (Maybe a)) -> IO (Maybe a) -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ BChanError -> IO (Maybe a)
forall e a. Exception e => e -> IO a
throwIO BChanError
ReadFailed
Just Maybe a
v -> Maybe a -> m (Maybe a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
v
{-# INLINE tryReadBChan #-}
writeBChan :: MonadIO m => BroadcastChan In a -> a -> m ()
writeBChan :: forall (m :: * -> *) a.
MonadIO m =>
BroadcastChan In a -> a -> m ()
writeBChan BroadcastChan In a
ch a
val = do
Bool
success <- BroadcastChan In a -> a -> m Bool
forall (m :: * -> *) a.
MonadIO m =>
BroadcastChan In a -> a -> m Bool
Internal.writeBChan BroadcastChan In a
ch a
val
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool -> Bool
not Bool
success) (m () -> m ()) -> (IO () -> m ()) -> IO () -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ BChanError -> IO ()
forall e a. Exception e => e -> IO a
throwIO BChanError
WriteFailed
{-# INLINE writeBChan #-}