#[macro_use] extern crate mucell;
use mucell::{MuCell, Ref};
use std::collections::HashMap;
use std::borrow::Cow;
struct Inner {
pub value: Vec<i32>,
munged: Option<Vec<i32>>,
}
impl Inner {
pub fn new(value: Vec<i32>) -> Inner {
Inner {
value: value,
munged: None,
}
}
#[allow(dead_code)]
pub fn set(&mut self, value: Vec<i32>) {
self.value = value;
self.munged = None;
}
pub fn munge(&mut self) {
if self.munged.is_none() {
self.munged = Some(self.munged().into_owned());
}
}
pub fn munged(&self) -> Cow<[i32]> {
match self.munged {
Some(ref x) => Cow::Borrowed(x.as_ref()),
None => Cow::Owned(self.value.iter().map(|&x| x + 1).collect()),
}
}
pub fn assert_munged_exists(&self) {
assert!(self.munged.is_some())
}
pub fn assert_munged_does_not_exist(&self) {
assert!(self.munged.is_none())
}
}
fn main() {
let mut items = HashMap::new();
items.insert("foo", MuCell::new(Inner::new(vec![1, 2, 3])));
items.insert("bar", MuCell::new(Inner::new(vec![4, 5, 6])));
items.insert("baz", MuCell::new(Inner::new(vec![7, 8, 9])));
let _active_borrow = items.get("bar").unwrap().borrow();
let item = items.get("foo").unwrap();
item.try_mutate(|x| x.munge());
item.borrow().assert_munged_exists();
let a = Ref::map(item.borrow(), |inner| inner.munged());
assert_eq!(&*a, [2, 3, 4]);
let item = items.get(&"bar").unwrap();
item.try_mutate(|x| x.munge());
item.borrow().assert_munged_does_not_exist();
let a = Ref::map(item.borrow(), |inner| inner.munged());
assert_eq!(&*a, [5, 6, 7]);
let _munged: Vec<i32> = Ref::map(a, |a| a.into_owned()).into_inner();
}