{-# OPTIONS_GHC -cpp -fglasgow-exts #-} import Data.Array.IO import Data.Array.Base import Control.Concurrent.Locking type WithLocking1 (a :: * -> * -> *) e m = WithLocking (a e m) type WithLocking2 (a :: * -> * -> *) = WithLocking1 a 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