Documentation
use spaik::nkgc::*;
use spaik::parse::parse;
use std::time::SystemTime;

pub fn fuck(ar: &mut Arena) {
    ar.push_new(String::from("FUCK"));
    ar.push_new(String::from("FUCK FUCK"));
    ar.push_new(String::from("FUCK FUCK FUCK"));
    ar.push_new(String::from("FUCK FUCK FUCK FUCK"));
    ar.push_new(String::from("FUCK FUCK FUCK FUCK FUCK"));
    ar.push_new(String::from("YEEEEEEEEEEEEE BOIIIIIII"));
    ar.list(6);
}

fn print_stats(start_time: SystemTime, ar: &Arena) {
    println!("{},{}",
             SystemTime::now().duration_since(start_time).unwrap().as_micros(),
             ar.stats().usage);
}

pub fn main() {
    let num = 500;
    let mut ar = Arena::new(8192 * 2);
    let start_time = SystemTime::now();
    fuck(&mut ar);
    ar.pop().unwrap();
    fuck(&mut ar);
    let v = parse("(defun (x y z) (println (cos (+ (/ x y) z))) (println \"test\"))").unwrap();
    for i in 0..num {
        fuck(&mut ar);
        ar.push_new(String::from("FUCK"));
        ar.pop().unwrap();
        ar.pop().unwrap();
        ar.push_ast(&*v);
        if i % 5 != 0 {
            ar.pop().unwrap();
        }
        ar.collect();
        print_stats(start_time, &ar);
    }
    while ar.pop().is_ok() {
        ar.collect();
        fuck(&mut ar);
        ar.push_ast(&*v);
        ar.pop().unwrap();
        ar.pop().unwrap();
        print_stats(start_time, &ar);
    }
    ar.full_collection();
    print_stats(start_time, &ar);
}