1 个不稳定版本
0.1.0 | 2021 年 5 月 12 日 |
---|
#1816 in Rust 模式
15KB
319 行
迭代器分叉器
许可协议
许可协议为以下之一:
- Apache 许可证,版本 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
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));