use std::{ io::{ self, Read, }, error::Error, marker::{ Send, Sync, }, }; /// Read whole stdin pub fn stdin() -> io::Result { let mut buffer = String::new(); io::stdin().read_to_string(&mut buffer)?; Ok(buffer) } /// Read each line with lambda pub fn stdin_lines Result>(mut callback: F) -> io::Result where E: Into> { let mut lines=0; let mut input = String::new(); let stdin = io::stdin(); while match stdin.read_line(&mut input) { Ok(0) => return Ok(lines), Err(e) => return Err(e), Ok(v) if input.as_bytes()[v-1] == b'\n' => callback(&input[..v]).or_else(|e| Err(io::Error::new(io::ErrorKind::Other, e)))?, Ok(_) => callback(&input[..]).or_else(|e| Err(io::Error::new(io::ErrorKind::Other, e)))?, } { input.clear(); lines+=1; } Ok(lines) }