10 个版本 (6 个破坏性更新)
0.7.0 | 2023 年 10 月 7 日 |
---|---|
0.6.0 | 2023 年 10 月 7 日 |
0.5.0 | 2023 年 10 月 7 日 |
0.4.0 | 2023 年 10 月 7 日 |
0.1.0 | 2023 年 9 月 24 日 |
#1394 in 算法
63 次每月下载
30KB
515 行
Ribbon - 迭代器的带子
Ribbon
旨在提供 API 以保存(并因此使可用)迭代器返回的一些项目。
这适用于使用迭代器方便,但需要了解迭代器返回的项目的一些上下文的情况。当需要预览时(在决定如何处理当前项目之前,我们需要知道接下来出现的值),这特别有用。
此 crate 提供了两种实现 Ribbon
特性的类型
Tape
:一种动态大小的Ribbon
,可以保存可变数量的项目,并且可以根据需要增长和缩小。它由VecDeque
支持,并在堆上分配内存(这是动态大小集合的常规做法)Band
:一种固定大小的Ribbon
,由N
元素的数组支持。它不能超过给定的固定长度,并且在没有可用空间时将删除第一个元素。
示例
使用 Tape
use ribbon::Tape;
let mut tape = Tape::new(0..10);
tape.expand_n(5);
assert_eq!(tape.len(), 5);
assert_eq!(tape.peek_front(), Some(&0));
assert_eq!(tape.peek_back(), Some(&4));
使用 Band
use ribbon::Band;
use ribbon::Ribbon;
// Band with capacity for 5 items
let mut band: Band<3, _, _> = Band::new(0..4);
band.expand_n(2); // consume 0, 1 from iterator
assert_eq!(band.len(), 2);
assert_eq!(band.peek_front(), Some(&0));
assert_eq!(band.peek_back(), Some(&1));
// "slides" over the items from iterator -> returns first and expands by 1
assert_eq!(band.progress(), Some(0)); // consume 3 from iterator
assert_eq!(band.progress(), Some(1)); // consumes 4 from iterator, iterator has no more values
// iterator does not produce more values, progress becomes no-op.
assert_eq!(band.progress(), None);