typetui 0.2.1

A terminal-based typing test.
Documentation
fn ownership_basics() {
    let s1 = String::from("hello");
    let s2 = s1;
    println!("{}", s2);

    let x = 5;
    let y = x;
    println!("x = {}, y = {}", x, y);
}

fn borrowing_examples() {
    let mut s = String::from("hello");

    let r1 = &s;
    let r2 = &s;
    println!("{} and {}", r1, r2);

    let r3 = &mut s;
    r3.push_str(" world");
    println!("{}", r3);
}

fn lifetimes_demo<'a>() {
    let s1 = String::from("long string");
    {
        let s2 = String::from("xyz");
        let result = longest(&s1, &s2);
        println!("Longest: {}", result);
    }
}

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() { x } else { y }
}

fn move_semantics() {
    let data = vec![1, 2, 3, 4, 5];
    
    let doubled: Vec<i32> = data.into_iter()
        .map(|x| x * 2)
        .collect();
    
    println!("Doubled: {:?}", doubled);
}

fn clone_example() {
    let s1 = String::from("hello");
    let s2 = s1.clone();
    
    println!("s1 = {}, s2 = {}", s1, s2);
}

fn reference_counting() {
    use std::rc::Rc;
    
    let data = Rc::new(String::from("shared data"));
    let data2 = Rc::clone(&data);
    let data3 = Rc::clone(&data);
    
    println!("Reference count: {}", Rc::strong_count(&data));
    println!("Data: {}, {}, {}", data, data2, data3);
}

fn atomic_reference() {
    use std::sync::Arc;
    use std::thread;
    
    let data = Arc::new(String::from("thread-safe data"));
    let data2 = Arc::clone(&data);
    
    let handle = thread::spawn(move || {
        println!("In thread: {}", data2);
    });
    
    println!("In main: {}", data);
    handle.join().unwrap();
}

fn slice_examples() {
    let s = String::from("hello world");
    
    let hello = &s[0..5];
    let world = &s[6..11];
    
    println!("hello: {}, world: {}", hello, world);
    
    let a = [1, 2, 3, 4, 5];
    let slice = &a[1..3];
    println!("Array slice: {:?}", slice);
}

fn box_smart_pointer() {
    let b = Box::new(5);
    println!("Box value: {}", b);
    
    let list = Box::new(Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil)))))));
    println!("List created");
}

enum List {
    Cons(i32, Box<List>),
    Nil,
}

fn deref_trait() {
    let x = 5;
    let y = &x;
    
    assert_eq!(5, x);
    assert_eq!(5, *y);
}

fn main() {
    ownership_basics();
    borrowing_examples();
    lifetimes_demo();
    move_semantics();
    clone_example();
    reference_counting();
    atomic_reference();
    slice_examples();
    box_smart_pointer();
    deref_trait();
}