about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libcore/cell.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/libcore/cell.rs b/src/libcore/cell.rs
index c2983e033e5..1707bddc2b9 100644
--- a/src/libcore/cell.rs
+++ b/src/libcore/cell.rs
@@ -73,6 +73,14 @@ pub impl<T> Cell<T> {
         self.put_back(v);
         r
     }
+
+    // Calls a closure with a mutable reference to the value.
+    fn with_mut_ref<R>(&self, op: &fn(v: &mut T) -> R) -> R {
+        let mut v = self.take();
+        let r = op(&mut v);
+        self.put_back(v);
+        r
+    }
 }
 
 #[test]
@@ -101,3 +109,21 @@ fn test_put_back_non_empty() {
     let value_cell = Cell(~10);
     value_cell.put_back(~20);
 }
+
+#[test]
+fn test_with_ref() {
+    let good = 6;
+    let c = Cell(~[1, 2, 3, 4, 5, 6]);
+    let l = do c.with_ref() |v| { v.len() };
+    assert!(l == good);
+}
+
+#[test]
+fn test_with_mut_ref() {
+    let good = ~[1, 2, 3];
+    let mut v = ~[1, 2];
+    let c = Cell(v);
+    do c.with_mut_ref() |v| { v.push(3); }
+    let v = c.take();
+    assert!(v == good);
+}