This article is great, and really distills why the ergonomics of Rust is so great and why languages like Julia are so awful in practice.
imap(f) = x -> Iterators.map(f, x)
ifilter(f) = x -> Iterators.filter(f, x)
v = things |>
ifilter(isodd) |>
imap(do_process) |>
collect