blues-lsp 0.1.0

LSP language server for the Bluespec SystemVerilog language
Documentation
use std::cell::Cell;

pub trait CellUpdateExt {
    type Inner;

    fn update<R>(&self, f: impl FnOnce(&mut Self::Inner) -> R) -> R;
}

impl<T: Default> CellUpdateExt for Cell<T> {
    type Inner = T;

    // Little different from the unstable version,
    // This one requires `Default` instead of `Copy`
    fn update<R>(&self, f: impl FnOnce(&mut Self::Inner) -> R) -> R {
        let mut inner = self.replace(Default::default());
        let ret = (f)(&mut inner);
        self.set(inner);
        ret
    }
}