1 个不稳定版本

0.1.0 2020年8月2日

#1905Rust 模式

BSD-2-Clause 协议

32KB
665 行(不含注释)

cor_iter

一个相关联的迭代器,其中两个迭代器轮流返回不同数量的项。

使用方法

将以下行放入 cargo.toml

cor_iter = "*"

使用 trait Correlate 和 enum Either.

use cor_iter::{Correlate, Either};

它将为实现 core::iter::IntoIterator 的任何东西提供两个方法。

第一个方法是 linear_correlate。参数 a 确定在从另一个迭代器返回值之前要返回的对象数量。如果 a 为正,则表示主迭代器的数量。如果 a 为负,则表示次要迭代器的数量。

参数 b 确定从迭代器返回的第一个绝对值为 b 项。如果 b 为正,则表示来自主迭代器的第一个绝对值为 b 的项。如果 b 为负,则表示来自次要迭代器的第一个绝对值为 b 的项。

// First 12 object came from `vec_obj1` because `b` is 2 and `a` is 10.
// Object 13 came from `vec_obj2`. Object 14 - 24 then came from `vec_obj1`
// then object 25 came from `vec_obj2`. Object 26 - 36 then came from `vec_obj1` and so on.
vec_obj1.linear_correlate(vec_obj2, 10, 2).for_each(|result| {
    match result {
        Either::Primary(p) => {
            // do something with object from `vec_obj1`
        },
        Either::Secondary(s) => {
            // do something with obj from `vec_obj2`
        }
    }
});

第二个方法是 correlate_with。它接受一个闭包,如果它返回 true,则下一个值将来自主迭代器。如果闭包返回 false,则下一个值将来自次要迭代器。

// Keep iterate on primary iterator while the value is less than 5 then it yield from secondary iterator.
// It will keep iterate on secondary iterator until value is greater than -5 then it yield from primary iterator.
vec_1.iter().correlate_with(&vec_2, |current| {
    match current {
        Either::Primary(p) => {
            **p < 5 // when current p is >= 5, it mean that it's consume up to this **p value
        },
        Either::Secondary(s) => {
            **s > -5 // when current p is > -5, it mean that it's consume up to this **p value
        }
    }
}).for_each(|result| {
    match result {
        Either::Primary(p) => {
            // do something with value from vec_1
        },
        Either::Secondary(s) => {
            // do something with value from vec_2
        }
    }
});

注意事项

correlate_with 方法将返回一个迭代器,其第一个值将始终来自左侧迭代器。与 linear_correlate 不同,其中负 b 使迭代器的第一个 b 值来自右侧。

依赖关系

~155KB