JYU-Utils-0.1.1: Utils/DynMap.hs
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