use std::rc::Rc;
pub struct Computed<T> {
f: Rc<dyn Fn() -> T>,
}
impl<T> Clone for Computed<T> {
fn clone(&self) -> Self {
Computed { f: Rc::clone(&self.f) }
}
}
impl<T> Computed<T> {
pub fn new(f: impl Fn() -> T + 'static) -> Self {
Computed { f: Rc::new(f) }
}
pub fn get(&self) -> T {
(self.f)()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::signal::Signal;
#[test]
fn computed_tracks_sources() {
let x = Signal::new(4.0_f32);
let doubled = {
let x = x.clone();
Computed::new(move || x.get() * 2.0)
};
assert_eq!(doubled.get(), 8.0);
x.set(5.0);
assert_eq!(doubled.get(), 10.0);
}
}