use lazy_cow::{LazyCow, LazyView, LazyViewMut};
fn main() {
let mut xs = LazyCow::<Vec<u8>>::new(vec![4, 3, 2, 1, 0]);
match xs.get_mut() {
LazyViewMut::Strict(xs_mut) => xs_mut.reverse(),
LazyViewMut::Lazy(..) => unreachable!(),
}
let mut ys = xs.clone();
match xs.get_mut() {
LazyViewMut::Strict(..) => unreachable!(),
LazyViewMut::Lazy(_xs, xs_diff) => xs_diff.append(&mut vec![5, 6, 7]),
}
match ys.get() {
LazyView::Strict(ys) => assert_eq!(ys.iter().sum::<u8>(), 10),
LazyView::Lazy(..) => unreachable!(),
}
let mut zs = xs.clone();
assert_eq!(zs.eval(), vec![0, 1, 2, 3, 4, 5, 6, 7]);
let mut n = 0;
for z in zs.get_strict().iter_mut() {
n += *z;
*z = n;
}
assert_eq!(zs.into_inner(), vec![0, 1, 3, 6, 10, 15, 21, 28]);
let mut ws = xs.clone();
match ws.get_mut() {
LazyViewMut::Strict(ws) => ws.reverse(),
LazyViewMut::Lazy(..) => unreachable!(),
}
drop(xs);
match ys.get_mut() {
LazyViewMut::Strict(ys) => ys.iter_mut().for_each(|y| *y += 1),
LazyViewMut::Lazy(..) => unreachable!(),
}
println!("moo~")
}