module MultiBimap
( MultiBimap
, empty
, null
, insert
, lookup
, lookupR
)
where
import qualified Data.Map as M
import qualified Data.MultiMap as MM
import Prelude hiding (null,lookup)
data MultiBimap k v = MkMultiBimap (MM.MultiMap k v) (M.Map v k)
empty :: MultiBimap k v
empty = MkMultiBimap MM.empty M.empty
null :: MultiBimap k v -> Bool
null (MkMultiBimap _ right) = M.null right
insert :: (Ord k, Ord v) => k -> v -> MultiBimap k v -> MultiBimap k v
insert k v (MkMultiBimap left right) =
MkMultiBimap (MM.insert k v left) (M.insert v k right)
lookup :: (Ord k) => k -> MultiBimap k v -> [v]
lookup k (MkMultiBimap left _) = MM.lookup k left
lookupR :: (Ord v) => v -> MultiBimap k v -> Maybe k
lookupR v (MkMultiBimap _ right) = M.lookup v right