uni-util-2.2.0.0: Util/Store.hs
-- | A Store a contains an (a) value which is only to be computed once,
-- when it is first needed.
--
-- Perhaps we should use laziness and unsafePerformIO?
module Util.Store(
Store,
newStore, -- :: IO (Store a)
takeStore, -- :: IO a -> Store a -> IO a
) where
import Control.Concurrent.MVar
newtype Store a = Store (MVar (Maybe a))
newStore :: IO (Store a)
newStore =
do
mVar <- newMVar Nothing
return (Store mVar)
takeStore :: IO a -> Store a -> IO a
takeStore getA (Store mVar) =
modifyMVar
mVar
(\ aOpt -> case aOpt of
Just a -> return (aOpt,a)
Nothing ->
do
a <- getA
return (Just a,a)
)