{-# LANGUAGE CPP #-}

-- | This modules provides a strict multimap implementation. To avoid collision with Prelude
-- functions, it is recommended to import this module qualified:
--
-- > import qualified Data.Multiset as Mmap
--
-- All complexities below use /m/ for the number of distinct keys and /n/ for the total number of
-- entries in the multimap.
module Data.Multimap (
  -- * Types
  -- ** Generic
  Multimap, Group,
  -- ** Specific
  ListMultimap,
  SeqMultimap,
  SetMultimap,
  -- * Construction
  empty, singleton,
#if __GLASGOW_HASKELL__ >= 708
  fromList,
#endif
  fromListWith, fromGroupList, fromMap,
  -- * Tests and accessors
  null,
  size, distinctSize,
  member, notMember,
  find, (!),
  -- * Modification
  prepend, prependMany,
  append, appendMany,
  deleteMany,
  modifyMany, modifyManyF,
  -- * Maps and filters
  mapGroups,
  filter, filterGroups,
  -- * Conversion
  toList, toGroupList, toMap,
  -- * Other
  keys, keysSet, keysMultiset,
#if __GLASGOW_HASKELL__ >= 708
  inverse,
#endif
  inverseWith
) where

import Prelude ()

import Data.Multimap.Generic
import Data.Multimap.List (ListMultimap)
import Data.Multimap.Seq (SeqMultimap)
import Data.Multimap.Set (SetMultimap)