> module FiniteHugs where > type FiniteMap key elt = [(key,elt)] > emptyFM :: (Ord key) => FiniteMap key elt > emptyFM = [] > addToFM :: (Ord key) => FiniteMap key elt -> key -> elt -> FiniteMap key elt > addToFM [] key elt = [(key,elt)] > addToFM fm@(f:m) key elt = ((key,elt):fm) > listToFM :: (Ord key) => [(key,elt)] -> FiniteMap key elt > listToFM l = foldr (\(k,e) n -> addToFM n k e) emptyFM l > delFromFM :: (Ord key) => FiniteMap key elt -> key -> FiniteMap key elt > delFromFM fm key = fm > lookupFM :: (Ord key) => FiniteMap key elt -> key -> Maybe elt -- XXX Eq???? > lookupFM list n = let res = (filter (\(k,e) -> k == n) list) in > case res of > [] -> Nothing > ((k,e):_) -> Just e > unitFM :: (Ord key) => key -> elt -> FiniteMap key elt > unitFM key elt = addToFM emptyFM key elt > mapFM :: (key -> elt1 -> elt2) -> FiniteMap key elt1 -> FiniteMap key elt2 > mapFM f fm = map (\(k,e) -> (k,f k e)) fm > fmToList :: (Ord key) => FiniteMap key elt -> [(key,elt)] > fmToList fm = fm