------------------------------------------------------------------------------

-- MVarUtils.hs
-- created: Mon May 10 15:11:12 JST 2010

------------------------------------------------------------------------------

-- | These functions were found to be useful for dealing with MVars. For more on MVars, see <http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Control-Concurrent-MVar.html>.

module Sound.Conductive.MVarUtils where

import Control.Concurrent.MVar

-- | Applies a pure function to the value stored in an MVar.

wm :: MVar a -> (a -> a1) -> IO a1
wm mvar func = do
    val <- readMVar mvar
    return $ func val

-- | Applies an IO function to the value stored in an MVar.

wIOm :: MVar a -> (a -> IO b) -> IO b
wIOm mvar func = do
    val <- readMVar mvar
    func val

-- | Changes the value stored in an MVar based on a pure function.

wcm :: MVar a -> (a -> a) -> IO a
wcm mvar func = do
    val <- readMVar mvar
    swapMVar mvar $ func val

-- | An alias for the wcm function.

withChangeToMVar :: MVar a -> (a -> a) -> IO a
withChangeToMVar mvar func = wcm mvar func