import GHC.Exts (build)
#endif
+#if defined(__GLASGOW_HASKELL__)
+import GHC.Arr
+#elif defined(__HUGS__)
+import Hugs.Array
+#endif
+
-- | Data structures that can be folded.
--
-- Minimal complete definition: 'foldMap' or 'foldr'.
foldr1 = Prelude.foldr1
foldl1 = Prelude.foldl1
+#ifndef __NHC__
+instance Ix i => Foldable (Array i) where
+ foldr f z = Prelude.foldr f z . elems
+#endif
+
-- | Fold over the elements of a structure,
-- associating to the right, but strictly.
foldr' :: Foldable t => (a -> b -> b) -> b -> t a -> b
import Data.Foldable (Foldable())
import Data.Monoid (Monoid)
+#if defined(__GLASGOW_HASKELL__)
+import GHC.Arr
+#elif defined(__HUGS__)
+import Hugs.Array
+#endif
+
-- | Functors representing data structures that can be traversed from
-- left to right.
--
mapM = Prelude.mapM
+#ifndef __NHC__
+instance Ix i => Traversable (Array i) where
+ traverse f arr = listArray (bounds arr) `fmap` traverse f (elems arr)
+#endif
+
-- general functions
-- | 'for' is 'traverse' with its arguments flipped.
-- These imports are so we can define Typeable instances
-- It'd be better to give Typeable instances in the modules themselves
-- but they all have to be compiled before Typeable
-import GHC.IOBase ( IO, MVar, Handle, block )
+import GHC.IOBase ( IOArray, IO, MVar, Handle, block )
import GHC.ST ( ST )
import GHC.STRef ( STRef )
import GHC.Ptr ( Ptr, FunPtr )
import Hugs.IOExts ( unsafePerformIO )
-- For the Typeable instance
import Hugs.Array ( Array )
+import Hugs.IOArray
import Hugs.ConcBase ( MVar )
#endif
#ifdef __NHC__
-import NHC.IOExtras (IORef,newIORef,readIORef,writeIORef,unsafePerformIO)
+import NHC.IOExtras (IOArray,IORef,newIORef,readIORef,writeIORef,unsafePerformIO)
import IO (Handle)
import Ratio (Ratio)
-- For the Typeable instance
INSTANCE_TYPEABLE1(MVar,mvarTc,"MVar" )
#endif
--- Types defined in GHC.Arr
INSTANCE_TYPEABLE2(Array,arrayTc,"Array")
+INSTANCE_TYPEABLE2(IOArray,iOArrayTc,"IOArray")
#ifdef __GLASGOW_HASKELL__
-- Hugs has these too, but their Typeable<n> instances are defined