module Useful.Dictionary where
import qualified Data.Map
dict :: (Ord k) => [(k, a)] -> Data.Map.Map k a
dict l = Data.Map.fromList l
dictToList :: Data.Map.Map k a -> [(k, a)]
dictToList d = Data.Map.toList d
(#!) :: (Ord k) => k -> Data.Map.Map k a -> Maybe a
(#!) d k = Data.Map.lookup d k
(#!!) :: (Ord k) => Data.Map.Map k a -> k -> a
(#!!) d k = (Data.Map.!) d k
(#+) :: (Ord k) => Data.Map.Map k a -> (k,a) -> Data.Map.Map k a
(#+) d (k,v) = Data.Map.insert k v d
(#?) :: (Ord k) => Data.Map.Map k a -> k -> Bool
(#?) d k = Data.Map.member k d
(#*?) :: (Eq a, Ord k) => Data.Map.Map k a -> a -> Bool
(#*?) d v = (Data.Map.keys (Data.Map.filter (==v) d)) /= []
(#-) :: (Ord k) => Data.Map.Map k a -> k -> Data.Map.Map k a
(#-) d k = Data.Map.delete k d
(#*-) :: (Eq a, Ord k) => Data.Map.Map k a -> a -> Data.Map.Map k a
(#*-) d v = Data.Map.filter (/=v) d
(#\\) :: (Ord k) => Data.Map.Map k a -> Data.Map.Map k b -> Data.Map.Map k a
(#\\) d1 d2 = (Data.Map.\\) d1 d2
(#++) :: (Ord k) => Data.Map.Map k a -> Data.Map.Map k a -> Data.Map.Map k a
(#++) d1 d2 = Data.Map.union d1 d2
(#??) :: (Ord k, Eq a) => Data.Map.Map k a -> Data.Map.Map k a -> Bool
(#??) d1 d2 = Data.Map.isSubmapOf d1 d2
(#?!) :: (Eq a, Ord k) => Data.Map.Map k a -> a -> k
(#?!) d v
|(Data.Map.filter (==v) d) == Data.Map.empty = error "value is not in dictionary"
|otherwise = head (Data.Map.keys (Data.Map.filter (==v) d))
dictSize :: Data.Map.Map k a -> Int
dictSize d = Data.Map.size d
mapD :: (a -> b) -> Data.Map.Map k a -> Data.Map.Map k b
mapD func d = Data.Map.map func d
mapDkeys :: (Ord k2) => (k1 -> k2) -> Data.Map.Map k1 a -> Data.Map.Map k2 a
mapDkeys func d = Data.Map.mapKeys func d
filterD :: (Ord k) => (a -> Bool) -> Data.Map.Map k a -> Data.Map.Map k a
filterD func d = Data.Map.filter func d
filterDkeys :: (Ord k) => (k -> a -> Bool) -> Data.Map.Map k a -> Data.Map.Map k a
filterDkeys func d = Data.Map.filterWithKey func d