//! Drive N concurrent futures and render them as a single progress line. //! //! [`Join`] owns its inner futures and polls them concurrently. Its [`Progressive::progress`] is //! the completion fraction (`completed / total`), so the bar fills from 0/N to N/N as each future //! resolves. Push one into a [`Group`](super::Group) to render many futures as one line alongside //! other independent rows, or call [`with_theme`](Join::with_theme) for a self-contained row. use std::borrow::Cow; use std::fmt::Display; use std::future::Future; use std::io::IsTerminal; use std::pin::Pin; use std::task::{Context, Poll}; use std::time::Duration; use futures_lite::stream::Pending; use futures_lite::{stream, Stream}; use owo_colors::Style; use pin_project_lite::pin_project; use super::{Rendering, RenderingState}; use crate::line::{FrameContext, Line}; use crate::progressive::Progressive; use crate::state::State; use crate::term::CursorGuard; use crate::Theme; pin_project! { /// N concurrent futures collapsed into a single [`Progressive`] row. /// /// The bar fills from 0/N to N/N as each inner future completes. Results are collected in /// completion order. With zero inputs, awaiting resolves immediately with an empty `Vec` and no /// progress is reported. pub struct Join<'a, F: Future, M = Pending<&'static str>> { futs: Vec>>, results: Vec, completed: usize, total: usize, #[pin] messages: M, state: State, theme_override: Option>, spinner_style_override: Option