use std::cell::RefCell;
use std::rc::Rc;
use crate::element::Element;
use crate::fiber::FiberId;
use crate::hooks::{Hooks, Wake};
#[derive(Clone)]
pub struct Scrollback {
queue: Rc<RefCell<Vec<Element>>>,
fiber: FiberId,
wake: tokio::sync::mpsc::UnboundedSender<Wake>,
}
impl std::fmt::Debug for Scrollback {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Scrollback")
.field("pending", &self.queue.borrow().len())
.finish_non_exhaustive()
}
}
impl Scrollback {
pub fn commit(&self, element: Element) {
self.queue.borrow_mut().push(element);
let _ = self.wake.send(Wake::Dirty(self.fiber));
}
}
impl<'a> Hooks<'a> {
pub fn use_scrollback(&mut self) -> Scrollback {
Scrollback {
queue: self.runtime.scrollback.clone(),
fiber: self.fiber_id,
wake: self.runtime.wake.clone(),
}
}
}