-- * Overloaded mutable array interface
module Data.Array.MArray,
+#ifdef __GLASGOW_HASKELL__
-- * Doing I\/O with @IOUArray@s
hGetArray, -- :: Handle -> IOUArray Int Word8 -> Int -> IO Int
hPutArray, -- :: Handle -> IOUArray Int Word8 -> Int -> IO ()
+#endif
) where
import Prelude
import Data.Word
import Data.Dynamic
+#ifdef __HUGS__
+import Hugs.IOArray
+import Hugs.IOExts ( unsafeCoerce )
+import Data.Array.Storable
+#endif
+
+#ifdef __GLASGOW_HASKELL__
import Foreign.C
import Foreign.Ptr ( Ptr, FunPtr )
import Foreign.StablePtr ( StablePtr )
-#ifdef __GLASGOW_HASKELL__
--- GHC only to the end of file
-
import Data.Array.Base
import GHC.Arr ( STArray, freezeSTArray, unsafeFreezeSTArray,
thawSTArray, unsafeThawSTArray )
import GHC.Conc
import GHC.Base
+#endif /* __GLASGOW_HASKELL__ */
+
+#ifdef __HUGS__
+instance HasBounds IOArray where
+ bounds = boundsIOArray
+
+instance MArray IOArray e IO where
+ newArray = newIOArray
+ unsafeRead = unsafeReadIOArray
+ unsafeWrite = unsafeWriteIOArray
+
+type IOUArray = StorableArray
+
+castIOUArray :: IOUArray i a -> IO (IOUArray i b)
+castIOUArray marr = return (unsafeCoerce marr)
+#endif /* __HUGS__ */
+
+iOArrayTc :: TyCon
+iOArrayTc = mkTyCon "IOArray"
+
+instance (Typeable a, Typeable b) => Typeable (IOArray a b) where
+ typeOf a = mkAppTy iOArrayTc [typeOf ((undefined :: IOArray a b -> a) a),
+ typeOf ((undefined :: IOArray a b -> b) a)]
+
+#ifdef __GLASGOW_HASKELL__
+-- GHC only to the end of file
-----------------------------------------------------------------------------
-- | Mutable, boxed, non-strict arrays in the 'IO' monad. The type
--
newtype IOArray i e = IOArray (STArray RealWorld i e) deriving Eq
-iOArrayTc :: TyCon
-iOArrayTc = mkTyCon "IOArray"
-
-instance (Typeable a, Typeable b) => Typeable (IOArray a b) where
- typeOf a = mkAppTy iOArrayTc [typeOf ((undefined :: IOArray a b -> a) a),
- typeOf ((undefined :: IOArray a b -> b) a)]
-
instance HasBounds IOArray where
{-# INLINE bounds #-}
bounds (IOArray marr) = bounds marr