88 lines
2.3 KiB
Plaintext
88 lines
2.3 KiB
Plaintext
|
Integer sets represented as lists of intervals
|
||
|
|
||
|
1. Introduction
|
||
|
|
||
|
This module provides functions to work with sets of integers
|
||
|
represented as sorted lists of intervals, which are pairs of bounds.
|
||
|
For example, the set
|
||
|
|
||
|
{ 1, 2, 3, 4, 10, 11, 12, 80 }
|
||
|
|
||
|
is represented by the list
|
||
|
|
||
|
((1 . 4) (10 . 12) (80 . 80))
|
||
|
|
||
|
The functions provided here always ensure that the lists are valid and
|
||
|
in canonical form.
|
||
|
|
||
|
A list is valid if each of its intervals is valid. An interval is
|
||
|
valid if its upper bound is greater or equal to its lower bound.
|
||
|
|
||
|
A list is in canonical form if:
|
||
|
|
||
|
* all its intervals are strictly disjoint, that is they neither
|
||
|
overlap nor touch, and
|
||
|
|
||
|
* its intervals are sorted by increasing bounds.
|
||
|
|
||
|
2. Functions
|
||
|
|
||
|
Apart from the functions presented here, all functions working on
|
||
|
lists can be used, since the representation of integer sets is exposed
|
||
|
for that purpose.
|
||
|
|
||
|
2.1. Constructors
|
||
|
|
||
|
(intset-singleton element) -> integer-set
|
||
|
|
||
|
Return an integer set containing only the given ELEMENT.
|
||
|
|
||
|
(intset-range begin end) -> integer-set
|
||
|
|
||
|
Return an integer set composed of the integers in the range
|
||
|
[BEGIN,END] (i.e. both BEGIN and END are included).
|
||
|
|
||
|
2.2. Predicates
|
||
|
|
||
|
(intset? thing) -> boolean
|
||
|
|
||
|
Return true iff the given THING is a valid list of intervals in
|
||
|
canonical form, as defined above.
|
||
|
|
||
|
(intset-contains? element set) -> boolean
|
||
|
|
||
|
Return true iff SET contains ELEMENT.
|
||
|
|
||
|
2.3. Set operations
|
||
|
|
||
|
(intset-union set-1 set-2) -> integer-set
|
||
|
|
||
|
Return the union of the integer sets SET-1 and SET-2.
|
||
|
|
||
|
(intset-intersection set-1 set-2) -> integer-set
|
||
|
|
||
|
Return the intersection of the integer sets SET-1 and SET-2.
|
||
|
|
||
|
(intset-difference set-1 set-2) -> integer-set
|
||
|
|
||
|
Return the difference of the integer sets SET-1 and SET-2, that is
|
||
|
SET-1 \ SET-2.
|
||
|
|
||
|
(intset-adjoin element set) -> integer-set
|
||
|
|
||
|
Return a set containing the same elements as SET plus ELEMENT. Note:
|
||
|
the "lset-adjoin" function in SRFI-1 takes the set as first argument
|
||
|
and the element(s) as rest arguments. Since this argument ordering is
|
||
|
not coherent with the other functions, I decided not to copy it.
|
||
|
|
||
|
(intset-delete element set) -> integer-set
|
||
|
|
||
|
Return a set containing the same elements as SET but ELEMENT.
|
||
|
|
||
|
2.4. Iterators
|
||
|
|
||
|
(intset-map f set) -> list
|
||
|
|
||
|
Apply function F to the lower and upper bounds of all intervals in
|
||
|
SET, and return the list of all of F results.
|