module Satchmo.Map.Data
( Map
, unknown, constant
, (!), elems, keys, toList, fromList
, map, mapWithKey
)
where
import qualified Prelude; import Prelude hiding ( map )
import Satchmo.Code
import qualified Satchmo.Boolean as B
import Satchmo.SAT
import qualified Data.Set as S
import qualified Data.Map.Strict as M
import Control.Monad ( guard, forM )
import Control.Applicative ( (<$>), (<*>) )
newtype Map a b = Map (M.Map a b)
Map m ! i = m M.! i
elems (Map m) = M.elems m
keys (Map m) = M.keys m
toList (Map m) = M.toList m
fromList kvs = Map $ M.fromList kvs
map f (Map m) = Map (M.map f m)
mapWithKey f (Map m) = Map (M.mapWithKey f m)
instance ( Functor m, Decode m b c, Ord a )
=> Decode m (Map a b) ( M.Map a c) where
decode (Map m) = decode m
unknown :: ( B.MonadSAT m , Ord a )
=> [a] -> m b -> m (Map a b)
unknown xs build = Map <$> M.fromList
<$> ( forM xs $ \ x -> (x,) <$> build )
constant :: ( B.MonadSAT m , Ord a )
=> [(a,c)] -> (c -> m b) -> m (Map a b)
constant xys encode = Map <$> M.fromList
<$> ( forM xys $ \ (x,y) -> (x,) <$> encode y )