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
