struct S(u32); fn offer(out: &mut Vec, s: Option) { if let Some(s) = s { out.push(s) } } fn offer_reach(out: &mut Vec, ranked: impl IntoIterator, tol: f64, mut chip: impl FnMut(T) -> Option) { for (d, item) in ranked { if d > tol { break; } offer(out, chip(item)); } } fn ranked(found: Vec<(f64, usize, Vec)>) -> impl Iterator))> { found.into_iter().map(|(d, p, s)| (d, (p, s))) } fn chip(scheme: &[u32], label: String) -> Option { Some(S(scheme.len() as u32 + label.len() as u32)) } fn main() { let mut out = Vec::new(); offer_reach(&mut out, ranked(vec![(1.0, 0, vec![1, 2])]), 2.0, |(_, scheme)| chip(&scheme, String::new())); let named: Vec<(f64, (String, Vec))> = vec![(0.5, ("a".to_string(), vec![3]))]; offer_reach(&mut out, named, 2.0, |(label, scheme)| chip(&scheme, label)); assert_eq!(out.len(), 2); println!("{}", out.len()); } #[test] fn closure_arg_projection_infer() { main(); }