//! 279. Random access with nth()
//!
//! `nth(n)` returns `Option<T>` at index n, consuming elements 0..n in the process.
fn main() {
let nums = [10i32, 20, 30, 40, 50];
// nth on a slice iterator
println!("0th: {:?}", nums.iter().nth(0));
println!("2nd: {:?}", nums.iter().nth(2));
println!("Out of bounds: {:?}", nums.iter().nth(10));
// nth consumes elements โ re-use iterator
let mut iter = nums.iter();
println!("iter.nth(1) = {:?}", iter.nth(1)); // 20
println!("iter.nth(0) = {:?}", iter.nth(0)); // 30 (iterator advanced)
// nth on a filtered iterator (O(n))
let second_even = (0i32..20).filter(|x| x % 2 == 0).nth(3);
println!("4th even in 0..20: {:?}", second_even);
// Practical: skip header, get second data line
let csv = "name,age
Alice,30
Bob,25
Carol,35";
let second_row = csv.lines().nth(2);
println!("Third line of CSV: {:?}", second_row);
}
#[cfg(test)]
mod tests {
#[test]
fn test_nth_basic() {
let v = [10i32, 20, 30, 40];
assert_eq!(v.iter().nth(2), Some(&30));
}
#[test]
fn test_nth_out_of_bounds() {
let v = [1i32, 2];
assert_eq!(v.iter().nth(5), None);
}
#[test]
fn test_nth_advances_iterator() {
let mut it = [1i32, 2, 3, 4, 5].iter();
assert_eq!(it.nth(1), Some(&2)); // consumes 1,2
assert_eq!(it.nth(0), Some(&3)); // now at 3
}
#[test]
fn test_nth_zero() {
let v = [99i32];
assert_eq!(v.iter().nth(0), Some(&99));
}
}
(* 279. Random access with nth() - OCaml *)
let safe_nth lst n =
if n < 0 || n >= List.length lst then None
else Some (List.nth lst n)
let () =
let nums = [10; 20; 30; 40; 50] in
Printf.printf "0th: %s\n" (match safe_nth nums 0 with Some n -> string_of_int n | None -> "None");
Printf.printf "2nd: %s\n" (match safe_nth nums 2 with Some n -> string_of_int n | None -> "None");
Printf.printf "10th: %s\n" (match safe_nth nums 10 with Some n -> string_of_int n | None -> "None");
(* Nth after filtering *)
let evens = List.filter (fun x -> x mod 2 = 0) nums in
Printf.printf "2nd even: %s\n"
(match safe_nth evens 1 with Some n -> string_of_int n | None -> "None")