#![feature(random)] use std::{iter::repeat, random::random, str::Split, thread::sleep, time::Duration}; fn main() { let randomize = |s| random::(..).then_some(s); let mut sources = vec![ repeat("1234&567".to_owned()).filter_map(randomize), repeat("45&56&78&89".to_owned()).filter_map(randomize), repeat("789".to_owned()).filter_map(randomize), ]; let mut texts: Vec = vec![ "1234&567".to_owned(), "45&56&78&89".to_owned(), "789".to_owned(), ]; let mut iters: Vec> = texts.iter().map(|s| s.split('&')).collect(); loop { for iter in iters.iter_mut() { if let Some(s) = iter.next() { print!("{}", s); } } println!(""); let new_strings: Vec<(usize, String)> = sources .iter_mut() .enumerate() .filter_map(|(i, s)| s.next().map(|s| (i, s))) .collect(); for (i, s) in new_strings { drop(iters); texts[i] = s; // Want to rebuild one iterator for a new string // iters[i] = s.split('&'); iters = texts.iter().map(|s| s.split('&')).collect(); } sleep(Duration::from_millis(100)); } }