//! 272. One-level flattening with flatten()
//!
//! `flatten()` removes exactly one level of iterator nesting.
fn main() {
let nested = vec![vec![1i32, 2], vec![3, 4], vec![5, 6]];
let flat: Vec<i32> = nested.into_iter().flatten().collect();
println!("Flattened: {:?}", flat);
// Flatten Option<Option<T>>
let opt_opt: Option<Option<i32>> = Some(Some(42));
println!("Some(Some(42)).flatten() = {:?}", opt_opt.flatten());
println!("Some(None).flatten() = {:?}", Some(None::<i32>).flatten());
println!("None.flatten() = {:?}", None::<Option<i32>>.flatten());
// Flatten iterator of Options
let opts: Vec<Option<i32>> = vec![Some(1), None, Some(3), None, Some(5)];
let values: Vec<i32> = opts.into_iter().flatten().collect();
println!("Option values: {:?}", values);
// Flatten text lines into words
let text = "hello world
foo bar baz
rust";
let words: Vec<&str> = text.lines()
.map(|line| line.split_whitespace())
.flatten()
.collect();
println!("All words: {:?}", words);
}
#[cfg(test)]
mod tests {
#[test]
fn test_flatten_vec_vec() {
let nested = vec![vec![1i32, 2], vec![3, 4]];
let flat: Vec<i32> = nested.into_iter().flatten().collect();
assert_eq!(flat, vec![1, 2, 3, 4]);
}
#[test]
fn test_flatten_option() {
assert_eq!(Some(Some(42i32)).flatten(), Some(42));
assert_eq!(Some(None::<i32>).flatten(), None);
assert_eq!(None::<Option<i32>>.flatten(), None);
}
#[test]
fn test_flatten_options_in_iter() {
let v: Vec<Option<i32>> = vec![Some(1), None, Some(3)];
let result: Vec<i32> = v.into_iter().flatten().collect();
assert_eq!(result, vec![1, 3]);
}
}
(* 272. One-level flattening with flatten() - OCaml *)
let () =
let nested = [[1; 2]; [3; 4]; [5; 6]] in
let flat = List.concat nested in
Printf.printf "Flattened: %s\n"
(String.concat ", " (List.map string_of_int flat));
let words = ["hello"; "world"] in
let all_chars = List.concat_map
(fun w -> List.init (String.length w) (fun i -> w.[i]))
words in
Printf.printf "Chars: %s\n"
(String.concat " " (List.map (String.make 1) all_chars));
let opts = [Some 1; None; Some 3; None; Some 5] in
let values = List.filter_map Fun.id opts in
Printf.printf "Option values: %s\n"
(String.concat ", " (List.map string_of_int values))