Crates.io | iter-n |
lib.rs | iter-n |
version | 0.1.0 |
source | src |
created_at | 2024-04-30 03:55:43.768557 |
updated_at | 2024-04-30 03:55:43.768557 |
description | A utility for functions returning impl Iterator to return one of several distinct types. |
homepage | |
repository | https://github.com/frozenlib/iter-n |
max_upload_size | |
id | 1224658 |
size | 313,167 |
A utility for functions returning impl Iterator to return one of several distinct types.
In functions that return impl Iterator
, it is necessary to return an iterator of a specific type. Therefore, it is not possible to return an iterator of a different type, as shown below.
fn f(x: i32) -> impl Iterator<Item = i32> {
if x % 2 == 0 {
[0, 1].iter().map(|y| y + 1)
} else {
[0, 1].iter().map(|y| y + 2) // ERROR: `if` and `else` have incompatible types
}
}
By using iter_n
, you can return an iterator of a different type from a function.
use iter_n::iter2::*
must be placed in function scope, not in module scope.
Since iter_n::iter2
, iter_n::iter3
, etc. define methods of the same name, if multiple use iter_n::iter{N}::*;
are placed in the module scope, there will be a conflict with the methods.
fn f(x: i32) -> impl Iterator<Item = i32> {
use iter_n::iter2::*;
if x % 2 == 0 {
[0, 1].iter().map(|y| y + 1).into_iter0()
} else {
[0, 1].iter().map(|y| y + 2).into_iter1()
}
}
fn g(x: i32) -> impl Iterator<Item = i32> {
use iter_n::iter3::*;
if x % 3 == 0 {
[0, 1].iter().map(|y| y + 1).into_iter0()
} else if x % 3 == 0 {
[0, 1].iter().map(|y| y + 2).into_iter1()
} else {
[0, 1].iter().map(|y| y + 3).into_iter2()
}
}
This project is dual licensed under Apache-2.0/MIT. See the two LICENSE-* files for details.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.