{-# language TupleSections #-} {-# language FlexibleInstances #-} {-# language MultiParamTypeClasses #-} 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 :: (i, i) -> f a -> f (Array i a) unknown (i, i) bnd f a build = forall i v. Array i v -> Array i v Array forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e A.array (i, i) bnd forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall (t :: * -> *) (m :: * -> *) a b. (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b) forM (forall a. Ix a => (a, a) -> [a] A.range (i, i) bnd) ( \ i i -> (i i,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> f a build ) constant :: Array i v -> Array i v constant Array i v a = forall i v. Array i v -> Array i v Array Array i v a instance (Functor m, A.Ix i, Decode m c d ) => Decode m (Array i c) (A.Array i d) where decode :: Array i c -> m (Array i d) decode (Array Array i c a) = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e A.array (forall i e. Array i e -> (i, i) A.bounds Array i c a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall (t :: * -> *) (m :: * -> *) a b. (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b) forM (forall i e. Ix i => Array i e -> [(i, e)] A.assocs Array i c a) ( \(i k,c v) -> (i k,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall (m :: * -> *) c a. Decode m c a => c -> m a decode c v ) Array Array i e a ! :: Array i e -> i -> e ! i i = Array i e a forall i e. Ix i => Array i e -> i -> e A.! i i elems :: Array i e -> [e] elems (Array Array i e a) = forall i e. Array i e -> [e] A.elems Array i e a indices :: Array i e -> [i] indices (Array Array i e a) = forall i e. Ix i => Array i e -> [i] A.indices Array i e a bounds :: Array i e -> (i, i) bounds (Array Array i e a) = forall i e. Array i e -> (i, i) A.bounds Array i e a range :: (a, a) -> [a] range (a, a) bnd = forall a. Ix a => (a, a) -> [a] A.range (a, a) bnd assocs :: Array i e -> [(i, e)] assocs (Array Array i e a) = forall i e. Ix i => Array i e -> [(i, e)] A.assocs Array i e a array :: (i, i) -> [(i, v)] -> Array i v array (i, i) bnd [(i, v)] kvs = forall i v. Array i v -> Array i v Array (forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e A.array (i, i) bnd [(i, v)] kvs)