From 64106c4d3d4ddba8c7bc2af75376e6d3d3d75601 Mon Sep 17 00:00:00 2001 From: Date: Mon, 29 Jun 2015 20:16:15 +0000 Subject: Update documentation --- src/carboxyl/pending.rs.html | 271 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 271 insertions(+) create mode 100644 src/carboxyl/pending.rs.html (limited to 'src/carboxyl/pending.rs.html') diff --git a/src/carboxyl/pending.rs.html b/src/carboxyl/pending.rs.html new file mode 100644 index 0000000..6e0f11f --- /dev/null +++ b/src/carboxyl/pending.rs.html @@ -0,0 +1,271 @@ + + + + + + + + + + pending.rs.html -- source + + + + + + + + + + + + + + + +
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+
+//! Pending wrapper
+
+use std::ops::Deref;
+
+
+/// A pending value. This is a wrapper type that allows one to queue one new
+/// value without actually overwriting the old value. Later the most recently
+/// queued value can be updated.
+pub struct Pending<T> {
+    current: T,
+    update: Option<T>,
+}
+
+impl<T> Pending<T> {
+    /// Create a new pending value.
+    pub fn new(t: T) -> Pending<T> {
+        Pending { current: t, update: None }
+    }
+
+    /// Put an item in the queue. Ignores any previously queued items.
+    pub fn queue(&mut self, new: T) {
+        self.update = Some(new);
+    }
+
+    /// Updates any update pending.
+    pub fn update(&mut self) {
+        if let Some(t) = self.update.take() {
+            self.current = t;
+        }
+    }
+
+    /// Get the future value.
+    pub fn future(&self) -> &T {
+        self.update.as_ref().unwrap_or(&self.current)
+    }
+}
+
+impl<T> Deref for Pending<T> {
+    type Target = T;
+    fn deref(&self) -> &T { &self.current }
+}
+
+
+#[cfg(test)]
+mod test {
+    use super::*;
+
+    #[test]
+    fn new_derefs_identical() {
+        assert_eq!(*Pending::new(3), 3);
+    }
+
+    #[test]
+    fn queue_does_not_affect_deref() {
+        let mut p = Pending::new(2);
+        p.queue(4);
+        assert_eq!(*p, 2);
+    }
+
+    #[test]
+    fn new_future_identical() {
+        assert_eq!(*Pending::new(5).future(), 5);
+    }
+
+    #[test]
+    fn queue_affects_future() {
+        let mut p = Pending::new(10);
+        p.queue(6);
+        assert_eq!(*p.future(), 6);
+    }
+
+    #[test]
+    fn updated_deref() {
+        let mut p = Pending::new(-2);
+        p.queue(2);
+        p.update();
+        assert_eq!(*p, 2);
+    }
+
+    #[test]
+    fn updated_future() {
+        let mut p = Pending::new(-7);
+        p.queue(0);
+        p.update();
+        assert_eq!(*p.future(), 0);
+    }
+}
+
+
+ + + + + + + + + + + + + + + \ No newline at end of file -- cgit v1.2.3