Skip to content

Instantly share code, notes, and snippets.



Forked from scan/chan.hs
Last active Dec 11, 2015
What would you like to do?
import Control.Concurrent.Chan (Chan, newChan)
import qualified Data.Map as M
import Control.Concurrent.STM
import Control.Monad.Trans (MonadIO, liftIO)
import GHC.Conc (unsafeIOToSTM)
type Id = Integer
getOrCreateChannel :: (MonadIO m) => Id -> TVar (M.Map Id (Chan a)) -> m (Chan a)
getOrCreateChannel cid t = liftIO . atomically $ do
chans <- readTVar t
case M.lookup cid chans of
Just c -> return c
Nothing -> do
nchan <- unsafeIOToSTM newChan
writeTVar t $ M.insert cid nchan chans
return nchan
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.