Data.Array.Base

{-# LANGUAGE MultiParamTypeClasses #-}
module Data.Array.Base where
import Ix

infixl 9  !, //

class IArray a e where
    array     :: Ix i => (i, i) -> [(i, e)] -> a i e
    listArray :: Ix i => (i,i) -> [e] -> a i e
    bounds    :: Ix i => a i e -> (i,i)
    (!)       :: Ix i => a i e -> i -> e
    (//)      :: Ix i => a i e -> [(i, e)] -> a i e
    unsafeAt  :: a i e -> Int -> e

    listArray b vs = array b (zip (range b) vs)

amap f a         = listArray (bounds a) [f e|e<-elems a]

indices a        =  range (bounds a)
elems a          =  [a!i | i <- indices a]
assocs a         =  [(i,a!i) | i <- indices a]
ixmap b f a      = array b [(i, a ! f i) | i <- range b]
accumArray f z b =  accum f (array b [(i,z) | i <- range b])
--accum f        =  foldl (\a (i,v) -> a // [(i,f (a!i) v)])
accum f a ivs    =  a // [(i,f (a!i) v)|(i,v)<-ivs]