{-# 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)