module Main where import Control.Applicative import Control.Monad import Data.IORRef import System.IOR gpair :: (RElem r0 rs, RElem r1 rs) => IORRef r0 a -> IORRef r1 b -> IOR r rs (IORRef r (a, b)) test1 :: IO () test2 :: IO () test3 :: IO () main :: IO () gpair v w = liftA2 (,) (readIORRef v) (readIORRef w) >>= newIORRef test1 = (print =<<) $ runIOR $ do r1 <- getIORTag a <- newIORRef 1 c <- newIOR $ do v <- readIORRef a b <- newIORRef 2 v' <- readIORRef b withIORTag r1 (newIORRef $ v + v') readIORRef c test2 = (print =<<) $ runIOR $ do v <- newIORRef 1 newIOR $ do w <- newIORRef 2 liftA2 (,) (gpair v w >>= readIORRef) (gpair w v >>= readIORRef) test3 = (print =<<) $ runIOR $ newIOR (newIORRef 1 >>= join gpair >>= readIORRef) main = do test1 test2 test3