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.
There are a bunch of places where we want to turn a collection of tuples (like
Vec<(A, B, C)>) into a flat iterator, likeA1, B1, C1, A2, B2, C2, .... The pattern we're using right now is to combineflat_mapandstd::iter::once, like: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_2andonce_3?), orimpl (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.