#![doc = include_str!("../README.md")]
#![deny(unsafe_code)]
use crossterm::event::EventStream;
use ratatui::Terminal;
use ratatui::prelude::CrosstermBackend;
use std::io::{Error, Write};
use tokio::task::LocalSet;
mod app;
mod channel;
mod events;
mod timer;
mod traits;
pub use events::*;
pub use timer::*;
pub use app::{ReactiveApp, Runtime};
pub use traits::{Component, Render};
#[inline]
pub async fn run_with_terminal<W: Write + 'static, F: Render + 'static, C: Component<F>>(
app: C,
terminal: Terminal<CrosstermBackend<W>>,
) -> Result<(), Error> {
LocalSet::new()
.run_until(async move {
let app = ReactiveApp::new(app, terminal);
let mut events = EventStream::new();
app.run(&mut events).await
})
.await
}
#[inline]
pub async fn run<F: Render + 'static, C: Component<F>>(app: C) -> Result<(), Error> {
let res = run_with_terminal(app, ratatui::init()).await;
ratatui::restore();
res
}