module Utils.DynMap where import qualified Data.Map as Map import Data.Dynamic import Control.Monad.State import Control.Monad import Data.List(intercalate) newtype PropertyMap = PM (Map.Map String (String,Dynamic)) emptyD :: PropertyMap emptyD = PM Map.empty insertD k v (PM dmap) = PM $ Map.insert k (show v,toDyn v) dmap (PM dmap) #? k = fromDyn (snd $ dmap Map.! k) (error $ "TYPE ERROR ON "++k) (PM dmap) #?? k = (fst $ dmap Map.! k) (PM dmap) #/ k = (Map.delete k dmap) showD dmap = "{" ++ (intercalate ", " . map (\(k,(v,p)) -> k++": "++v) . Map.toList $ dmap) ++"}" instance Show PropertyMap where show (PM pm) = "{"++ (intercalate ", " . map (\(k,(v,_))-> k++":" ++v) $ Map.assocs pm) ++"}" (=:) :: (Show a,Typeable a) => String -> a -> State PropertyMap () a =: b = do x <- get put (insertD a b x) properties st = snd $ runState st emptyD