#stream #remember #buffer #unconsume

stream-unconsume

部分消费流并保持其不变

1 个不稳定版本

0.3.1 2020年5月31日

#13#remember

MIT/Apache

13KB
147 行(不包括注释)

API Docs Downloads

stream-unconsume

部分轮询流并获取已发出的项目!有时让某人轮询你的流,但又能将其恢复原样,这很有用。为此,这个 crate 提供了函数 remember,它接受流,返回一个包含未来和流的元组。您可以将返回的流移动到任何函数中,从而丢失它,但当它被丢弃时,从 remember 返回的未来将与新的流解析,该流提供了从原始流中消费的所有项目,以及该流的其余部分,因此您可以像从未轮询原始流一样使用它。

您可以使用任何类型作为缓冲区,只要它实现了 IntoIterator<Item=Source::Item>Push<Source::Item>,其中 Source 是您想要反消费的流的类型。有一个方便的函数 remember_vec,用于使用 Vec 作为缓冲区后端(其他后端可能是 LinkedListVecDeque 等)。我们使用 Push 而不是,例如,PushBack,让用户在需要时忽略顺序。例如,考虑如果您将流收集到 HashSet 中。如果您这样做,则在元素到达时就会跳过重复的元素。但是,如果您使用我们的 remember_vec 函数,StreamBuffer 将保留所有这些重复元素,消耗内存,让您在获取流返回时再丢弃它们。注意,Push 将使用这种方法添加元素,如果后端集合保留插入顺序(例如 Vec 但不是 HashSet),则对该集合的迭代也将是按插入顺序进行的。换句话说,如果您使用 LinkedList,则 Push 将执行 push_back,而不是您可能期望的 push_front。注意:Rust 不保证总是调用 Drop,因此您在等待返回的未来时可能需要使用超时,否则您将无限期地等待其解析!

当前版本:0.3.0

许可证:MIT 或 Apache-2.0

依赖关系

~1MB
~16K SLoC