{-# OPTIONS_GHC -cpp -fglasgow-exts #-} import Data.Array.IO import Data.Array.Base import Locking type WithLocking2 a e m = WithLocking (a e m) instance (MArray a e m) => (MArray (WithLocking2 a) e m) where newArray lu e = newArray lu e >>= addLocking newArray_ lu = newArray_ lu >>= addLocking unsafeRead = liftLock2 unsafeRead unsafeWrite = liftLock3 unsafeWrite main = do arr <- newArray (0,9) 0 >>= addLocking readArray arr 0 >>= writeArray arr 1