3 releases (breaking)
0.3.0 | Jul 2, 2023 |
---|---|
0.2.2 | Jul 1, 2023 |
0.1.0 | Jun 29, 2023 |
#1383 in Algorithms
Used in 2 crates
(via derive-quickcheck)
20KB
374 lines
Breadth-first zip
Property-tested and verified to return every possible value exactly one in a strictly increasing sum of indices.
Why?
For whenever you have a multiple iterators and want to cover every possible value from overall smallest to largest.
E.g. for three instances of 0..3
, you'd get this:
0 0 0 # sum = 0
0 0 1 # sum = 1
0 1 0
1 0 0
0 0 2 # sum = 2
0 1 1
0 2 0
1 0 1
1 1 0
2 0 0
0 1 2 # sum = 3
0 2 1
1 0 2
1 1 1
1 2 0
2 0 1
2 1 0
0 2 2 # sum = 4
1 1 2
1 2 1
2 0 2
2 1 1
2 2 0
1 2 2 # sum = 5
2 1 2
2 2 1
2 2 2 # sum = 6
Inputs can be any non-empty iterator, even combining different sizes.
lib.rs
:
Breadth-first exhaustive zip
for repeatable iterators.
Behavior matches the following pseudocode specification:
- Initialize a counter
i
at zero. - When propmted, pull the first element from each iterator.
- If any iterator is empty, return
None
.
- If any iterator is empty, return
- When prompted again, advance only the last iterator.
- Continue to do so until the last iterator terminates or reaches its
i
th element.- When it does so, reset it and pull the next element from the second-to-last iterator.
- Repeat this process until we exhaust the first iterator.
- When you've done that, increase
i
and repeat.
- When you've done that, increase
- Once
i
exceeds the longest iterator's length, we're done: returnNone
.
Dependencies
~295–740KB
~18K SLoC