#iterator #tee #clone #items #cloning #cloned #point

iter-tee

创建迭代器的多个克隆副本

1 个不稳定版本

0.1.0 2021 年 5 月 12 日

#1816 in Rust 模式

MIT/Apache

15KB
319

迭代器分叉器

crates.io docs.rs License Dependencies

许可协议

许可协议为以下之一:

由您选择。


lib.rs:

创建迭代器的多个克隆副本。

每个迭代器的句柄都由 [Tee] 实例表示。一个 Tee 本身也是一个迭代器,将产生与原始迭代器相同的项序列。可以在任何点自由克隆 Tee 来创建更多对同一底层迭代器的句柄。一旦克隆,两个 Tee 将是相同的,但独立的:它们将产生相同的项。

实现使用单个环形缓冲区来存储已从底层迭代器拉取但尚未由所有 Tee 消耗的项。该缓冲区由 RwLock 保护,并使用原子操作来维护项引用计数。

尽管实现尽量高效,但如果底层迭代器实现了 Clone,它将不会像原生克隆底层迭代器那样高效。

示例

use iter_tee::Tee;

// Wrap an iterator in a Tee:
let mut tee1 = Tee::new(0..10);
// It yields the same items:
assert_eq!(tee1.next(), Some(0));
assert_eq!(tee1.next(), Some(1));
// Create a second Tee:
let mut tee2 = tee1.clone();
// Both yield the same items:
assert_eq!(tee1.next(), Some(2));
assert_eq!(tee2.next(), Some(2));
// Create a third Tee:
let mut tee3 = tee2.clone();
// All three yield the same items:
assert_eq!(tee1.next(), Some(3));
assert_eq!(tee2.next(), Some(3));
assert_eq!(tee3.next(), Some(3));
// The Tees can be advanced independently:
assert_eq!(tee1.next(), Some(4));
assert_eq!(tee1.next(), Some(5));
assert_eq!(tee2.next(), Some(4));

无运行时依赖