module Satchmo.Array
( Array
, array, unknown, constant
, (!), elems, indices, bounds, range, assocs
)
where
import Satchmo.Code as C
import qualified Data.Array as A
import Control.Applicative
import Control.Monad ( forM )
newtype Array i v = Array (A.Array i v)
unknown bnd build =
Array <$> A.array bnd <$> forM (A.range bnd) ( \ i ->
(i,) <$> build )
constant a = Array a
instance (Functor m, A.Ix i, Decode m c d )
=> Decode m (Array i c) (A.Array i d) where
decode (Array a) = A.array (A.bounds a) <$>
forM (A.assocs a) ( \(k,v) -> (k,) <$> decode v )
Array a ! i = a A.! i
elems (Array a) = A.elems a
indices (Array a) = A.indices a
bounds (Array a) = A.bounds a
range bnd = A.range bnd
assocs (Array a) = A.assocs a
array bnd kvs = Array (A.array bnd kvs)