home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / hugs_1 / !Hugs_lib_Array < prev    next >
Encoding:
Text File  |  1996-08-12  |  2.6 KB  |  66 lines

  1. -----------------------------------------------------------------------------
  2. -- Standard Library: Array operations
  3. --
  4. -- Suitable for use with Hugs 1.3.
  5. -----------------------------------------------------------------------------
  6.  
  7. module Array where
  8.  
  9. infixl 9  !, //
  10.  
  11. data Array a b -- Arrays are implemented as a primitive type
  12.  
  13. array          :: Ix a => (a,a) -> [(a,b)] -> Array a b
  14. listArray      :: Ix a => (a,a) -> [b] -> Array a b
  15. (!)           :: Ix a => Array a b -> a -> b
  16. bounds         :: Ix a => Array a b -> (a,a)
  17. indices        :: Ix a => Array a b -> [a]
  18. elems          :: Ix a => Array a b -> [b]
  19. assocs           :: Ix a => Array a b -> [(a,b)]
  20. accumArray     :: Ix a => (b -> c -> b) -> b -> (a,a) -> [(a,c)] -> Array a b
  21. (//)           :: Ix a => Array a b -> [(a,b)] -> Array a b
  22. accum          :: Ix a => (b -> c -> b) -> Array a b -> [(a,c)] -> Array a b
  23. amap           :: Ix a => (b -> c) -> Array a b -> Array a c
  24. ixmap           :: (Ix a, Ix b) => (a,a) -> (a -> b) -> Array b c -> Array a c
  25.  
  26. primitive primArray  :: [(a,b)] -> (a,a) -> (a -> Int) -> Array a b
  27. primitive primUpdate :: [(a,b)] -> Array a b -> (a -> Int) -> Array a b
  28. primitive primAccum
  29.     :: [(a,c)] -> Array a b -> (b -> c -> b) -> (a -> Int) -> Array a b
  30. primitive primAccumArray
  31.     :: [(a,c)] -> (a,a) -> b -> (b -> c -> b) -> (a -> Int) -> Array a b
  32. primitive primSubscript
  33.     :: ((a,a) -> a -> Int) -> Array a b -> a -> b
  34.  
  35. primitive primBounds :: Array a b -> (a,a)
  36. primitive primElems  :: Array a b -> [b]
  37. primitive primAmap   :: (b -> c) -> Array a b -> Array a c
  38.  
  39. array bounds assocs = primArray assocs bounds (index bounds)
  40. listArray b vs      = array b (zip (range b) vs)
  41. (!)                 = primSubscript index
  42. bounds              = primBounds
  43. indices          = range . bounds
  44. elems               = primElems
  45. assocs a            = zip (indices a) (elems a)
  46. accumArray f z b as = primAccumArray as b z f (index b)
  47. a // as             = primUpdate as a (index (bounds a))
  48. accum f a as        = primAccum as a f (index (bounds a))
  49. amap                = primAmap
  50. ixmap b f a         = array b [ (i, a ! f i) | i <- range b ]
  51.  
  52. instance (Ix a, Eq b) => Eq (Array a b) where
  53.     a == a'   =   assocs a == assocs a'
  54.  
  55. instance (Ix a, Ord b) => Ord (Array a b) where
  56.     a <= a'   =   assocs a <= assocs a'
  57.  
  58. instance (Ix a, Show a, Show b) => Show (Array a b) where
  59.     showsPrec p a = showParen (p > 9) (
  60.                        showString "array " .
  61.                        shows (bounds a)    .
  62.                showChar ' '        .
  63.                        shows (assocs a))
  64.  
  65. -----------------------------------------------------------------------------
  66.