Skip to content

Instantly share code, notes, and snippets.

@jaspervdj
Created October 1, 2013 13:36
Show Gist options
  • Save jaspervdj/6778541 to your computer and use it in GitHub Desktop.
Save jaspervdj/6778541 to your computer and use it in GitHub Desktop.
Close resources in Haskell in a more-or-less safe way.
import Control.Monad (unless)
import Data.IORef
data Resource = Resource
{ resourceName :: String
, resourceClosed :: IORef Bool
}
mkResource :: String -> IO Resource
mkResource name = do
closed <- newIORef False
let rs = Resource name closed
_ <- mkWeakIORef closed (closeResource rs)
return rs
closeResource :: Resource -> IO ()
closeResource rs = do
putStrLn $ "closeResource: closing " ++ resourceName rs
needToClose <- atomicModifyIORef (resourceClosed rs) $ \closed ->
if closed then (True, False) else (True, True)
if needToClose
then putStrLn "closeResource: now closing"
else putStrLn "closeResource: already closed!"
main :: IO ()
main = do
rs <- mkResource "test"
loop
closeResource rs
where
loop = do
ln <- getLine
unless (ln == "") $ do
putStrLn $ "Yeah, " ++ ln
loop
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment