rust-lang / rust

Empowering everyone to build reliable and efficient software.
https://www.rust-lang.org
Other
97.86k stars 12.67k forks source link

Iterator Indexing #73482

Open jswrenn opened 4 years ago

jswrenn commented 4 years ago

Itertools is considering a PR introducing iterator indexing, implemented in the same manner as the core library's slice indexing mechanism. This playground link demonstrates the gist of it:

// `Itertools::get` indexes an iterator:
assert_eq!(
    (0..5).get(2).collect::<Vec<_>>(),
    vec![2]
);

assert_eq!(
    (0..5).get(..3).collect::<Vec<_>>(),
    vec![0, 1, 2]
);

assert_eq!(
    (0..5).get(2..).collect::<Vec<_>>(),
    vec![2, 3, 4]
);

I'm excited to merge this—it feels like something that ought to be in the standard library—but I want to avoid another {Itertools,Iterator}::flatten debacle; i.e., if the core library later adopts this same method, then itertools users calling this method will have builds break.

Would this addition be a good fit for the core library?

leonardo-m commented 4 years ago

Sounds awesome. It's similar to python itertools.islice function. But I'd like to use the normal array slicing syntax. After this we need a built-in way to match on iterators, and the basic needs are covered.

cuviper commented 4 years ago

But I'd like to use the normal array slicing syntax.

The problem is that operator Index only returns &Output, and IndexMut returns &mut Output, so you can't create a new value for the indexing result.

lachlansneff commented 4 years ago

An IndexableIter trait seems like an interesting idea.