diff --git a/Data/Array/Base.hs b/Data/Array/Base.hs index d632e105d4f5e37466f2a492f9649c8b66802dad..ab41c0bb63a263c9ded31b1102f171b6d306c617 100644 --- a/Data/Array/Base.hs +++ b/Data/Array/Base.hs @@ -1390,7 +1390,11 @@ freeze marr = do -- use the safe array creation function here. return (listArray (l,u) es) +#if __GLASGOW_HASKELL__ >= 711 freezeSTUArray :: STUArray s i e -> ST s (UArray i e) +#else +freezeSTUArray :: Ix i => STUArray s i e -> ST s (UArray i e) +#endif freezeSTUArray (STUArray l u n marr#) = ST $ \s1# -> case sizeofMutableByteArray# marr# of { n# -> case newByteArray# n# s1# of { (# s2#, marr'# #) -> @@ -1465,7 +1469,11 @@ thaw arr = case bounds arr of | i <- [0 .. n - 1]] return marr +#if __GLASGOW_HASKELL__ >= 711 thawSTUArray :: UArray i e -> ST s (STUArray s i e) +#else +thawSTUArray :: Ix i => UArray i e -> ST s (STUArray s i e) +#endif thawSTUArray (UArray l u n arr#) = ST $ \s1# -> case sizeofByteArray# arr# of { n# -> case newByteArray# n# s1# of { (# s2#, marr# #) -> @@ -1525,7 +1533,11 @@ unsafeThaw :: (Ix i, IArray a e, MArray b e m) => a i e -> m (b i e) unsafeThaw = thaw {-# INLINE unsafeThawSTUArray #-} +#if __GLASGOW_HASKELL__ >= 711 unsafeThawSTUArray :: UArray i e -> ST s (STUArray s i e) +#else +unsafeThawSTUArray :: Ix i => UArray i e -> ST s (STUArray s i e) +#endif unsafeThawSTUArray (UArray l u n marr#) = return (STUArray l u n (unsafeCoerce# marr#)) @@ -1535,7 +1547,11 @@ unsafeThawSTUArray (UArray l u n marr#) = #-} {-# INLINE unsafeThawIOArray #-} +#if __GLASGOW_HASKELL__ >= 711 unsafeThawIOArray :: Arr.Array ix e -> IO (IOArray ix e) +#else +unsafeThawIOArray :: Ix ix => Arr.Array ix e -> IO (IOArray ix e) +#endif unsafeThawIOArray arr = stToIO $ do marr <- ArrST.unsafeThawSTArray arr return (IOArray marr) @@ -1544,7 +1560,11 @@ unsafeThawIOArray arr = stToIO $ do "unsafeThaw/IOArray" unsafeThaw = unsafeThawIOArray #-} +#if __GLASGOW_HASKELL__ >= 711 thawIOArray :: Arr.Array ix e -> IO (IOArray ix e) +#else +thawIOArray :: Ix ix => Arr.Array ix e -> IO (IOArray ix e) +#endif thawIOArray arr = stToIO $ do marr <- ArrST.thawSTArray arr return (IOArray marr) @@ -1553,7 +1573,11 @@ thawIOArray arr = stToIO $ do "thaw/IOArray" thaw = thawIOArray #-} +#if __GLASGOW_HASKELL__ >= 711 freezeIOArray :: IOArray ix e -> IO (Arr.Array ix e) +#else +freezeIOArray :: Ix ix => IOArray ix e -> IO (Arr.Array ix e) +#endif freezeIOArray (IOArray marr) = stToIO (ArrST.freezeSTArray marr) {-# RULES @@ -1561,7 +1585,11 @@ freezeIOArray (IOArray marr) = stToIO (ArrST.freezeSTArray marr) #-} {-# INLINE unsafeFreezeIOArray #-} +#if __GLASGOW_HASKELL__ >= 711 unsafeFreezeIOArray :: IOArray ix e -> IO (Arr.Array ix e) +#else +unsafeFreezeIOArray :: Ix ix => IOArray ix e -> IO (Arr.Array ix e) +#endif unsafeFreezeIOArray (IOArray marr) = stToIO (ArrST.unsafeFreezeSTArray marr) {-# RULES diff --git a/Data/Array/IO/Internals.hs b/Data/Array/IO/Internals.hs index a7883f3ade6252d5c8b7db1d533bb3f55690b384..c934cc5ccc8e1cda01884c5ab1efc559c5f2750b 100644 --- a/Data/Array/IO/Internals.hs +++ b/Data/Array/IO/Internals.hs @@ -34,6 +34,9 @@ import Control.Monad.ST ( RealWorld, stToIO ) import Foreign.Ptr ( Ptr, FunPtr ) import Foreign.StablePtr ( StablePtr ) +#if __GLASGOW_HASKELL__ < 711 +import Data.Ix +#endif import Data.Array.Base import GHC.IOArray (IOArray(..)) @@ -374,7 +377,11 @@ castIOUArray (IOUArray marr) = stToIO $ do return (IOUArray marr') {-# INLINE unsafeThawIOUArray #-} +#if __GLASGOW_HASKELL__ >= 711 unsafeThawIOUArray :: UArray ix e -> IO (IOUArray ix e) +#else +unsafeThawIOUArray :: Ix ix => UArray ix e -> IO (IOUArray ix e) +#endif unsafeThawIOUArray arr = stToIO $ do marr <- unsafeThawSTUArray arr return (IOUArray marr) @@ -383,7 +390,11 @@ unsafeThawIOUArray arr = stToIO $ do "unsafeThaw/IOUArray" unsafeThaw = unsafeThawIOUArray #-} +#if __GLASGOW_HASKELL__ >= 711 thawIOUArray :: UArray ix e -> IO (IOUArray ix e) +#else +thawIOUArray :: Ix ix => UArray ix e -> IO (IOUArray ix e) +#endif thawIOUArray arr = stToIO $ do marr <- thawSTUArray arr return (IOUArray marr) @@ -393,14 +404,22 @@ thawIOUArray arr = stToIO $ do #-} {-# INLINE unsafeFreezeIOUArray #-} +#if __GLASGOW_HASKELL__ >= 711 unsafeFreezeIOUArray :: IOUArray ix e -> IO (UArray ix e) +#else +unsafeFreezeIOUArray :: Ix ix => IOUArray ix e -> IO (UArray ix e) +#endif unsafeFreezeIOUArray (IOUArray marr) = stToIO (unsafeFreezeSTUArray marr) {-# RULES "unsafeFreeze/IOUArray" unsafeFreeze = unsafeFreezeIOUArray #-} +#if __GLASGOW_HASKELL__ >= 711 freezeIOUArray :: IOUArray ix e -> IO (UArray ix e) +#else +freezeIOUArray :: Ix ix => IOUArray ix e -> IO (UArray ix e) +#endif freezeIOUArray (IOUArray marr) = stToIO (freezeSTUArray marr) {-# RULES diff --git a/Data/Array/ST.hs b/Data/Array/ST.hs index 31e1ed0cb7ab05a08b2350e0226904c41350c75b..0a8ff0d3fa10166e5d686347e118798429584bfb 100644 --- a/Data/Array/ST.hs +++ b/Data/Array/ST.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE CPP #-} {-# LANGUAGE RankNTypes #-} ----------------------------------------------------------------------------- -- | @@ -37,8 +38,11 @@ import GHC.Arr ( STArray, Array, unsafeFreezeSTArray ) -- the array before returning it - it uses 'unsafeFreeze' internally, but -- this wrapper is a safe interface to that function. -- -runSTArray :: (forall s . ST s (STArray s i e)) - -> Array i e +#if __GLASGOW_HASKELL__ >= 711 +runSTArray :: (forall s . ST s (STArray s i e)) -> Array i e +#else +runSTArray :: Ix i => (forall s . ST s (STArray s i e)) -> Array i e +#endif runSTArray st = runST (st >>= unsafeFreezeSTArray) -- | A safe way to create and work with an unboxed mutable array before @@ -47,8 +51,11 @@ runSTArray st = runST (st >>= unsafeFreezeSTArray) -- 'unsafeFreeze' internally, but this wrapper is a safe interface to -- that function. -- -runSTUArray :: (forall s . ST s (STUArray s i e)) - -> UArray i e +#if __GLASGOW_HASKELL__ >= 711 +runSTUArray :: (forall s . ST s (STUArray s i e)) -> UArray i e +#else +runSTUArray :: Ix i => (forall s . ST s (STUArray s i e)) -> UArray i e +#endif runSTUArray st = runST (st >>= unsafeFreezeSTUArray)