observe 2.0.0

Rust declarative observables inspired by MobX
Documentation
use std::sync::{Arc, Weak};

use parking_lot::Mutex;

use crate::arc::dependencies::Dependencies;
use crate::arc::{Derived, Observable, Version};

pub struct Evaluation {
	inner: Mutex<EvaluationInner>,
	parent: Weak<dyn Derived>,
}

impl AsRef<Evaluation> for Evaluation {
	fn as_ref(&self) -> &Evaluation {
		self
	}
}

struct EvaluationInner {
	dependencies: Dependencies,
}

impl Evaluation {
	pub fn new(parent: Weak<dyn Derived>) -> Self {
		Evaluation {
			parent,
			inner: Mutex::new({
				EvaluationInner {
					dependencies: Dependencies::new(),
				}
			}),
		}
	}

	pub(crate) fn parent(&self) -> Weak<dyn Derived> {
		self.parent.clone()
	}

	pub(crate) fn based_on(&self, observable: Arc<dyn Observable>, version: Version) {
		self.inner.lock().dependencies.based_on(observable, version);
	}

	pub fn take(self) -> Dependencies {
		self.inner.into_inner().dependencies
	}
}