//! 267. Infinite cycling with cycle()
//!
//! `cycle()` repeats a finite iterator infinitely. Requires `Clone` on the inner iterator.
fn main() {
let colors = ["red", "green", "blue"];
let cycled: Vec<_> = colors.iter().cycle().take(9).collect();
println!("Cycled colors: {:?}", cycled);
let items = ["a", "b", "c", "d", "e"];
let roles = ["leader", "follower"];
let assigned: Vec<_> = items.iter()
.zip(roles.iter().cycle())
.map(|(item, role)| format!("{}->{}", item, role))
.collect();
println!("Assigned: {:?}", assigned);
let alternating: Vec<bool> = [true, false].iter().copied()
.cycle().take(8).collect();
println!("Alternating: {:?}", alternating);
let weights = [1u32, 3, 7];
let digits = [4u32, 5, 6, 7, 8, 9];
let checksum: u32 = digits.iter()
.zip(weights.iter().cycle())
.map(|(d, w)| d * w)
.sum();
println!("Weighted checksum: {}", checksum);
let days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
let first_two: Vec<_> = days.iter().cycle().enumerate().take(14)
.map(|(i, day)| format!("Day {}: {}", i+1, day))
.collect();
println!("First week: {:?}", &first_two[..7]);
}
#[cfg(test)]
mod tests {
#[test]
fn test_cycle_basic() {
let result: Vec<i32> = [1, 2, 3].iter().copied().cycle().take(7).collect();
assert_eq!(result, vec![1, 2, 3, 1, 2, 3, 1]);
}
#[test]
fn test_cycle_zip_round_robin() {
let items = [1i32, 2, 3, 4];
let labels = ["a", "b"];
let paired: Vec<_> = items.iter().zip(labels.iter().cycle()).collect();
assert_eq!(paired.len(), 4);
assert_eq!(*paired[2].1, "a");
}
#[test]
fn test_cycle_alternating() {
let alt: Vec<bool> = [true, false].iter().copied().cycle().take(6).collect();
assert_eq!(alt, vec![true, false, true, false, true, false]);
}
}
(* 267. Infinite cycling with cycle() - OCaml *)
let cycle lst =
let arr = Array.of_list lst in
let n = Array.length arr in
let i = ref 0 in
Seq.forever (fun () -> let v = arr.(!i mod n) in incr i; v)
let () =
let colors = ["red"; "green"; "blue"] in
let cycled = cycle colors in
let first9 = Seq.take 9 cycled |> List.of_seq in
Printf.printf "Colors: %s\n" (String.concat ", " first9);
let items = ["a"; "b"; "c"; "d"; "e"] in
let roles = cycle ["leader"; "follower"] in
let pairs = List.map2 (fun item role -> Printf.sprintf "%s->%s" item role)
items (Seq.take 5 roles |> List.of_seq) in
List.iter print_endline pairs