{-# language MultiParamTypeClasses, FunctionalDependencies, UndecidableInstances #-} module Satchmo.Code ( Decode (..) , Decoder ) where import Satchmo.Data import Data.Array import Control.Monad.Reader class Decode c a where {-# INLINABLE decode #-} decode :: c -> Decoder a -- type Decoder a = Reader ( Map Variable Bool ) a type Decoder a = Reader ( Array Variable Bool ) a instance Decode () () where decode () = return () 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 Decode a b => Decode ( Maybe a ) ( Maybe b ) where decode ( Just b ) = fmap Just $ decode b decode Nothing = return $ Nothing 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