| Crates.io | astral-version-ranges |
| lib.rs | astral-version-ranges |
| version | 0.1.4 |
| created_at | 2025-11-14 10:27:50.948258+00 |
| updated_at | 2025-11-21 09:33:43.709146+00 |
| description | Performance-optimized type for generic version ranges and operations on them. |
| homepage | |
| repository | https://github.com/astral-sh/pubgrub |
| max_upload_size | |
| id | 1932550 |
| size | 95,260 |
This crate contains a performance-optimized type for generic version ranges and operations on them.
Ranges can represent version selectors such as (>=1.5.1, <2) OR (==3.1) OR (>4). Internally, it is an ordered list
of contiguous intervals (segments) with inclusive, exclusive or open-ended ends, similar to a
Vec<(Bound<T>, Bound<T>)>.
You can construct a basic range from one of the following build blocks. All other ranges are concatenation, union, and complement of these basic ranges.
Ranges::empty(): No versionRanges::full(): All versionsRanges::singleton(v): Only the version v exactlyRanges::higher_than(v): All versions v <= versionsRanges::strictly_higher_than(v): All versions v < versionsRanges::lower_than(v): All versions versions <= vRanges::strictly_lower_than(v): All versions versions < vRanges::between(v1, v2): All versions v1 <= versions < v2The optimized operations include complement, contains, contains_many, intersection, is_disjoint,
subset_of and union.
Ranges is generic over any type that implements Ord + Clone and can represent all kinds of slices with ordered
coordinates, not just version ranges. While built as a performance-critical piece
of pubgrub, it can be adopted for other domains, too.
You can imagine a Ranges as slices over a number line.
Note that there are limitations to the equality implementation: Given a Ranges<u32>, the segments
(Unbounded, Included(42u32)) and (Included(0), Included(42u32)) as well as
(Included(1), Included(5)) and (Included(1), Included(3)) + (Included(4), Included(5))
are reported as unequal, even though the match the same versions: We can't tell that there isn't a version between 0
and -inf or 3 and 4 respectively.
serde: serialization and deserialization for the version range, given that the version type also supports it.proptest: Exports are proptest strategy for Ranges<u32>.