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