mozilla/mentat

Improve pattern for finite-length iterators in flat_map expansions

Open

#261 aperta il 8 feb 2017

Vedi su GitHub
 (1 commento) (0 reazioni) (0 assegnatari)Rust (116 fork)github user discovery
enhancementhelp wantedhygieneready

Metriche repository

Star
 (1661 star)
Metriche merge PR
 (Metriche PR in attesa)

Descrizione

There are a bunch of places where we want to turn a collection of tuples (like Vec<(A, B, C)>) into a flat iterator, like A1, B1, C1, A2, B2, C2, .... The pattern we're using right now is to combine flat_map and std::iter::once, like:

collection.flat_map(|(a, b)| once(a).chain(once(b)))

That avoids heap allocation in favour of stack allocation, but gets pretty gnarly when the tuple length increases. For example:

This ticket tracks doing something better. Perhaps a few helper functions (like once_2 and once_3?), or impl (A, B) { fn once(...) { } }, or a macro to at least make the callsite easier to read.

This is probably not a good first bug unless you're strong in Rust, because some taste is required to determine what's better than the pattern we have now.

Guida contributor