ratatui_kit/hooks/
use_future.rs1use std::task::Poll;
2
3use futures::future::BoxFuture;
4
5use super::{Hook, Hooks};
6
7mod private {
8 pub trait Sealed {}
9
10 impl Sealed for crate::hooks::Hooks<'_, '_> {}
11}
12
13pub trait UseFuture: private::Sealed {
14 fn use_future<F>(&mut self, f: F)
15 where
16 F: Future<Output = ()> + Send + 'static;
17}
18
19pub struct UseFutureImpl {
20 f: Option<BoxFuture<'static, ()>>,
21}
22
23impl UseFutureImpl {
24 pub fn new<F>(f: F) -> Self
25 where
26 F: Future<Output = ()> + Send + 'static,
27 {
28 UseFutureImpl {
29 f: Some(Box::pin(f)),
30 }
31 }
32}
33
34impl Hook for UseFutureImpl {
35 fn poll_change(
36 mut self: std::pin::Pin<&mut Self>,
37 cx: &mut std::task::Context,
38 ) -> std::task::Poll<()> {
39 if let Some(future) = self.f.as_mut() {
40 if future.as_mut().poll(cx).is_ready() {
41 self.f = None; }
43 }
44 Poll::Pending
45 }
46}
47
48impl UseFuture for Hooks<'_, '_> {
49 fn use_future<F>(&mut self, f: F)
50 where
51 F: Future<Output = ()> + Send + 'static,
52 {
53 self.use_hook(move || UseFutureImpl::new(f));
54 }
55}