inc env = do n <- primTempl 0 raise env.setReader (\c -> primAct n (do v <- primGet env.putStr (show v) primSet (v+1))) struct Counter = read :: Request Int inc :: Action run proc env = do c <- proc c.inc c.inc v <- c.read env.putStr (show v) env.putStr "\n" counter = primTempl 0 raise >>= \r -> return {inc = primAct r (do v <- primGet primSet (v+1)); read = primReq r (do v <- primGet return v)} -- try setting O'Hugs toggle -f for this one... deadlock = primTempl 0 raise >>= \r -> return {inc = primAct r (do v <- primReq r primGet primSet (v+1)); read = primReq r (do v <- primGet return v)} deadlock2 = primTempl 0 raise >>= \r -> return {inc = primAct r ((do v <- primReq r primGet primSet (v+1)) `catch` (\err -> if err == Deadlock then primSet 35 else primSet 19)); read = primReq r (do v <- primGet return v)} reqfail = primTempl 0 raise >>= \r -> return {inc = primAct r (do v <- primGet primSet (v+1)); read = primReq r (do v <- primGet raise (FileError "") return v)} run2 proc env = do c <- proc c.inc c.inc (do v <- c.read env.putStr (show v) env.putStr "\n") `catch` (\_ -> env.putStr "aborted\n") cnt = template x := 0 in struct inc = action x := x+1 read = request return x