{-# language MultiParamTypeClasses, FunctionalDependencies, UndecidableInstances #-}

module Satchmo.Code 

( Decode (..)
, Decoder
)

where

import Satchmo.Data


import Data.Map ( Map )
import qualified Data.Map as M
import Data.Array

import Control.Monad.Reader


class Decode c a | c -> a where decode :: c -> Decoder a

type Decoder a = Reader ( Map Literal Bool ) a


instance ( Decode c a, Decode d b ) => Decode ( c,d) (a,b) where
    decode (c,d) = do a <- decode c; b <- decode d; return ( a,b)

instance ( Decode c a ) => Decode [c] [a] where
    decode = mapM decode 

instance (Ix i, Decode c a) => Decode ( Array i c) ( Array i a ) where
    decode x = do
        pairs <- sequence $ do
            (i,e) <- assocs x
            return $ do
                f <- decode e
                return (i,f)
        return $ array (bounds x) pairs