module HsDev.Database.Async ( update, wait, module Data.Async ) where import Control.Concurrent.MVar import Control.Monad.IO.Class (MonadIO(..)) import Control.DeepSeq (force) import Data.Async import HsDev.Database (Database) update :: MonadIO m => Async Database -> m Database -> m () update db act = do db' <- act force db' `seq` liftIO (modifyAsync db (Append db')) -- | This function is used to ensure that all previous updates were applied wait :: MonadIO m => Async Database -> m () wait db = liftIO $ do waitVar <- newEmptyMVar modifyAsync db (Action $ \d -> putMVar waitVar () >> return d) takeMVar waitVar