about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorStjepan Glavina <stjepang@gmail.com>2018-04-06 15:02:21 +0200
committerStjepan Glavina <stjepang@gmail.com>2018-04-06 15:15:28 +0200
commitf86deef5b6059b9a0a76d9f0dafb95ced85f7449 (patch)
treed94f5bccb1bb443a0c2bc9cddf83daed6248ef62 /src/libcore
parenta143462783cec88b7b733e8aa09990bfeb59f754 (diff)
downloadrust-f86deef5b6059b9a0a76d9f0dafb95ced85f7449.tar.gz
rust-f86deef5b6059b9a0a76d9f0dafb95ced85f7449.zip
Add Cell::update
Diffstat (limited to 'src/libcore')
-rw-r--r--src/libcore/cell.rs24
-rw-r--r--src/libcore/tests/cell.rs11
2 files changed, 35 insertions, 0 deletions
diff --git a/src/libcore/cell.rs b/src/libcore/cell.rs
index c8ee166fee3..2ea1b84d034 100644
--- a/src/libcore/cell.rs
+++ b/src/libcore/cell.rs
@@ -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")]
diff --git a/src/libcore/tests/cell.rs b/src/libcore/tests/cell.rs
index cc0ef6a6f17..962fb2f0e02 100644
--- a/src/libcore/tests/cell.rs
+++ b/src/libcore/tests/cell.rs
@@ -27,6 +27,17 @@ fn smoketest_cell() {
 }
 
 #[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");
     assert!(format!("{:?}", x).contains(x.get()));