The range-set-list package

[Tags:library, mit, test]

Memory efficient sets with continuous ranges of discrete, bounded elements. List- and map-based implementations. Interface mimics Data.Set where possible.

[Skip to Readme]


Versions 0.0.1, 0.0.2, 0.0.3, 0.0.4, 0.0.5, 0.0.6, 0.0.7,,,
Change log
Dependencies base (>=4.5 && <4.10), containers (>=0.5.3 && <0.6), deepseq (>= && <1.5), hashable (>= && <1.3), semigroups (>= && <0.19) [details]
License MIT
Author Oleg Grenrus <>
Maintainer Oleg Grenrus <>
Stability Unknown
Category Data
Home page
Bug tracker
Source repository head: git clone
Uploaded Thu Jan 21 15:52:53 UTC 2016 by phadej
Distributions LTSHaskell:, NixOS:, Stackage:, Tumbleweed:
Downloads 1609 total (11 in the last 30 days)
0 []
Status Docs available [build log]
Last success reported on 2016-01-21 [all 1 reports]




Maintainer's Corner

For package maintainers and hackage trustees

Readme for range-set-list

Readme for range-set-list-


Build Status Hackage Stackage LTS 2 Stackage LTS 3 Stackage Nightly

A few trivial implementations of range sets.

You can find the package (and its documentation) on hackage.

This module is intended to be imported qualified, to avoid name clashes with Prelude functions, e.g.,

import Data.RangeSet.List (RSet)
import qualified Data.RangeSet.List as RSet

This package contains two implementations of exactly the same interface, plus one specialization, all of which provide exactly the same behavior:

  • "Data.RangeSet.List" implements the simplest RSet based on list. Set construction and manipulation is most efficient for this version, but lookups may require a full list traversal.
  • "Data.RangeSet.Map" implements a slightly less simple RSet based on map. Construction and manipulation have more overhead in this version, but lookups are significantly faster, especially for large sets.
  • "Data.RangeSet.IntMap" is simply a specialization of "Data.RangeSet.Map" to Ints based on IntMap.

Compared to Data.Set, this module also imposes an Enum constraint for many functions. We must be able to identify consecutive elements to be able to glue and split ranges properly.

The implementation assumes that

x < succ x
pred x < x

and there aren't elements in between (not true for Float and Double). Also succ and pred are never called for largest or smallest value respectively.