packages feed

proplang-0.1: PropLang/Value.hs

-----------------------------------------------------------------------------
-- |
-- Module      :  Value.hs
-- Copyright   :  (c) Neil Mitchell 2007
-- License     :
--
-- Maintainer  :
-- Stability   :  unstable
-- Portability :  not portable
--
-- Defines PropLang values for use in Variables
--
-----------------------------------------------------------------------------

module PropLang.Value(
    Value(..), newValueIORef, newPredValue
    ) where

import PropLang.Event
import Data.IORef


data Value a = Value {valSet :: a -> IO (), valGet :: IO a}

newValueIORef :: (Eq a) => Event -> a -> IO (Value a)
newValueIORef e x = do
        i <- newIORef x
        return $ Value (setter i) (readIORef i)
    where
        setter i x = do
	    old <- readIORef i
	    writeIORef i x
	    if old /= x then do raise e
	                else do return ()

newPredValue :: (Eq a) => a -> (a -> Bool) -> Event -> IO (Value a)
newPredValue x f e = do
	i <- newIORef x
	return $ Value (setter i) (readIORef i)
    where
	setter i x = do
	    old <- readIORef i
	    writeIORef i x
	    if f x
		then raise e
		else return ()