{-# 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