%
-% (c) The AQUA Project, Glasgow University, 1994-1996
+% (c) The AQUA Project, Glasgow University, 1994-1999
%
\section[Array]{Module @Array@}
\begin{code}
{-# OPTIONS -fno-implicit-prelude #-}
-module Array (
- module Ix, -- export all of Ix
- Array, -- Array type is abstract
-
- array, listArray, (!), bounds, indices, elems, assocs,
- accumArray, (//), accum, ixmap
- ) where
+module Array
+
+ (
+ module Ix -- export all of Ix
+ , Array -- Array type is abstract
+
+ , array -- :: (Ix a) => (a,a) -> [(a,b)] -> Array a b
+ , listArray -- :: (Ix a) => (a,a) -> [b] -> Array a b
+ , (!) -- :: (Ix a) => Array a b -> a -> b
+ , bounds -- :: (Ix a) => Array a b -> (a,a)
+ , indices -- :: (Ix a) => Array a b -> [a]
+ , elems -- :: (Ix a) => Array a b -> [b]
+ , assocs -- :: (Ix a) => Array a b -> [(a,b)]
+ , accumArray -- :: (Ix a) => (b -> c -> b) -> b -> (a,a) -> [(a,c)] -> Array a b
+ , (//) -- :: (Ix a) => Array a b -> [(a,b)] -> Array a b
+ , accum -- :: (Ix a) => (b -> c -> b) -> Array a b -> [(a,c)] -> Array a b
+ , ixmap -- :: (Ix a, Ix b) => (a,a) -> (a -> b) -> Array b c -> Array a b
+
+ -- Array instances:
+ --
+ -- Ix a => Functor (Array a)
+ -- (Ix a, Eq b) => Eq (Array a b)
+ -- (Ix a, Ord b) => Ord (Array a b)
+ -- (Ix a, Show a, Show b) => Show (Array a b)
+ -- (Ix a, Read a, Read b) => Read (Array a b)
+ --
+
+ -- Implementation checked wrt. Haskell 98 lib report, 1/99.
+
+ ) where
import Ix
import PrelList
-import PrelRead
+import PrelShow
import PrelArr -- Most of the hard work is done here
import PrelBase
{-# INLINE assocs #-}
#endif
-{-# GENERATE_SPECS listArray a{~,Int,IPr} b{} #-}
+{-# SPECIALISE listArray :: (Int,Int) -> [b] -> Array Int b #-}
listArray :: (Ix a) => (a,a) -> [b] -> Array a b
-listArray b vs = array b (zipWith (\ a b -> (a,b)) (range b) vs)
+listArray b vs = array b (zip (range b) vs)
-{-# GENERATE_SPECS indices a{~,Int,IPr} b{} #-}
+{-# SPECIALISE indices :: Array Int b -> [Int] #-}
indices :: (Ix a) => Array a b -> [a]
indices = range . bounds
-{-# GENERATE_SPECS elems a{~,Int,IPr} b{} #-}
+{-# SPECIALISE elems :: Array Int b -> [b] #-}
elems :: (Ix a) => Array a b -> [b]
elems a = [a!i | i <- indices a]
-{-# GENERATE_SPECS assocs a{~,Int,IPr} b{} #-}
+{-# SPECIALISE assocs :: Array Int b -> [(Int,b)] #-}
assocs :: (Ix a) => Array a b -> [(a,b)]
assocs a = [(i, a!i) | i <- indices a]
-{-# GENERATE_SPECS amap a{~,Int,IPr} b{} c{} #-}
+{-# SPECIALISE amap :: (b -> c) -> Array Int b -> Array Int c #-}
amap :: (Ix a) => (b -> c) -> Array a b -> Array a c
amap f a = array b [(i, f (a!i)) | i <- range b]
where b = bounds a
\begin{code}
instance Ix a => Functor (Array a) where
- map = amap
+ fmap = amap
instance (Ix a, Eq b) => Eq (Array a b) where
a == a' = assocs a == assocs a'
shows (assocs a) )
showList = showList__ (showsPrec 0)
+{-
instance (Ix a, Read a, Read b) => Read (Array a b) where
readsPrec p = readParen (p > 9)
(\r -> [(array b as, u) | ("array",s) <- lex r,
(b,t) <- reads s,
(as,u) <- reads t ])
readList = readList__ (readsPrec 0)
+-}
\end{code}