intervalmap
A Rust library for working with sets and maps of intervals. Inspired by Boost.Icl.
What it does
IntervalSet stores non-overlapping intervals and automatically merges them when they touch or overlap:
use IntervalSet;
let mut set = new;
set.insert;
set.insert; // merges into [0, 15)
assert!;
assert_eq!; // just one interval after merge
IntervalMap associates values with intervals. When you insert overlapping ranges, the new value takes over:
use IntervalMap;
let mut map = new;
map.insert;
map.insert;
// Result: [0,5) -> "a", [5,15) -> "b"
assert_eq!;
assert_eq!;
Adjacent intervals with the same value get merged automatically.
Macros
use ;
let set = interval_set!;
let map = interval_map!;
Range types
All standard Rust range types work:
set.insert; // [0, 10)
set.insert; // [0, 11)
set.insert; // [10, MAX)
set.insert; // [MIN, 10)
set.insert; // [MIN, MAX)
Set operations
IntervalSet supports the usual set operations:
let a = interval_set!;
let b = interval_set!;
let union = &a | &b; // or a.union(&b)
let intersection = &a & &b; // or a.intersection(&b)
let difference = &a - &b; // or a.difference(&b)
let symmetric_diff = &a ^ &b; // or a.symmetric_difference(&b)
Other useful bits
// Query methods
set.first; // lowest interval
set.last; // highest interval
set.span; // bounding range from first.start to last.end
set.overlaps; // does any interval overlap this range?
set.covers; // is the entire range covered?
// Iteration
set.gaps; // iterate over gaps between intervals
set.iter_overlapping; // only intervals that overlap the range
// Modification
set.retain; // filter intervals
set.split_at; // split interval containing this point
Index types
The default index type is u32, but any primitive integer works:
let set: = new;
let set: = new;
License
MIT