The contents of this module may change in any way whatsoever
and without any warning between minor versions of this package.
Authors importing this module are expected to track development
closely.
Description
An efficient implementation of integer sets.
These modules are intended to be imported qualified, to avoid name
clashes with Prelude functions, e.g.
import Data.Word64Set (Word64Set)
import qualified Data.Word64Set as Word64Set
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).
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
reduce 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.
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).
O(\min(n,W)). Take while a predicate on the elements holds.
The user is responsible for ensuring that for all Ints, j < k ==> p j >= p k.
See note at spanAntitone.
O(\min(n,W)). Drop while a predicate on the elements holds.
The user is responsible for ensuring that for all Ints, j < k ==> p j >= p k.
See note at spanAntitone.
O(\min(n,W)). Divide a set at the point where a predicate on the elements stops holding.
The user is responsible for ensuring that for all Ints, j < k ==> p j >= p k.
O(\min(n,W)). The expression (split x set) is a pair (set1,set2)
where set1 comprises the elements of set less than x and set2
comprises the elements of set greater than x.
O(1). Decompose a set into pieces based on the structure of the underlying
tree. This function is useful for consuming a set in parallel.
No guarantee is made as to the sizes of the pieces; an internal, but
deterministic process determines this. However, it is guaranteed that the
pieces returned will be in ascending order (all elements in the first submap
less than all elements in the second, and so on).
Note that the current implementation does not return more than two subsets,
but you should not depend on this behaviour because it can change in the
future without notice. Also, the current version does not continue
splitting all the way to individual singleton sets -- it stops at some
point.
O(n). A strict version of foldr. Each application of the operator is
evaluated before using the result in the next application. This
function is strict in the starting value.
O(n). A strict version of foldl. Each application of the operator is
evaluated before using the result in the next application. This
function is strict in the starting value.
O(n). Fold the elements in the set using the given right-associative
binary operator. This function is an equivalent of foldr and is present
for compatibility only.
Please note that fold will be deprecated in the future and removed.
O(n \min(n,W)). The expression (showTreeWith hang wide map) shows
the tree that implements the set. If hang is
True, a hanging tree is shown otherwise a rotated tree is shown. If
wide is True, an extra wide version is shown.