//! 258. Index-value pairs with enumerate()
//!
//! `enumerate()` adds a zero-based index to every iterator element.
fn main() {
let fruits = ["apple", "banana", "cherry", "date"];
for (i, fruit) in fruits.iter().enumerate() {
println!("{}: {}", i, fruit);
}
let even_indexed: Vec<_> = fruits.iter()
.enumerate()
.filter(|(i, _)| i % 2 == 0)
.map(|(_, v)| *v)
.collect();
println!("Even-indexed: {:?}", even_indexed);
let numbered: Vec<String> = fruits.iter()
.enumerate()
.map(|(i, f)| format!("{}. {}", i + 1, f))
.collect();
println!("Numbered: {:?}", numbered);
let found = fruits.iter()
.enumerate()
.find(|(_, f)| f.starts_with('c'));
println!("First 'c' word: {:?}", found);
let scores = [88u32, 72, 95, 60];
let grades: Vec<(usize, &str)> = scores.iter()
.enumerate()
.map(|(i, &s)| (i, if s >= 90 { "A" } else if s >= 80 { "B" } else { "C" }))
.collect();
println!("Grades: {:?}", grades);
}
#[cfg(test)]
mod tests {
#[test]
fn test_enumerate_indices() {
let v = ["a", "b", "c"];
let indices: Vec<usize> = v.iter().enumerate().map(|(i, _)| i).collect();
assert_eq!(indices, vec![0, 1, 2]);
}
#[test]
fn test_enumerate_values() {
let v = [10i32, 20, 30];
let result: Vec<i32> = v.iter()
.enumerate()
.map(|(i, &val)| val + i as i32)
.collect();
assert_eq!(result, vec![10, 21, 32]);
}
#[test]
fn test_enumerate_filter_even() {
let v = ["a", "b", "c", "d"];
let even: Vec<_> = v.iter()
.enumerate()
.filter(|(i, _)| i % 2 == 0)
.map(|(_, v)| *v)
.collect();
assert_eq!(even, vec!["a", "c"]);
}
}
(* 258. Index-value pairs with enumerate() - OCaml *)
let () =
let fruits = ["apple"; "banana"; "cherry"] in
List.iteri (fun i fruit ->
Printf.printf "%d: %s\n" i fruit
) fruits;
let evens_only = List.filteri (fun i _ -> i mod 2 = 0) fruits in
Printf.printf "Even indices: %s\n" (String.concat ", " evens_only);
let indexed_names = List.mapi (fun i name ->
Printf.sprintf "#%d %s" (i + 1) name
) fruits in
List.iter print_endline indexed_names