diplomacy-0.1.0.0: Data/MapUtil.hs
{-|
Module : Data.MapUtil
Description : Definition of lookupWithKey
Copyright : (c) Alexander Vieth, 2015
Licence : BSD3
Maintainer : aovieth@gmail.com
Stability : experimental
Portability : non-portable (GHC only)
-}
{-# LANGUAGE AutoDeriveTypeable #-}
module Data.MapUtil (
lookupWithKey
) where
import qualified Data.Map as M
import qualified Data.Set as S
-- | Lookup a key in a map and get back the actual key as well. Useful when
-- the key Eq instance is not quite so sharp.
lookupWithKey
:: Ord k
=> k
-> M.Map k v
-> Maybe (k, v)
lookupWithKey k m =
let v = M.lookup k m
keys = M.keysSet m
-- keys `S.intersection` S.singleton k is empty iff v is Nothing, so
-- this won't be undefined.
k' = head (S.elems (keys `S.intersection` S.singleton k))
in fmap (\x -> (k', x)) v