use futures_util::{FutureExt, StreamExt, pin_mut, select};
use crate::{Progress, ProgressUpdate};
pub trait ProgressExt: Progress {
fn observe(
self,
receiver: impl Fn(ProgressUpdate) + Send,
) -> impl Future<Output = Self::Output> + Send
where
Self: Send + Sized,
{
async move {
let progress_stream = self.progress().fuse();
let future = self.fuse();
pin_mut!(progress_stream, future);
loop {
select! {
result = future => return result,
update = progress_stream.next() => {
if let Some(update) = update {
receiver(update);
}
}
}
}
}
}
fn observe_local(self, receiver: impl Fn(ProgressUpdate)) -> impl Future<Output = Self::Output>
where
Self: Sized,
{
async move {
let progress_stream = self.progress().fuse();
let future = self.fuse();
pin_mut!(progress_stream, future);
loop {
select! {
result = future => return result,
update = progress_stream.next() => {
if let Some(update) = update {
receiver(update);
}
}
}
}
}
}
}
impl<T: Progress> ProgressExt for T {}