| Crates.io | iter-merge |
| lib.rs | iter-merge |
| version | 0.2.0 |
| created_at | 2025-09-07 17:24:52.006611+00 |
| updated_at | 2025-09-08 16:04:03.526407+00 |
| description | A high-performance iterator merging library |
| homepage | https://github.com/Andrew-Morozko/iter-merge |
| repository | https://github.com/Andrew-Morozko/iter-merge |
| max_upload_size | |
| id | 1828353 |
| size | 102,282 |
A high-performance iterator merging library for Rust that efficiently combines multiple iterators into a single iterator, yielding smallest item first.
Note: only compares the first items across provided iterators. The output would be sorted only if the iterators themselves are sorted.
.next() advances only one iteratorVec and StackVec (for no-std and no-alloc compatibility)forbid_unsafePeekable methodsuse iter_merge::Merged;
let iter1 = vec![1, 3, 5, 7];
let iter2 = vec![2, 4, 6, 8];
let mut merged = Merged::new([iter1, iter2]).build();
let result = merged.into_vec();
assert_eq!(result, vec![1, 2, 3, 4, 5, 6, 7, 8]);
use iter_merge::Merged;
let mut merged = Merged::new([
vec![9, 6, 3],
vec![8, 5, 2],
vec![7, 4, 1],
])
.with_cmp(|a, b| b.cmp(a))
.build();
let result = merged.into_vec();
assert_eq!(result, vec![9, 8, 7, 6, 5, 4, 3, 2, 1]);
use iter_merge::Merged;
let mut merged = Merged::new([vec![0, 1]]).build();
assert_eq!(merged.next(), Some(0));
merged.add_iter(vec![2]);
merged.add_iters([vec![3], vec![4]]);
let result = merged.into_vec();
assert_eq!(result, vec![1, 2, 3, 4]);
This library is optimized for merging small to medium numbers of iterators. When tested
with ~1 000 000 random u64s:
itertools::kmergeitertools::kmergeO(iterator_count²) starts to dominateThe crate supports several feature flags:
vec_storage (default): Enable heap-allocated storage with Vec, requires allocstackvec_storage: Enable stack-allocated storage with StackVecforbid_unsafe: Disable all unsafe codeRun the fuzz test:
For fuzzing blocks in the Cargo.toml or run ./toggle_fuzz_config.shcargo +nightly fuzzcheck fuzz_merge --test fuzz --profile fuzz
cargo +nightly fuzzcheck fuzz_merge_correctness --test fuzz --profile fuzz
Run benchmarks:
RUSTFLAGS='-C target-cpu=native --cfg benchmarking'
cargo bench
(Benchmarking dependencies are behind benchmarking cfg option to keep MSRV low)
The minimum supported Rust version for this crate is 1.68.0. This may change in a major release, but it is unlikely.
Contributions are welcome. For major changes, please open an issue first to discuss what you would like to change.
itertools - General iterator utilities (includes kmerge)