mozilla/mentat

Improve pattern for finite-length iterators in flat_map expansions

Open

#261 aberto em 8 de fev. de 2017

Ver no GitHub
 (1 comment) (0 reactions) (0 assignees)Rust (116 forks)github user discovery
enhancementhelp wantedhygieneready

Métricas do repositório

Stars
 (1.661 stars)
Métricas de merge de PR
 (Métricas PR pendentes)

Description

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.

Guia do colaborador