use imbl::{HashMap, Vector};
use index_vec::Idx;
use std::cell::RefCell;
use std::ops::Range;
use std::rc::Rc;

struct Word(&'static str);

struct Keyword(&'static str);

struct Interned(&'static str);

enum StringPart {
    Word(&'static str),
    Data(&'static str),
    Inline(&'static str),
}

#[derive(Clone, Debug, PartialEq)]
struct LBox {
    name: usize,
    cell: RefCell<Value>,
}

#[derive(Clone, Debug, PartialEq)]
struct Fn {
    name: &'static str,
    body: Vec<String>,
    //...etc
}

#[derive(Clone, Debug, PartialEq)]
enum Value {
    Nil,
    Placeholder,
    Boolean(bool),
    Keyword(usize),
    Interned(usize),
    FnDecl(usize),
    String(Rc<String>),
    Number(f64),
    Tuple(Rc<Vec<Value>>),
    List(Box<Vector<Value>>),
    Dict(Box<HashMap<&'static str, Value>>),
    Box(Rc<LBox>),
    Fn(Rc<RefCell<Fn>>),
}

fn futz() {
    let foo: &'static str = "foo";
    let baz: Vec<u8> = vec![];
    let bar: Range<usize> = 1..3;
    let quux: Vector<u8> = Vector::new();
    let fuzz = Rc::new(quux);
    let blah = Box::new(foo);
    let val = Value::Number(12.09);
    let foo: f64 = 12.0;
}
