Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Never Change Token

There may be edge cases where a ChangeToken is required, but there will never been any changes. This is the usage scenario for NeverChangeToken. This ChangeToken will never register any callbacks, changed will always return false, and must_poll will always return true. NeverChangeToken effectively implements the Null Object pattern for the ChangeToken trait.

use tokens::*;
use std::sync::{Arc, RwLock};

#[derive(Default)]
pub struct Counter {
    value: RwLock<usize>,
}

impl Counter {
    pub fn increment(&self) {
        *self.value.write().unwrap() += 1;
    }

    pub fn watch(&self) -> impl ChangeToken {
        // TODO: placeholder until change support is implemented
        NeverChangeToken::new()
    }
}

impl ToString for Counter {
    fn to_string(&self) -> String {
        format!("Value: {}", *self.value.read().unwrap())
    }
}

fn main() {
    let counter = Arc::new(Counter::default());
    let registration = counter.watch().register(
        Box::new(|state| {
            let printable = state.unwrap().downcast_ref::<Counter>().unwrap();
            println!("{}", printable.to_string());
        }),
        Some(counter.clone()));

    counter.increment(); // prints nothing; callback not invoked
}