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