#5104: Improve the API for TChan, TMVar, and TVar
---------------------------------+------------------------------------------
Reporter: WrenThornton | Owner:
Type: task | Status: new
Priority: normal | Component: libraries (other)
Version: 7.0.3 | Keywords:
Testcase: | Blockedby:
Os: Unknown/Multiple | Blocking:
Architecture: Unknown/Multiple | Failure: None/Unknown
---------------------------------+------------------------------------------
Apply the patch for the proposal, reproduced at bottom. This proposal was
discussed on the mailing list,
[http://www.haskell.org/pipermail/libraries/2011-March/016086.html].
Supported by Edward Z. Yang, Bas van Dijk(*), Antoine Latter. No dissent.
Bas van Dijk's support is generally contingent on further improving the
overall API by adding similar functions for the non-STM concurrency types.
However, doing so requires a deprecation cycle in order to bring
modifyMVar in sync with modifyTVar, modifyIORef, and the rest of the
Haskell ecosystem. And therefore should be pursued in a separate proposal.
He offered a patch,
[http://www.haskell.org/pipermail/libraries/2011-March/016096.html], which
still requires verification of correctness. These changes to the base
package are not included in the current proposal.
----
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.
{{{
-- | A version of 'readTChan' which does not retry. Instead it
-- returns @Nothing@ if no value is available.
tryReadTChan :: TChan a -> STM (Maybe a)
-- | Get the next value from the @TChan@ without removing it,
-- retrying if the channel is empty.
peekTChan :: TChan a -> STM a
-- | A version of 'peekTChan' which does not retry. Instead it
-- returns @Nothing@ if no value is available.
tryPeekTChan :: TChan a -> STM (Maybe a)
-- | A version of 'readTMVar' which does not retry. Instead it
-- returns @Nothing@ if no value is available.
tryReadTMVar :: TMVar a -> STM (Maybe a)
-- Like 'modifyIORef' but for @TVar@.
-- | Mutate the contents of a @TVar@. /N.B./, this version is
-- non-strict.
modifyTVar :: TVar a -> (a -> a) -> STM ()
-- | Strict version of 'modifyTVar'.
modifyTVar' :: TVar a -> (a -> a) -> STM ()
-- Like 'swapTMVar' but for @TVar@.
-- | Swap the contents of a @TVar@ for a new value.
swapTVar :: TVar a -> a -> STM a
}}}
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/5104>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs