module EVM.Demand (demand) where import Control.DeepSeq (NFData, force) import Control.Exception.Base (evaluate) import Control.Monad.IO.Class (MonadIO, liftIO) -- | This is an easy way to force full evaluation of a value inside of -- the IO monad, being essentially just the composition of @evaluate@ -- and @force@. demand :: (MonadIO m, NFData a) => a -> m () demand :: a -> m () demand x :: a x = do a _ <- IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (a -> IO a forall a. a -> IO a evaluate (a -> a forall a. NFData a => a -> a force a x)) () -> m () forall (m :: * -> *) a. Monad m => a -> m a return ()