#iterator #peekable #iterator-adapter #peek #lookahead #no-alloc #no-std

no-std 双端可窥视

为双端迭代器提供窥视功能的适配器

4 个版本

0.1.0 2024 年 1 月 28 日
0.1.0-alpha.12023 年 3 月 24 日
0.0.2 2023 年 3 月 12 日
0.0.1 2023 年 3 月 12 日

算法 中排名 436

Download history 16/week @ 2024-03-27 18/week @ 2024-04-03 3/week @ 2024-04-24 177/week @ 2024-05-01 213/week @ 2024-05-08 374/week @ 2024-05-15 139/week @ 2024-05-22 93/week @ 2024-05-29 123/week @ 2024-06-05 107/week @ 2024-06-12 59/week @ 2024-06-19 212/week @ 2024-06-26

每月下载量 526
4 个 crate 中使用 (通过 lsm-tree)

MIT 许可证

45KB
724

Double-Ended Peekable

version checks docs coverage licence

一个非常小的 crate,提供了对 Iterator 的额外抽象,以便将 Peekable 引入的概念提升到 DoubleEndedIterator

原因

使用 Peekable,您可以调用 peek 来获取迭代器中即将到来的元素的引用,您还可以使用 next_if/next_if_eq 仅当即将到来的元素满足某些条件时才将迭代器向前推进。

然而,当您需要从双端迭代器的开始和结束处执行这些操作时,这种抽象并不适用。例如,您不能即时执行以下操作:.by_ref().rev().peekable().peek().next(),因为即使这种方法看起来有效,实现时需要在Peekable实例中存储下一个元素(即next_back的对应项,以便更清晰地表达),这意味着使用刚才显示的片段时,被查看的元素将被丢弃。

如何使用

您只需导入扩展特质DoubleEndedPeekableExtDoubleEndedPeekableExt),以便轻松使用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类似,不同之处在于它直接接受对下一个下一个后面元素的引用,而不是一个函数。

无运行时依赖