[project @ 1999-03-09 14:51:03 by sewardj]
[ghc-hetmet.git] / ghc / interpreter / lib / Array.hs
1 -----------------------------------------------------------------------------
2 -- Standard Library: Array operations
3 --
4 -- Suitable for use with Hugs 98
5 -----------------------------------------------------------------------------
6
7 module  Array ( 
8     module Ix,  -- export all of Ix 
9     Array, array, listArray, (!), bounds, indices, elems, assocs, 
10     accumArray, (//), accum, ixmap ) where
11
12 import Ix
13 import List( (\\) )
14
15 infixl 9  !, //
16
17 data Array ix elt = Array (ix,ix) (PrimArray elt)
18
19 array :: Ix a => (a,a) -> [(a,b)] -> Array a b
20 array ixs@(ix_start, ix_end) ivs = runST (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)
25   }
26   )
27  where
28   arrEleBottom = error "(Array.!): undefined array element"
29
30 listArray               :: Ix a => (a,a) -> [b] -> Array a b
31 listArray b vs          =  array b (zipWith (\ a b -> (a,b)) (range b) vs)
32
33 (!)                     :: Ix a => Array a b -> a -> b
34 (Array bounds arr) ! i  = primIndexArray arr (index bounds i)
35
36 bounds                  :: Ix a => Array a b -> (a,a)
37 bounds (Array b _)      =  b
38
39 indices           :: Ix a => Array a b -> [a]
40 indices           = range . bounds
41
42 elems             :: Ix a => Array a b -> [b]
43 elems a           =  [a!i | i <- indices a]
44
45 assocs            :: Ix a => Array a b -> [(a,b)]
46 assocs a          =  [(i, a!i) | i <- indices a]
47
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]]
51                          ++ us)
52
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)])
55
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])
58
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]
61
62
63 instance (Ix a) => Functor (Array a) where
64     fmap f a = array (bounds a) [(i, f(a!i)) | i <- indices a]
65
66 instance (Ix a, Eq b) => Eq (Array a b) where
67     a == a'   =   assocs a == assocs a'
68
69 instance (Ix a, Ord b) => Ord (Array a b) where
70     a <= a'   =   assocs a <= assocs a'
71
72
73 instance  (Ix a, Show a, Show b) => Show (Array a b)  where
74     showsPrec p a = showParen (p > 9) (
75                     showString "array " .
76                     shows (bounds a) . showChar ' ' .
77                     shows (assocs a)                  )
78
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,
82                                        (b,t)       <- reads s,
83                                        (as,u)      <- reads t   ])
84
85 -----------------------------------------------------------------------------