
I've found the following functions helpful for working with STM. Some of them are just filling out the API so that TVars, TMVars, and IORefs match better. And all the non-TVar functions can be optimized considerably by including them in the STM library rather than defining them externally. The implementations are obvious, so I'll just include the types here; see the patch if you're interested. -- | Non-blocking version of 'readTChan'. tryReadTChan :: TChan a -> STM (Maybe a) -- | Get the next value from the 'TChan' without removing it, -- blocking if the channel is empty. peekTChan :: TChan a -> STM a -- | Non-blocking version of 'peekTChan'. tryPeekTChan :: TChan a -> STM (Maybe a) -- | Non-blocking version of 'readTMVar'. tryReadTMVar :: TMVar a -> STM (Maybe a) -- | Like 'modifyIORef' but for 'TVar'. modifyTVar :: TVar a -> (a -> a) -> STM () -- | Strict version of 'modifyTVar'. modifyTVar' :: TVar a -> (a -> a) -> STM () -- | Like 'swapTMVar' but for 'TVar'. swapTVar :: TVar a -> a -> STM a Discussion period: 2 weeks. -- Live well, ~wren