Add Cell::update
This commit is contained in:
parent
a143462783
commit
f86deef5b6
2 changed files with 35 additions and 0 deletions
|
@ -256,6 +256,30 @@ impl<T:Copy> Cell<T> {
|
||||||
pub fn get(&self) -> T {
|
pub fn get(&self) -> T {
|
||||||
unsafe{ *self.value.get() }
|
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")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
|
|
@ -26,6 +26,17 @@ fn smoketest_cell() {
|
||||||
assert!(y.get() == (30, 40));
|
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]
|
#[test]
|
||||||
fn cell_has_sensible_show() {
|
fn cell_has_sensible_show() {
|
||||||
let x = Cell::new("foo bar");
|
let x = Cell::new("foo bar");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue