home *** CD-ROM | disk | FTP | other *** search
/ PSION CD 2 / PsionCDVol2.iso / Programs / 876 / hugs.sis / Array.hs < prev    next >
Encoding:
Text File  |  2000-09-21  |  2.9 KB  |  78 lines

  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 a b -- Arrays are implemented as a primitive type
  18.  
  19. array          :: Ix a => (a,a) -> [(a,b)] -> Array a b
  20. listArray      :: Ix a => (a,a) -> [b] -> Array a b
  21. (!)           :: Ix a => Array a b -> a -> b
  22. bounds         :: Ix a => Array a b -> (a,a)
  23. indices        :: Ix a => Array a b -> [a]
  24. elems          :: Ix a => Array a b -> [b]
  25. assocs           :: Ix a => Array a b -> [(a,b)]
  26. (//)           :: Ix a => Array a b -> [(a,b)] -> Array a b
  27. accum          :: Ix a => (b -> c -> b) -> Array a b -> [(a,c)] -> Array a b
  28. accumArray     :: Ix a => (b -> c -> b) -> b -> (a,a) -> [(a,c)] -> Array a b
  29. ixmap           :: (Ix a, Ix b) => (a,a) -> (a -> b) -> Array b c -> Array a c
  30.  
  31. primitive primArray  :: (a,a) -> Int -> (a -> Int) -> [(a,b)] -> Array a b
  32. primitive primUpdate :: [(a,b)] -> Array a b -> (a -> Int) -> Array a b
  33. primitive primAccum
  34.     :: [(a,c)] -> Array a b -> (b -> c -> b) -> (a -> Int) -> Array a b
  35. primitive primAccumArray
  36.     :: (a,a) -> Int -> (b -> c -> b) -> b -> (a -> Int) -> [(a,c)] -> Array a b
  37. primitive primSubscript
  38.     :: ((a,a) -> a -> Int) -> Array a b -> a -> b
  39.  
  40. primitive primBounds :: Array a b -> (a,a)
  41. primitive primElems  :: Array a b -> [b]
  42. primitive primAmap   :: (b -> c) -> Array a b -> Array a c
  43.  
  44. array bnds          = primArray bnds (rangeSize bnds) (index bnds)
  45. listArray bnds vs   = array bnds (zip (range bnds) vs)
  46. (!)                 = primSubscript index
  47. bounds              = primBounds
  48. indices                = range . bounds
  49. elems               = primElems
  50. assocs a            = zip (indices a) (elems a)
  51. accumArray f z bnds = primAccumArray bnds (rangeSize bnds) f z (index bnds)
  52. a // as             = primUpdate as a (index (bounds a))
  53. accum f a as        = primAccum as a f (index (bounds a))
  54. ixmap bnds f a      = array bnds [ (i, a ! f i) | i <- range bnds ]
  55.  
  56. instance (Ix a) => Functor (Array a) where
  57.     fmap = primAmap
  58.  
  59. instance (Ix a, Eq b) => Eq (Array a b) where
  60.     a == a'   =   assocs a == assocs a'
  61.  
  62. instance (Ix a, Ord b) => Ord (Array a b) where
  63.     a <= a'   =   assocs a <= assocs a'
  64.  
  65. instance  (Ix a, Show a, Show b) => Show (Array a b)  where
  66.     showsPrec p a = showParen (p > 9) (
  67.             showString "array " .
  68.             shows (bounds a) . showChar ' ' .
  69.             shows (assocs a)                  )
  70.  
  71. instance  (Ix a, Read a, Read b) => Read (Array a b)  where
  72.     readsPrec p = readParen (p > 9)
  73.          (\r -> [(array b as, u) | ("array",s) <- lex r,
  74.                        (b,t)       <- reads s,
  75.                        (as,u)      <- reads t   ])
  76.  
  77. -----------------------------------------------------------------------------
  78.