Trait depends::UpdateInput

source ·
pub trait UpdateInput: Named + HashValue + Clean {
    type Update;

    // Required method
    fn update_mut(&mut self, update: Self::Update);
}
Expand description

Describe how to update an InputNode value, and how that mutates the internal state. Correct implementation of this trait requires that any temporary state tracked is cleared up when implementing Clean.

Example

It’s not uncommon for a node which wraps a (potentially large) collection to want to provide dependent nodes an accessor to know which of those have changed since this node was last resolved. Correct implementation of that pattern requires implementation of Clean.

pub struct MyNode {
    // Appends every item to this collection.
    all_things: Vec<i32>,
    // An index where the 'new' items start.
    new_things_index: usize,
}

impl UpdateInput for MyNode {
    type Update = i32;

    fn update_mut(&mut self, input: Self::Update) {
        self.all_things.push(input)
    }
}

impl MyNode {
    // Provide a convenience for dependees to iterate only the new things.
    pub fn just_the_new_things_thanks(&self) -> impl Iterator<Item = i32> + '_ {
        (self.new_things_index..).map_while(|idx| self.all_things.get(idx).copied())
    }
}

impl Clean for MyNode {
    fn clean(&mut self) {
        // Ensure nothing is yielded next time.
        self.new_things_index = self.all_things.len();
    }
}

let mut node = MyNode::default();

// Add some initial data
node.update_mut(5);

assert_eq!(
    node.just_the_new_things_thanks().collect::<Vec<_>>(),
    vec![5]
);

// After cleaning, any temporary state is flushed.
node.clean();
assert_eq!(
    node.just_the_new_things_thanks().collect::<Vec<_>>(),
    vec![]
);

// Only the latest values are shown.
node.update_mut(7);
node.update_mut(6);
assert_eq!(
    node.just_the_new_things_thanks().collect::<Vec<_>>(),
    vec![7, 6]
);

// Just to hammer home the point.
node.clean();
assert_eq!(
    node.just_the_new_things_thanks().collect::<Vec<_>>(),
    vec![]
);

In the example above, if Clean wasn’t implemented, the new values would be displayed to dependent nodes after this node had been cleaned. This is an unsound implementation, which violates the caching logic of depends.

Required Associated Types§

Required Methods§

source

fn update_mut(&mut self, update: Self::Update)

Object Safety§

This trait is not object safe.

Implementations on Foreign Types§

source§

impl UpdateInput for bool

§

type Update = bool

source§

fn update_mut(&mut self, update: Self::Update)

source§

impl UpdateInput for char

§

type Update = char

source§

fn update_mut(&mut self, update: Self::Update)

source§

impl UpdateInput for i8

§

type Update = i8

source§

fn update_mut(&mut self, update: Self::Update)

source§

impl UpdateInput for i16

§

type Update = i16

source§

fn update_mut(&mut self, update: Self::Update)

source§

impl UpdateInput for i32

§

type Update = i32

source§

fn update_mut(&mut self, update: Self::Update)

source§

impl UpdateInput for i64

§

type Update = i64

source§

fn update_mut(&mut self, update: Self::Update)

source§

impl UpdateInput for i128

§

type Update = i128

source§

fn update_mut(&mut self, update: Self::Update)

source§

impl UpdateInput for isize

§

type Update = isize

source§

fn update_mut(&mut self, update: Self::Update)

source§

impl UpdateInput for u8

§

type Update = u8

source§

fn update_mut(&mut self, update: Self::Update)

source§

impl UpdateInput for u16

§

type Update = u16

source§

fn update_mut(&mut self, update: Self::Update)

source§

impl UpdateInput for u32

§

type Update = u32

source§

fn update_mut(&mut self, update: Self::Update)

source§

impl UpdateInput for u64

§

type Update = u64

source§

fn update_mut(&mut self, update: Self::Update)

source§

impl UpdateInput for u128

§

type Update = u128

source§

fn update_mut(&mut self, update: Self::Update)

source§

impl UpdateInput for usize

§

type Update = usize

source§

fn update_mut(&mut self, update: Self::Update)

source§

impl UpdateInput for String

§

type Update = String

source§

fn update_mut(&mut self, update: Self::Update)

Implementors§