1 -----------------------------------------------------------------------------
2 -- Standard Library: Array operations
4 -- Suitable for use with Hugs 98
5 -----------------------------------------------------------------------------
8 module Ix, -- export all of Ix
9 Array, array, listArray, (!), bounds, indices, elems, assocs,
10 accumArray, (//), accum, ixmap ) where
17 data Array ix elt = Array (ix,ix) (PrimArray elt)
19 array :: Ix a => (a,a) -> [(a,b)] -> Array a b
20 array ixs@(ix_start, ix_end) ivs = primRunST (do
21 { mut_arr <- primNewArray (rangeSize ixs) arrEleBottom
22 ; mapM_ (\ (i,v) -> primWriteArray mut_arr (index ixs i) v) ivs
23 ; arr <- primUnsafeFreezeArray mut_arr
24 ; return (Array ixs arr)
28 arrEleBottom = error "(Array.!): undefined array element"
30 listArray :: Ix a => (a,a) -> [b] -> Array a b
31 listArray b vs = array b (zipWith (\ a b -> (a,b)) (range b) vs)
33 (!) :: Ix a => Array a b -> a -> b
34 (Array bounds arr) ! i = primIndexArray arr (index bounds i)
36 bounds :: Ix a => Array a b -> (a,a)
37 bounds (Array b _) = b
39 indices :: Ix a => Array a b -> [a]
40 indices = range . bounds
42 elems :: Ix a => Array a b -> [b]
43 elems a = [a!i | i <- indices a]
45 assocs :: Ix a => Array a b -> [(a,b)]
46 assocs a = [(i, a!i) | i <- indices a]
48 (//) :: Ix a => Array a b -> [(a,b)] -> Array a b
49 a // us = array (bounds a)
50 ([(i,a!i) | i <- indices a \\ [i | (i,_) <- us]]
53 accum :: Ix a => (b -> c -> b) -> Array a b -> [(a,c)] -> Array a b
54 accum f = foldl (\a (i,v) -> a // [(i,f (a!i) v)])
56 accumArray :: Ix a => (b -> c -> b) -> b -> (a,a) -> [(a,c)] -> Array a b
57 accumArray f z b = accum f (array b [(i,z) | i <- range b])
59 ixmap :: (Ix a, Ix b) => (a,a) -> (a -> b) -> Array b c -> Array a c
60 ixmap b f a = array b [(i, a ! f i) | i <- range b]
63 instance (Ix a) => Functor (Array a) where
64 fmap f a = array (bounds a) [(i, f(a!i)) | i <- indices a]
66 instance (Ix a, Eq b) => Eq (Array a b) where
67 a == a' = assocs a == assocs a'
69 instance (Ix a, Ord b) => Ord (Array a b) where
70 a <= a' = assocs a <= assocs a'
73 instance (Ix a, Show a, Show b) => Show (Array a b) where
74 showsPrec p a = showParen (p > 9) (
76 shows (bounds a) . showChar ' ' .
79 instance (Ix a, Read a, Read b) => Read (Array a b) where
80 readsPrec p = readParen (p > 9)
81 (\r -> [(array b as, u) | ("array",s) <- lex r,
85 -----------------------------------------------------------------------------