Rust Iterator Cheat Sheet

3 min read Original article ↗
IT batching {a0,…⏟,ai,…⏟,…}:{T}, batch:&mut {T}→U {c0⏟batch({a0,…}),c1⏟batch({ai,…}),…}:{U} IT cartesian_product {a0,a1,…,an−1}, {b0,b1,…,bm−1} {(a0,b0),(a0,b1),…,(a0,bm−1),  (a1,b0),(a1,b1),…,(a1,bm−1)  …,  (an−1,b0),(an−1,b1),…,(an−1,bm−1)} Std chain {a0,…,an−1}, {b0,…,bm−1} {a0,…,an−1,b0,…,bm−1} IT chunks {a0,…}, m {{a0,…,am−1},{am,…,a2m−1},…} Std cmp {a0,…,ai}, {b0,…,bi,bi+1,…_} cmp(a0,b0) then … then cmp(ai,bi) then Less {a0,…,ai}, {b0,…,bi} cmp(a0,b0) then … then cmp(ai,bi) then Equal {a0,…,ai,ai+1,…_}, {b0,…,bi} cmp(a0,b0) then … then cmp(ai,bi) then Greater IT coalesce {a0,a1,a2,…} f:(T,T)→Ok(T) | Err((T,T)) {x0,…}wh.{f(a0,a1)=Ok(x0),…or{a0′,x1,…}wh.{f(a0,a1)=Err((a0′,a1′)),f(a1′,a2)=Ok(x1),…or{a0′,a1″,…}wh.{f(a0,a1)=Err((a0′,a1′)),f(a1′,a2)=Err(a1″,a2′),… Std collect {a0,…} [a0,…] IT collect_vec {a0,…} [a0,…]:Vec⟨T⟩ Std cycle {a0,…,an−1} {a0,…,an−1,a0,…,an−1,…} IT dedup {a0,a0,…⏟,a1,a1,…⏟,…} {a0,a1,…} IT dropping {a0,…,ai−1⏟consumed,ai,…} i wh. i<n {ai,…} (consumes a0…ai−1 immediately) {a0,…,an−1⏟consumed} i wh. i≥n {} (consumes a0…an−1 immediately) IT dropping_back {a0,…,an−i−1,an−i,…,an−1⏟consumed} i wh. i<n {a0,…,an−i−1} (consumes an−i…an immediately) {a0,…,an−1⏟consumed} i wh. i≥n {} (consumes a0…an immediately) Std enumerate {a0,a1,…} {(0,a0),(1,a1),…} Std eq {a0,…,an−1}, {b0,…,bm−1} false wh. n≠m (a0=b0)∧…∧(an−1=bn−1) Std filter {a0,a1,…}, p:&T→bool {ai for all i wh. p(&ai)} Std filter_map {a0,a1,…}, f:T→Some(U) | None {xi for all i where f(ai)=Some(xi)} Std flat_map {a0,a1,…}, f:T→{U} {x0,x1,…⏟x=f(a0),y0,y1,…⏟y=f(a1),…} IT flatten {{a0,…},{b0,…},…}, {a0,…,b0,…} Std ge {a0,…,an−1}, {b0,…,bm−1} false wh. n<m (a0≥b0)∧…∧(an−1≥bn−1) IT group_by {a0,…,ai−1⏟g(ax)=g0,ai,…,aj−1⏟g(ay)=g1≠g0,aj,…,ak−1⏟g(az)=g2≠g1,…}, g:&T→G {(g0,{a0,…,ai−1}),  (g1,{ai,…,aj−1}),  (g2,{aj,…,ak−1}),…} Std gt {a0,…,an−1}, {b0,…,bm−1} false wh. n<m (a0>b0)∧…∧(an−1>bn−1) IT interleave {a0,a1,…,ai−1,ai,…}, {b0,b1,…,bi−1} {a0,b0,a1,b1,…,ai−1,bi−1,ai,…} {a0,a1,…,ai−1}, {b0,b1,…,bi−1} {a0,b0,a1,b1,…,ai−1,bi−1} {a0,a1,…,ai−1}, {b0,b1,…,bi−1,bi,…} {a0,b0,a1,b1,…,ai−1,bi−1,bi,…} IT interleave_shortest {a0,a1,…,ai−1,ai,…_}, {b0,b1,…,bi−1} {a0,b0,a1,b1,…,ai−1,bi−1,ai} {a0,a1,…,ai−1} {b0,b1,…,bi−1,bi,…_} {a0,b0,a1,b1,…,ai−1,bi−1} IT intersperse {a0,a1,…,an−1} b {a0,b,a1,b,…,b,an−1} IT kmerge {{a0,…},{b0,…},…} wh.  sorted(a), sorted(b),… {c0,c1,…} wh. c0≤c1≤…,  a⊆c,b⊆c,… IT kmerge_by {{a0,…},{b0,…},…} wh.  sorted_by(a,∘), sorted_by(b,∘),…, ∘:(&T,&T)→bool {c0,c1,…} wh. c0∘c1∘…,  a⊆c,b⊆c,… Std map {a0,a1,…}, f:T→U {f(a0),f(a1),…} IT map_fn {a0,a1,…}, f:fn(T)→U {f(a0),f(a1),…} IT map_results {a0,…}:{Ok(T) | Err(E)}, f:(T)→U {a0.map(f),…}:{Ok(U) | Err(E)} IT merge {a0,a1,…} wh. a0≤a1≤…, {b0,b1,…} wh. b0≤b1≤… {c0,c1,…} wh. c0≤c1≤…,a⊆c,b⊆c IT merge_by {a0,a1,…} wh. a0∘a1∘…, {b0,b1,…} wh. b0∘b1∘…, ∘:(&T,&T)→Ordering {c0,c1,…} wh. c0∘c1∘…,a⊆c,b⊆c IT pad_using {a0,…,an−1}, m,    f:i→T {a0,…,an−1} wh. n>=m{a0,…,an−1,f(n),…,f(m−1)} otherwise Std partial_cmp {a0,…,ai}, {b0,…,bi,bi+1,…_} pcmp(a0,b0) then … then pcmp(ai,bi) then Less {a0,…,ai}, {b0,…,bi} pcmp(a0,b0) then … then pcmp(ai,bi) then Equal {a0,…,ai,ai+1,…_}, {b0,…,bi} pcmp(a0,b0) then … then pcmp(ai,bi) then Greater Std partition {a0,a1,…}, f:&T→bool ([ai for all i wh. f(&ai)=true],  [ai for all i wh. f(&ai)=false]) IT partition_map {a0,a1,…}, f:T→Left(L) | Right(R) ([xi for all i wh. f(ai)=Left(xi)],  [xi for all i wh. f(ai)=Right(xi)]) Std rev {a0,a1,…,an−2,an−1} {an−1,an−2,…,a1,a0} Std scan {a0,a1,…}, s:&mut S, f:(&mut S,T)→Some(U) | None {xi for all i wh. f(s,ai)=Some(xi)} Std skip {a0,…,ai−1,ai,…}, i {ai,…} {a0,…,an−1}, i wh. i≥n {} Std skip_while {a0,…,ai,…}, p:&T→bool {ai,…} wh. i is first wh. p(&ai) IT sorted {a0,…} [c0,…]:Vec⟨T⟩ wh. c0≤c1≤… IT sorted_by {a0,…} ∘:(&T,&T)→Ordering [c0,…]:Vec⟨T⟩ wh. c0∘c1∘… IT step {a0,…,am,…,a2m,…}, m {a0,am,a2m,…} Std take {a0,…,ai−1,ai,…_}, i {a0,…,ai−1} {a0,…,an−1}, i wh. i≥n {a0,…,an−1} Std take_while {a0,…,ai−1,ai,…_}, p:&T→bool {a0,…,ai−1} wh. i is first wh. p(&ai)=false IT take_while_ref &mut {a0,…,ai−1,ai,…_}, p:&T→bool {a0,…,ai−1} wh. i is first wh. p(&ai)=false IT tee {a0,a1,…} ({a0,a1,…},{a0,a1,…}) IT tuple_windows {a0,…} ⟨(_,_,…⏟n)⟩ {(a0,…,an−1),(a1,…,an),…} IT tuples {a0,…} ⟨(_,_,…⏟n)⟩ {(a0,…,an−1),(an,…,a2n−1),…} IT unique {a0,…} {ai for all i wh. ai∉{a0,…,ai−1}} IT unique_by {a0,…}, f:&T→U {ai for all i wh. f(ai)∉{f(a0),…,f(ai−1)}} Std unzip {(a0,b0),(a1,b1),…} ([a0,a1,…],[b0,b1,…]) IT while_some {a0,…,ai−1,ai,…_}, {xj for all j<i wh. aj=Some(xj)} wh. i is the first wh. ai=None IT with_position {a0} {Only(a0)} {a0,a1,…,an−2,an−1} {First(a0),Middle(a1),…,  Middle(an−2),Last(an−1)} Std zip {a0,…,ai}, {b0,…,bi,bi+1,…_} {(a0,b0),…,(ai,bi)} {a0,…,ai,ai+1,…_}, {b0,…,bi} IT zip_eq {a0,…,an−1}, {b0,…,bm−1} {(a0,b0),…,(an−1,bn−1)},  panic wh. n≠m IT zip_longest {a0,…,ai−1,ai,…}, {b0,…,bi−1} {Both(a0,b0),…,Both(ai−1,bi−1),Left(ai),…} {a0,…,ai−1}, {b0,…,bi−1} {Both(a0,b0),…,Both(ai−1,bi−1)} {a0,…,ai−1}, {b0,…,bi−1,bi,…} {Both(a0,b0),…,Both(ai−1,bi−1),Right(bi),…}