use std::cell::RefCell; pub struct Entry { key: A, value: B } pub struct alist { eq_fn: extern "Rust" fn(A,A) -> bool, data: Box>>>, } pub fn alist_add(lst: &alist, k: A, v: B) { let mut data = lst.data.borrow_mut(); (*data).push(Entry{key:k, value:v}); } pub fn alist_get( lst: &alist, k: A) -> B { let eq_fn = lst.eq_fn; let data = lst.data.borrow(); for entry in &(*data) { if eq_fn(entry.key.clone(), k.clone()) { return entry.value.clone(); } } panic!(); } #[inline] pub fn new_int_alist() -> alist { fn eq_int(a: isize, b: isize) -> bool { a == b } return alist { eq_fn: eq_int, data: Box::new(RefCell::new(Vec::new())), }; } #[inline] pub fn new_int_alist_2() -> alist { #[inline] fn eq_int(a: isize, b: isize) -> bool { a == b } return alist { eq_fn: eq_int, data: Box::new(RefCell::new(Vec::new())), }; }