----------------------------------------------------------------------------- -- Standard Library: Array operations -- -- Suitable for use with Hugs 98 -----------------------------------------------------------------------------
module Hugs.Array (
module Data.Ix, -- export all of Ix
unsafeIndex, unsafeRangeSize,
Array, array, listArray, (!), bounds, indices, elems, assocs,
accumArray, (//), accum, ixmap,
unsafeArray, unsafeAt, unsafeReplace, unsafeAccum, unsafeAccumArray
) where
import Data.Ix
import Hugs.Prelude( unsafeIndex, unsafeRangeSize )
infixl 9 !, //
data Array a b -- Arrays are implemented as a primitive type
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)]
(//) :: Ix a => Array a b -> [(a,b)] -> Array a b
accum :: Ix a => (b -> c -> b) -> Array a b -> [(a,c)] -> Array a b
accumArray :: Ix a => (b -> c -> b) -> b -> (a,a) -> [(a,c)] -> Array a b
ixmap :: (Ix a, Ix b) => (a,a) -> (a -> b) -> Array b c -> Array a c
primitive primArray :: (a,a) -> Int -> [(Int,b)] -> Array a b
primitive primUpdate :: [(Int,b)] -> Array a b -> Array a b
primitive primAccum :: [(Int,c)] -> Array a b -> (b -> c -> b) -> Array a b
primitive primAccumArray
:: (a,a) -> Int -> (b -> c -> b) -> b -> [(Int,c)] -> Array a b
primitive primSubscript :: Array a b -> Int -> b
primitive primBounds :: Array a b -> (a,a)
primitive primElems :: Array a b -> [b]
primitive primAmap :: (b -> c) -> Array a b -> Array a c
unsafeArray :: Ix i => (i,i) -> [(Int, e)] -> Array i e
unsafeArray bnds = primArray bnds (rangeSize bnds)
unsafeAt :: Ix i => Array i e -> Int -> e
unsafeAt = primSubscript
unsafeReplace :: Ix i => Array i e -> [(Int, e)] -> Array i e
unsafeReplace iarr ies = primUpdate ies iarr
unsafeAccum :: Ix i => (e -> a -> e) -> Array i e -> [(Int, a)] -> Array i e
unsafeAccum f iarr ies = primAccum ies iarr f
unsafeAccumArray :: Ix i => (e -> a -> e) -> e -> (i,i) -> [(Int, a)] -> Array i e
unsafeAccumArray f z bnds = primAccumArray bnds (rangeSize bnds) f z
indexAll :: Ix i => (i,i) -> [(i, a)] -> [(Int, a)]
indexAll bnds ivs = [(index bnds i,v) | (i,v) <- ivs]
array bnds = unsafeArray bnds . indexAll bnds
listArray bnds vs = unsafeArray bnds (zip [0..rangeSize bnds-1] vs)
arr!i = unsafeAt arr (index (bounds arr) i)
bounds = primBounds
indices = range . bounds
elems = primElems
assocs a = zip (indices a) (elems a)
accumArray f z bnds = unsafeAccumArray f z bnds . indexAll bnds
a // ivs = unsafeReplace a (indexAll (bounds a) ivs)
accum f a ivs = unsafeAccum f a (indexAll (bounds a) ivs)
ixmap bnds f arr =
unsafeArray bnds [(unsafeIndex bnds i, arr ! f i) | i <- range bnds]
instance (Ix a) => Functor (Array a) where
fmap = primAmap
instance (Ix a, Eq b) => Eq (Array a b) where
a == a' = assocs a == assocs a'
instance (Ix a, Ord b) => Ord (Array a b) where
a <= a' = assocs a <= assocs a'
instance (Ix a, Show a, Show b) => Show (Array a b) where
showsPrec p a = showParen (p > 9) (
showString "array " .
shows (bounds a) . showChar ' ' .
shows (assocs a) )
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 ])
-----------------------------------------------------------------------------
(HTML for this module was generated on 2006-08-12. About the conversion tool.)