3 module Ix, -- export all of Ix
4 Array, array, listArray, (!), bounds, indices, elems, assocs,
5 accumArray, (//), accum, ixmap ) where
19 data Array a b = MkArray (a,a) (a -> b) deriving ()
21 array :: (Ix a) => (a,a) -> [(a,b)] -> Array a b
23 if and [inRange b i | (i,_) <- ivs]
25 (\j -> case [v | (i,v) <- ivs, i == j] of
27 [] -> error "Array.!: \
28 \undefined array element"
29 _ -> error "Array.!: \
30 \multiply defined array element")
31 else error "Array.array: out-of-range array association"
33 listArray :: (Ix a) => (a,a) -> [b] -> Array a b
34 listArray b vs = array b (zipWith (\ a b -> (a,b)) (range b) vs)
36 (!) :: (Ix a) => Array a b -> a -> b
39 bounds :: (Ix a) => Array a b -> (a,a)
40 bounds (MkArray b _) = b
42 indices :: (Ix a) => Array a b -> [a]
43 indices = range . bounds
45 elems :: (Ix a) => Array a b -> [b]
46 elems a = [a!i | i <- indices a]
48 assocs :: (Ix a) => Array a b -> [(a,b)]
49 assocs a = [(i, a!i) | i <- indices a]
51 (//) :: (Ix a) => Array a b -> [(a,b)] -> Array a b
52 a // us = array (bounds a)
53 ([(i,a!i) | i <- indices a \\ [i | (i,_) <- us]]
56 accum :: (Ix a) => (b -> c -> b) -> Array a b -> [(a,c)]
58 accum f = foldl (\a (i,v) -> a // [(i,f (a!i) v)])
60 accumArray :: (Ix a) => (b -> c -> b) -> b -> (a,a) -> [(a,c)]
62 accumArray f z b = accum f (array b [(i,z) | i <- range b])
64 ixmap :: (Ix a, Ix b) => (a,a) -> (a -> b) -> Array b c
66 ixmap b f a = array b [(i, a ! f i) | i <- range b]
68 instance (Ix a) => Functor (Array a) where
69 map fn (MkArray b f) = MkArray b (fn . f)
71 #else /* STD_PRELUDE */
73 data Ix ix => Array ix elt = Array (ix,ix) (PrimArray elt)
74 data Ix ix => ByteArray ix = ByteArray (ix,ix) PrimByteArray
75 data Ix ix => MutableArray s ix elt = MutableArray (ix,ix) (PrimMutableArray s elt)
76 data Ix ix => MutableByteArray s ix = MutableByteArray (ix,ix) (PrimMutableByteArray s)
78 array :: (Ix a) => (a,a) -> [(a,b)] -> Array a b
79 array ixs@(ix_start, ix_end) ivs = runST (do
80 { mut_arr <- primNewArray (rangeSize ixs) arrEleBottom
81 ; mapM_ (\ (i,v) -> primWriteArray mut_arr (index ixs i) v) ivs
82 ; arr <- primUnsafeFreezeArray mut_arr
83 ; return (Array ixs arr)
87 arrEleBottom = error "(Array.!): undefined array element"
89 listArray :: (Ix a) => (a,a) -> [b] -> Array a b
90 listArray b vs = array b (zipWith (\ a b -> (a,b)) (range b) vs)
92 (!) :: (Ix a) => Array a b -> a -> b
93 (Array bounds arr) ! i = primIndexArray arr (index bounds i)
95 bounds :: (Ix a) => Array a b -> (a,a)
96 bounds (Array b _) = b
98 indices :: (Ix a) => Array a b -> [a]
99 indices = range . bounds
101 elems :: (Ix a) => Array a b -> [b]
102 elems a = [a!i | i <- indices a]
104 assocs :: (Ix a) => Array a b -> [(a,b)]
105 assocs a = [(i, a!i) | i <- indices a]
107 (//) :: (Ix a) => Array a b -> [(a,b)] -> Array a b
108 a // us = array (bounds a)
109 ([(i,a!i) | i <- indices a \\ [i | (i,_) <- us]]
112 accum :: (Ix a) => (b -> c -> b) -> Array a b -> [(a,c)]
114 accum f = foldl (\a (i,v) -> a // [(i,f (a!i) v)])
116 accumArray :: (Ix a) => (b -> c -> b) -> b -> (a,a) -> [(a,c)]
118 accumArray f z b = accum f (array b [(i,z) | i <- range b])
120 ixmap :: (Ix a, Ix b) => (a,a) -> (a -> b) -> Array b c
122 ixmap b f a = array b [(i, a ! f i) | i <- range b]
124 instance (Ix a) => Functor (Array a)
127 #endif /* STD_PRELUDE */
130 data PrimArray a -- immutable arrays with Int indices
133 data Ref s a -- mutable variables
134 data PrimMutableArray s a -- mutable arrays with Int indices
135 data PrimMutableByteArray s
137 ----------------------------------------------------------------
138 -- pointer equality tests:
139 ----------------------------------------------------------------
141 instance Eq (Ref s a) where (==) = primSameRef
142 instance Eq (PrimMutableArray s a) where (==) = primSameMutableArray
144 instance Eq (PrimMutableByteArray s) where (==) = primSameMutableByteArray
146 instance (Ix ix) => Eq (MutableArray s ix elt) where
147 MutableArray _ arr1 == MutableArray _ arr2 = arr1 == arr2
149 instance (Ix ix) => Eq (MutableByteArray s ix) where
150 MutableByteArray _ arr1 == MutableByteArray _ arr2 = arr1 == arr2
152 #endif /* PROVIDE_ARRAYS */
154 instance (Ix a, Eq b) => Eq (Array a b) where
155 a == a' = assocs a == assocs a'
157 instance (Ix a, Ord b) => Ord (Array a b) where
158 a <= a' = assocs a <= assocs a'
160 instance (Ix a, Show a, Show b) => Show (Array a b) where
161 showsPrec p a = showParen (p > 9) (
162 showString "array " .
163 shows (bounds a) . showChar ' ' .
166 instance (Ix a, Read a, Read b) => Read (Array a b) where
167 readsPrec p = readParen (p > 9)
168 (\r -> [(array b as, u) | ("array",s) <- lex r,