// A unit struct without resources
#[deriving(Show, Copy)]
struct Nil;

// A tuple struct with resources that implements the `Clone` trait
#[deriving(Clone,Show)]
struct Pair(Box<int>, Box<int>);

fn main() {
    // Instantiate `Nil`
    let nil = Nil;
    // Copy `Nil`, there are no resources to move
    let copied_nil = nil;

    // Both `Nil`s can be used independently
    println!("original: {}", nil);
    println!("copy: {}", copied_nil);

    // Instantiate a `Pair`
    let pair = Pair(box 1, box 2);
    println!("original: {}", pair);

    // Copy `pair` into `moved_pair`, moves resources
    let moved_pair = pair;
    println!("copy: {}", moved_pair);

    // Error! `pair` has lost it resources
    //println!("original: {}", pair);
    // TODO ^ Try uncommenting this line

    // "Clone" `moved_pair` into `cloned_pair` (resources included)
    let cloned_pair = moved_pair.clone();

    // `Drop` the original pair
    drop(moved_pair);

    // Error! `moved_pair` has been `drop`ed
    //println!("copy: {}", moved_pair);
    // TODO ^ Try uncommenting this line

    // Clone can still be used
    println!("clone: {}", cloned_pair);
}
