module Control.Concurrent.Chan.Extended ( module Control.Concurrent.Chan , withMapChan ) where import qualified Control.Concurrent.Async as Async import Control.Concurrent.Chan import Control.Monad (forever) withMapChan :: (a -> b) -> Chan a -> (Chan b -> IO r) -> IO r withMapChan :: forall a b r. (a -> b) -> Chan a -> (Chan b -> IO r) -> IO r withMapChan a -> b f Chan a chan Chan b -> IO r cont = do new <- IO (Chan b) forall a. IO (Chan a) newChan Async.withAsync (forever $ readChan chan >>= writeChan new . f) (\Async (ZonkAny 0) _ -> Chan b -> IO r cont Chan b new)