stack-1.6.1: src/Data/IORef/RunOnce.hs
{-# LANGUAGE NoImplicitPrelude #-}
module Data.IORef.RunOnce (runOnce) where
import Stack.Prelude
runOnce :: (MonadUnliftIO m, MonadIO n) => m a -> m (n a)
runOnce f = withRunInIO $ \run -> do
ref <- newIORef Nothing
return $ liftIO $ do
mval <- readIORef ref
case mval of
Just val -> return val
Nothing -> do
val <- run f
writeIORef ref (Just val)
return val