IOR-0.1: src/Example.hs
module Main where
import Control.Monad.Trans
import System.IOR
import System.IOR.Resource
-------------------------------------------------------------------------------
newtype P
= P String
openP :: String -> IO P
closeP :: P -> IO ()
writeP :: P -> String -> IO ()
openP s = do
putStrLn ("opening " ++ s)
return (P s)
closeP (P s) =
putStrLn ("closing " ++ s)
writeP (P s) msg =
putStrLn ("writing " ++ msg ++ " to " ++ s)
-------------------------------------------------------------------------------
newtype R r
= R (Resource r P)
openR :: String -> IOR r rs (R r)
closeR :: RElem r' rs => R r' -> IOR r rs ()
writeR :: RElem r' rs => R r' -> String -> IOR r rs ()
openR s = do
p <- liftIO (openP s)
fmap R (manage p closeP)
closeR (R r) =
release r
writeR (R r) msg =
liftIO (writeP (getResource r) msg)
-------------------------------------------------------------------------------
main :: IO ()
main = runIOR $ do
r <- getIORTag
res1a <- openR "res1a"
res1b <- openR "res1b"
newIOR $ do
res2a <- openR "res2a"
res1c <- withIORTag r $ openR "res1c"
writeR res1b "msg1"
closeR res1b
writeR res1c "msg2"
writeR res2a "msg3"
writeR res1a "msg4"