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)