experimental_reactive/
buffer.rs

1use reactive::*;
2use std::cell::RefCell;
3
4/// Buffer can hold a value for a while
5pub struct Buffer<T>(RefCell<Option<T>>);
6impl<T> Buffer<T> {
7	pub fn new() -> Buffer<T> { Buffer(RefCell::new(None)) }
8}
9
10impl<T> Source<T> for Buffer<T> {
11	fn pull(&self) -> Result<T, SourceError> { self.0.borrow_mut().take().ok_or(Empty) }
12}
13
14impl<T> Slot<T> for Buffer<T> {
15	fn push(&self, value: T) -> Result<(), SlotError<T>> {
16		let is_some = self.0.borrow().is_some();
17		if is_some { Err(Full(value)) } else { *self.0.borrow_mut() = Some(value); Ok(()) }
18	}
19}