ratflow 0.4.0

A minimalistic framework for building TUI applications using a reactive architecture.
Documentation
#![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
}