#![allow(dead_code)] #![feature(trait_alias)] // 1. Linked List // 2. Binary Search Tree // 3. HashMap /w Vec mod pbst; mod phash; mod plist; mod vbst; mod vhash; mod vlist; use std::env; pub trait Prog { fn perform(f: F); fn exec(&self, args: Vec) -> bool; fn help(); fn next(args: &Vec, i: &mut usize) -> Option { if *i < args.len() { *i += 1; Some(args[*i - 1].clone()) } else { None } } fn repeat(&self, args: &Vec, i: usize, mut n: usize) -> bool { let mut v = args[i..].to_vec().clone(); v.insert(0, "nop".to_string()); v.insert(0, "nop".to_string()); while n > 1 { if !self.exec(v.clone()) { return false; } n -= 1; } true } fn run(&self, filename: &str) -> bool { let contents = std::fs::read_to_string(filename).unwrap(); let mut args: Vec = contents.split_whitespace().map(|x| x.to_string()).collect(); args.insert(0, "nop".to_string()); args.insert(0, "nop".to_string()); self.exec(args) } } fn perform(args: Vec) { T::perform(|store| { store.exec(args); }); } fn main() { let args: Vec = env::args().collect(); if args.len() < 2 { println!( "usage: {} [vlist|plist|vbst|pbst|vhash|phash] [OPERATION]", args[0] ) } else { let tp = &args[1]; if tp == "vlist" { perform::>(args) } else if tp == "plist" { perform::>(args) } else if tp == "vbst" { perform::>(args) } else if tp == "pbst" { perform::>(args) } else if tp == "vhash" { perform::>(args) } else if tp == "phash" { perform::>(args) } } }