module Data.Predicate.Env
( Env
, empty
, lookup
, insert
)
where
import Prelude hiding (lookup)
import Control.Monad.State.Strict
import Data.ByteString (ByteString)
import Data.Dynamic
import qualified Data.Map.Strict as M
newtype Env = Env
{ _unenv :: M.Map ByteString Dynamic }
empty :: Env
empty = Env M.empty
lookup :: (MonadState m, StateType m ~ Env, Typeable a) => ByteString -> m (Maybe a)
lookup k = gets $ maybe Nothing fromDynamic . M.lookup k . _unenv
insert :: (MonadState m, StateType m ~ Env, Typeable a) => ByteString -> a -> m ()
insert k v = modify $ Env . M.insert k (toDyn v) . _unenv