From ee5dd7b9123a9239e7646452773abe46fe272d30 Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Sun, 27 Aug 2017 14:03:01 -0400 Subject: Add: 'some' tool reads random lines from input --- src/main.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/main.rs (limited to 'src') diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..eda1c01 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,62 @@ +extern crate clap; +extern crate rand; + +use clap::{Arg, App}; +use std::collections::vec_deque::VecDeque; +use std::io::{self, BufRead}; +use std::result::Result; + +fn some>>( + r: &mut R, + n: usize, + lines: T, +) -> Result, io::Error> { + let mut result: VecDeque = VecDeque::with_capacity(n); + fn push(v: &mut VecDeque, n: usize, x: String) { + v.push_back(x); + if v.len() > n { + v.pop_front(); + } + }; + + for (i, line) in lines.enumerate() { + let line = line?; + if result.len() < n { + push(&mut result, n, line); + } else if r.gen_range(0, i) < n { + let victim = r.gen_range(0, n); + result.remove(victim); + push(&mut result, n, line); + } + } + return Ok(result); +} + +fn main() { + let matches = App::new("some") + .version("0.1") + .author("Kjetil Ørbekk ") + .arg( + Arg::with_name("lines") + .short("n") + .value_name("NUM") + .help("Number of lines to print") + .takes_value(true), + ) + .get_matches(); + let num_lines = matches + .value_of("lines") + .unwrap_or("10") + .parse::() + .expect("number of lines to print"); + let stdin = io::stdin(); + let lines = some(&mut rand::thread_rng(), num_lines, stdin.lock().lines()); + match lines { + Ok(lines) => { + for line in lines { + println!("{}", line); + } + } + Err(e) => println!("Error: {}", e), + } +} -- cgit v1.2.3