containers-0.6.3.1: src/Data/IntSet.hs
{-# LANGUAGE CPP #-}
#if !defined(TESTING) && defined(__GLASGOW_HASKELL__)
{-# LANGUAGE Safe #-}
#endif
#include "containers.h"
-----------------------------------------------------------------------------
-- |
-- Module : Data.IntSet
-- Copyright : (c) Daan Leijen 2002
-- (c) Joachim Breitner 2011
-- License : BSD-style
-- Maintainer : libraries@haskell.org
-- Portability : portable
--
--
-- = Finite Int Sets
--
-- The @'IntSet'@ type represents a set of elements of type @Int@.
--
-- For a walkthrough of the most commonly used functions see their
-- <https://haskell-containers.readthedocs.io/en/latest/set.html sets introduction>.
--
-- These modules are intended to be imported qualified, to avoid name
-- clashes with Prelude functions, e.g.
--
-- > import Data.IntSet (IntSet)
-- > import qualified Data.IntSet as IntSet
--
--
-- == Performance information
--
-- Many operations have a worst-case complexity of /O(min(n,W))/.
-- This means that the operation can become linear in the number of
-- elements with a maximum of /W/ -- the number of bits in an 'Int'
-- (32 or 64).
--
--
-- == Implementation
--
-- The implementation is based on /big-endian patricia trees/. This data
-- structure performs especially well on binary operations like 'union'
-- and 'intersection'. However, my benchmarks show that it is also
-- (much) faster on insertions and deletions when compared to a generic
-- size-balanced set implementation (see "Data.Set").
--
-- * Chris Okasaki and Andy Gill, \"/Fast Mergeable Integer Maps/\",
-- Workshop on ML, September 1998, pages 77-86,
-- <http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.37.5452>
--
-- * D.R. Morrison, \"/PATRICIA -- Practical Algorithm To Retrieve
-- Information Coded In Alphanumeric/\", Journal of the ACM, 15(4),
-- October 1968, pages 514-534.
--
-- Additionally, this implementation places bitmaps in the leaves of the tree.
-- Their size is the natural size of a machine word (32 or 64 bits) and greatly
-- reduces the memory footprint and execution times for dense sets, e.g. sets
-- where it is likely that many values lie close to each other. The asymptotics
-- are not affected by this optimization.
--
-----------------------------------------------------------------------------
module Data.IntSet (
-- * Strictness properties
-- $strictness
-- * Set type
#if !defined(TESTING)
IntSet -- instance Eq,Show
#else
IntSet(..) -- instance Eq,Show
#endif
, Key
-- * Construction
, empty
, singleton
, fromList
, fromAscList
, fromDistinctAscList
-- * Insertion
, insert
-- * Deletion
, delete
-- * Generalized insertion/deletion
, alterF
-- * Query
, member
, notMember
, lookupLT
, lookupGT
, lookupLE
, lookupGE
, IS.null
, size
, isSubsetOf
, isProperSubsetOf
, disjoint
-- * Combine
, union
, unions
, difference
, (\\)
, intersection
-- * Filter
, IS.filter
, partition
, split
, splitMember
, splitRoot
-- * Map
, IS.map
, mapMonotonic
-- * Folds
, IS.foldr
, IS.foldl
-- ** Strict folds
, foldr'
, foldl'
-- ** Legacy folds
, fold
-- * Min\/Max
, findMin
, findMax
, deleteMin
, deleteMax
, deleteFindMin
, deleteFindMax
, maxView
, minView
-- * Conversion
-- ** List
, elems
, toList
, toAscList
, toDescList
-- * Debugging
, showTree
, showTreeWith
#if defined(TESTING)
-- * Internals
, match
#endif
) where
import Data.IntSet.Internal as IS
-- $strictness
--
-- This module satisfies the following strictness property:
--
-- * Key arguments are evaluated to WHNF
--
-- Here are some examples that illustrate the property:
--
-- > delete undefined s == undefined