{-# LANGUAGE CPP #-}

-- | Strict @Map@. Import as:
--
-- > import qualified RIO.Map as Map
--
-- This module does not export any partial or unchecked functions.  For those,
-- see "RIO.Map.Partial" and "RIO.Map.Unchecked"
module RIO.Map
  (
  -- * Map type
    Data.Map.Strict.Map

  -- * Operators
#if MIN_VERSION_containers(0,5,9)
  , (Data.Map.Strict.!?)
#endif
  , (Data.Map.Strict.\\)

  -- * Query
  , Data.Map.Strict.null
  , Data.Map.Strict.size
  , Data.Map.Strict.member
  , Data.Map.Strict.notMember
  , Data.Map.Strict.lookup
  , Data.Map.Strict.findWithDefault
  , Data.Map.Strict.lookupLT
  , Data.Map.Strict.lookupGT
  , Data.Map.Strict.lookupLE
  , Data.Map.Strict.lookupGE

  -- * Construction
  , Data.Map.Strict.empty
  , Data.Map.Strict.singleton

  -- ** Insertion
  , Data.Map.Strict.insert
  , Data.Map.Strict.insertWith
  , Data.Map.Strict.insertWithKey
  , Data.Map.Strict.insertLookupWithKey

  -- ** Delete\/Update
  , Data.Map.Strict.delete
  , Data.Map.Strict.adjust
  , Data.Map.Strict.adjustWithKey
  , Data.Map.Strict.update
  , Data.Map.Strict.updateWithKey
  , Data.Map.Strict.updateLookupWithKey
  , Data.Map.Strict.alter
#if MIN_VERSION_containers(0,5,8)
  , Data.Map.Strict.alterF
#endif

  -- * Combine

  -- ** Union
  , Data.Map.Strict.union
  , Data.Map.Strict.unionWith
  , Data.Map.Strict.unionWithKey
  , Data.Map.Strict.unions
  , Data.Map.Strict.unionsWith

  -- ** Difference
  , Data.Map.Strict.difference
  , Data.Map.Strict.differenceWith
  , Data.Map.Strict.differenceWithKey

  -- ** Intersection
  , Data.Map.Strict.intersection
  , Data.Map.Strict.intersectionWith
  , Data.Map.Strict.intersectionWithKey

  -- ** General combining functions
  -- | See "Data.Map.Merge.Strict"

  -- ** Deprecated general combining function

  , Data.Map.Strict.mergeWithKey

  -- * Traversal
  -- ** Map
  , Data.Map.Strict.map
  , Data.Map.Strict.mapWithKey
  , Data.Map.Strict.traverseWithKey
#if MIN_VERSION_containers(0,5,8)
  , Data.Map.Strict.traverseMaybeWithKey
#endif
  , Data.Map.Strict.mapAccum
  , Data.Map.Strict.mapAccumWithKey
  , Data.Map.Strict.mapAccumRWithKey
  , Data.Map.Strict.mapKeys
  , Data.Map.Strict.mapKeysWith

  -- * Folds
  , Data.Map.Strict.foldr
  , Data.Map.Strict.foldl
  , Data.Map.Strict.foldrWithKey
  , Data.Map.Strict.foldlWithKey
  , Data.Map.Strict.foldMapWithKey

  -- ** Strict folds
  , Data.Map.Strict.foldr'
  , Data.Map.Strict.foldl'
  , Data.Map.Strict.foldrWithKey'
  , Data.Map.Strict.foldlWithKey'

  -- * Conversion
  , Data.Map.Strict.elems
  , Data.Map.Strict.keys
  , Data.Map.Strict.assocs
  , Data.Map.Strict.keysSet
  , Data.Map.Strict.fromSet

  -- ** Lists
  , Data.Map.Strict.toList
  , Data.Map.Strict.fromList
  , Data.Map.Strict.fromListWith
  , Data.Map.Strict.fromListWithKey

  -- ** Ordered lists
  , Data.Map.Strict.toAscList
#if MIN_VERSION_containers(0,5,8)
  , Data.Map.Strict.toDescList
#endif

  -- * Filter
  , Data.Map.Strict.filter
  , Data.Map.Strict.filterWithKey
#if MIN_VERSION_containers(0,5,8)
  , Data.Map.Strict.restrictKeys
  , Data.Map.Strict.withoutKeys
#endif
  , Data.Map.Strict.partition
  , Data.Map.Strict.partitionWithKey

#if MIN_VERSION_containers(0,5,8)
  , Data.Map.Strict.takeWhileAntitone
  , Data.Map.Strict.dropWhileAntitone
  , Data.Map.Strict.spanAntitone
#endif

  , Data.Map.Strict.mapMaybe
  , Data.Map.Strict.mapMaybeWithKey
  , Data.Map.Strict.mapEither
  , Data.Map.Strict.mapEitherWithKey

  , Data.Map.Strict.split
  , Data.Map.Strict.splitLookup
  , Data.Map.Strict.splitRoot

  -- * Submap
  , Data.Map.Strict.isSubmapOf
  , Data.Map.Strict.isSubmapOfBy
  , Data.Map.Strict.isProperSubmapOf
  , Data.Map.Strict.isProperSubmapOfBy

  -- * Indexed
  , Data.Map.Strict.lookupIndex
  , Data.Map.Strict.elemAt
  , Data.Map.Strict.deleteAt
#if MIN_VERSION_containers(0,5,8)
  , Data.Map.Strict.take
  , Data.Map.Strict.drop
  , Data.Map.Strict.splitAt
#endif

  -- * Min\/Max
#if MIN_VERSION_containers(0,5,9)
  , Data.Map.Strict.lookupMin
  , Data.Map.Strict.lookupMax
#endif
  , Data.Map.Strict.deleteMin
  , Data.Map.Strict.deleteMax
  , Data.Map.Strict.updateMin
  , Data.Map.Strict.updateMax
  , Data.Map.Strict.updateMinWithKey
  , Data.Map.Strict.updateMaxWithKey
  , Data.Map.Strict.minView
  , Data.Map.Strict.maxView
  , Data.Map.Strict.minViewWithKey
  , Data.Map.Strict.maxViewWithKey

  -- * Debugging
  , Data.Map.Strict.showTree
  , Data.Map.Strict.showTreeWith
  , Data.Map.Strict.valid
  ) where

import qualified Data.Map.Strict