experimental_reactive/
buffer.rs1use reactive::*;
2use std::cell::RefCell;
3
4pub 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}