Add Cell::update

This commit is contained in:
Stjepan Glavina 2018-04-06 15:02:21 +02:00
parent a143462783
commit f86deef5b6
2 changed files with 35 additions and 0 deletions

View File

@ -256,6 +256,30 @@ impl<T:Copy> Cell<T> {
pub fn get(&self) -> T {
unsafe{ *self.value.get() }
}
/// Applies a function to the contained value.
///
/// # Examples
///
/// ```
/// use std::cell::Cell;
///
/// let c = Cell::new(5);
/// c.update(|x| x + 1);
///
/// assert_eq!(c.get(), 6);
/// ```
#[inline]
#[unstable(feature = "cell_update", issue = "0")] // TODO: issue
pub fn update<F>(&self, f: F) -> T
where
F: FnOnce(T) -> T,
{
let old = self.get();
let new = f(old);
self.set(new);
new
}
}
#[stable(feature = "rust1", since = "1.0.0")]

View File

@ -26,6 +26,17 @@ fn smoketest_cell() {
assert!(y.get() == (30, 40));
}
#[test]
fn cell_update() {
let x = Cell::new(10);
assert_eq!(x.update(|x| x + 5), 15);
assert_eq!(x.get(), 15);
assert_eq!(x.update(|x| x / 3), 5);
assert_eq!(x.get(), 5);
}
#[test]
fn cell_has_sensible_show() {
let x = Cell::new("foo bar");