4 个版本
0.1.0 | 2024 年 1 月 28 日 |
---|---|
0.1.0-alpha.1 | 2023 年 3 月 24 日 |
0.0.2 | 2023 年 3 月 12 日 |
0.0.1 | 2023 年 3 月 12 日 |
在 算法 中排名 436
每月下载量 526
在 4 个 crate 中使用 (通过 lsm-tree)
45KB
724 行
Double-Ended Peekable
一个非常小的 crate,提供了对 Iterator
的额外抽象,以便将 Peekable
引入的概念提升到 DoubleEndedIterator
。
原因
使用 Peekable
,您可以调用 peek
来获取迭代器中即将到来的元素的引用,您还可以使用 next_if
/next_if_eq
仅当即将到来的元素满足某些条件时才将迭代器向前推进。
然而,当您需要从双端迭代器的开始和结束处执行这些操作时,这种抽象并不适用。例如,您不能即时执行以下操作:.by_ref().rev().peekable().peek().next()
,因为即使这种方法看起来有效,实现时需要在Peekable
实例中存储下一个元素(即next_back
的对应项,以便更清晰地表达),这意味着使用刚才显示的片段时,被查看的元素将被丢弃。
如何使用
您只需导入扩展特质DoubleEndedPeekableExt
(DoubleEndedPeekableExt
),以便轻松使用double_ended_peekable
。
use double_ended_peekable::DoubleEndedPeekableExt;
let mut iter = [0, 1, 2, 3, 4].into_iter().double_ended_peekable();
assert_eq!(
iter.next_front_back_if(|a, b| a % 2 == 0 && b % 2 == 0),
Some((0, 4))
);
assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next_back(), Some(3));
assert_eq!(iter.peek(), Some(&2));
assert_eq!(iter.peek_back(), Some(&2));
assert_eq!(iter.next_front_back_if_eq(&2, &2), None);
assert_eq!(iter.next(), Some(2));
assert_eq!(iter.next(), None);
请注意,DoubleEndedPeekableExt
为每个Iterator
都实现了,但DoubleEndedPeekable
的一些方法仅针对实现了DoubleEndedIterator
的类型实现。
功能
-
所有来自
Peekable
的抽象。 -
Peekable
提供的方法的*_back_*
变体。所有这些方法都像它们的前端版本一样工作,不同之处在于它们从迭代器的末尾到开头操作(就像
DoubleEndedIterator
做的那样)。 -
next_front_back_if
:如果条件满足,则同时向前和向后移动迭代器的两个侧面。条件由一个函数表示,该函数接受对下一个和下一个后面元素的引用,并返回一个布尔值,指示迭代器的侧面是否需要前进。 -
next_front_back_if_eq
:与next_front_back_if
类似,不同之处在于它直接接受对下一个和下一个后面元素的引用,而不是一个函数。