mozilla/mentat

Improve pattern for finite-length iterators in flat_map expansions

Open

#261 opened on 2017年2月8日

GitHub で見る
 (1 comment) (0 reactions) (0 assignees)Rust (116 forks)github user discovery
enhancementhelp wantedhygieneready

Repository metrics

Stars
 (1,661 stars)
PR merge metrics
 (PR metrics pending)

説明

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.

コントリビューターガイド