Trait Calc

Source
pub trait Calc {
    type Value;

    // Required methods
    fn add_dep(&mut self, seen: &mut BitSet, dep: NonZeroUsize);
    fn eval(&mut self, dirty: &mut BitSet) -> (NonZeroUsize, Self::Value);
}
Expand description

Calculates a node’s value.

Required Associated Types§

Source

type Value

The type of values calculated by the node.

Required Methods§

Source

fn add_dep(&mut self, seen: &mut BitSet, dep: NonZeroUsize)

When this node is used as a precedent, add_dep is called by dependent nodes when they are created.

Func nodes forward calls to add_dep to their precedents. Source nodes remember their dependencies so that they can mark them dirty when the source node changes.

§Arguments
  • seen - A BitSet that can be used to skip a call to add_dep when this node is reachable from a dependency via multiple routes.
  • dep - The id of the dependent node.
Source

fn eval(&mut self, dirty: &mut BitSet) -> (NonZeroUsize, Self::Value)

Returns the value held within the node and the version number of the inputs used to calcuate that value. The value is recalculated if needed.

To calculate a node as a function of some precedent nodes:

  1. On creation, each func node is assigned a numerical id. If this id is not contained within the dirty bitset, immediately return the cached version number and value. Otherwise, remove this id from the dirty bitset.
  2. Call eval on each of the precedent nodes and remember the version number and value returned by each precedent.
  3. Calculate version = max(prec1_version, prec2_version, ...). If this version is lower than or equal to the cached version number, immediately return the cached version number and value.
  4. Calculate a new value for this node: value = f(prec1_value, prec2_value, ...). Update the cache with the calculated version and the new value.
  5. Return (version, value.clone()).

Returns a tuple containing:

  • A NonZeroUsize version number indicating the highest version number of this node’s precedents
  • A Clone of the value calculated
§Arguments
  • dirty - A BitSet that indicates the nodes that were marked dirty due to an update to a Node<Source>.

Trait Implementations§

Source§

impl<T> Calc for Box<dyn Calc<Value = T> + Send>

Implements Calc for BoxedNode.

Source§

type Value = T

The type of values calculated by the node.
Source§

fn add_dep(&mut self, seen: &mut BitSet, dep: NonZeroUsize)

When this node is used as a precedent, add_dep is called by dependent nodes when they are created. Read more
Source§

fn eval(&mut self, dirty: &mut BitSet) -> (NonZeroUsize, T)

Returns the value held within the node and the version number of the inputs used to calcuate that value. The value is recalculated if needed. Read more

Implementations on Foreign Types§

Source§

impl<C: Calc> Calc for Arc<Mutex<C>>

Implements Calc for SharedNode.

Source§

type Value = <C as Calc>::Value

Source§

fn add_dep(&mut self, seen: &mut BitSet, dep: NonZeroUsize)

Source§

fn eval(&mut self, dirty: &mut BitSet) -> (NonZeroUsize, C::Value)

Source§

impl<T> Calc for Box<dyn Calc<Value = T> + Send>

Implements Calc for BoxedNode.

Source§

type Value = T

Source§

fn add_dep(&mut self, seen: &mut BitSet, dep: NonZeroUsize)

Source§

fn eval(&mut self, dirty: &mut BitSet) -> (NonZeroUsize, T)

Implementors§

Source§

impl<C1: Calc, C2: Calc, C3: Calc, C4: Calc, C5: Calc, C6: Calc, C7: Calc, C8: Calc, T: Clone + PartialEq, F: FnMut(C1::Value, C2::Value, C3::Value, C4::Value, C5::Value, C6::Value, C7::Value, C8::Value) -> T> Calc for Func8<C1, C2, C3, C4, C5, C6, C7, C8, T, F>

Source§

type Value = T

Source§

impl<C1: Calc, C2: Calc, C3: Calc, C4: Calc, C5: Calc, C6: Calc, C7: Calc, C8: Calc, T: Clone, F: FnMut(&mut T, C1::Value, C2::Value, C3::Value, C4::Value, C5::Value, C6::Value, C7::Value, C8::Value) -> bool> Calc for Update8<C1, C2, C3, C4, C5, C6, C7, C8, T, F>

Source§

type Value = T

Source§

impl<C1: Calc, C2: Calc, C3: Calc, C4: Calc, C5: Calc, C6: Calc, C7: Calc, T: Clone + PartialEq, F: FnMut(C1::Value, C2::Value, C3::Value, C4::Value, C5::Value, C6::Value, C7::Value) -> T> Calc for Func7<C1, C2, C3, C4, C5, C6, C7, T, F>

Source§

type Value = T

Source§

impl<C1: Calc, C2: Calc, C3: Calc, C4: Calc, C5: Calc, C6: Calc, C7: Calc, T: Clone, F: FnMut(&mut T, C1::Value, C2::Value, C3::Value, C4::Value, C5::Value, C6::Value, C7::Value) -> bool> Calc for Update7<C1, C2, C3, C4, C5, C6, C7, T, F>

Source§

type Value = T

Source§

impl<C1: Calc, C2: Calc, C3: Calc, C4: Calc, C5: Calc, C6: Calc, T: Clone + PartialEq, F: FnMut(C1::Value, C2::Value, C3::Value, C4::Value, C5::Value, C6::Value) -> T> Calc for Func6<C1, C2, C3, C4, C5, C6, T, F>

Source§

type Value = T

Source§

impl<C1: Calc, C2: Calc, C3: Calc, C4: Calc, C5: Calc, C6: Calc, T: Clone, F: FnMut(&mut T, C1::Value, C2::Value, C3::Value, C4::Value, C5::Value, C6::Value) -> bool> Calc for Update6<C1, C2, C3, C4, C5, C6, T, F>

Source§

type Value = T

Source§

impl<C1: Calc, C2: Calc, C3: Calc, C4: Calc, C5: Calc, T: Clone + PartialEq, F: FnMut(C1::Value, C2::Value, C3::Value, C4::Value, C5::Value) -> T> Calc for Func5<C1, C2, C3, C4, C5, T, F>

Source§

type Value = T

Source§

impl<C1: Calc, C2: Calc, C3: Calc, C4: Calc, C5: Calc, T: Clone, F: FnMut(&mut T, C1::Value, C2::Value, C3::Value, C4::Value, C5::Value) -> bool> Calc for Update5<C1, C2, C3, C4, C5, T, F>

Source§

type Value = T

Source§

impl<C1: Calc, C2: Calc, C3: Calc, C4: Calc, T: Clone + PartialEq, F: FnMut(C1::Value, C2::Value, C3::Value, C4::Value) -> T> Calc for Func4<C1, C2, C3, C4, T, F>

Source§

type Value = T

Source§

impl<C1: Calc, C2: Calc, C3: Calc, C4: Calc, T: Clone, F: FnMut(&mut T, C1::Value, C2::Value, C3::Value, C4::Value) -> bool> Calc for Update4<C1, C2, C3, C4, T, F>

Source§

type Value = T

Source§

impl<C1: Calc, C2: Calc, C3: Calc, T: Clone + PartialEq, F: FnMut(C1::Value, C2::Value, C3::Value) -> T> Calc for Func3<C1, C2, C3, T, F>

Source§

type Value = T

Source§

impl<C1: Calc, C2: Calc, C3: Calc, T: Clone, F: FnMut(&mut T, C1::Value, C2::Value, C3::Value) -> bool> Calc for Update3<C1, C2, C3, T, F>

Source§

type Value = T

Source§

impl<C1: Calc, C2: Calc, T: Clone + PartialEq, F: FnMut(C1::Value, C2::Value) -> T> Calc for Func2<C1, C2, T, F>

Source§

type Value = T

Source§

impl<C1: Calc, C2: Calc, T: Clone, F: FnMut(&mut T, C1::Value, C2::Value) -> bool> Calc for Update2<C1, C2, T, F>

Source§

type Value = T

Source§

impl<C1: Calc, T: Clone + PartialEq, F: FnMut(C1::Value) -> T> Calc for Func1<C1, T, F>

Source§

type Value = T

Source§

impl<C1: Calc, T: Clone, F: FnMut(&mut T, C1::Value) -> bool> Calc for Update1<C1, T, F>

Source§

type Value = T

Source§

impl<C: Calc, F: FnMut(&C::Value)> Calc for Inspect<C, F>

Source§

type Value = <C as Calc>::Value

Source§

impl<T: Clone> Calc for Const<T>

Source§

type Value = T

Source§

impl<T: Clone> Calc for Source<T>

Source§

type Value = T

Source§

impl<T: Clone, F: FnOnce() -> T> Calc for Lazy<T, F>

Source§

type Value = T