diff options
Diffstat (limited to '')
| -rw-r--r-- | runtime/src/task.rs | 73 | ||||
| -rw-r--r-- | src/lib.rs | 8 | 
2 files changed, 62 insertions, 19 deletions
diff --git a/runtime/src/task.rs b/runtime/src/task.rs index e037c403..b75aca89 100644 --- a/runtime/src/task.rs +++ b/runtime/src/task.rs @@ -55,24 +55,6 @@ impl<T> Task<T> {          Self::stream(stream.map(f))      } -    /// Creates a new [`Task`] that runs the given [`Future`] and produces -    /// its output. -    pub fn future(future: impl Future<Output = T> + MaybeSend + 'static) -> Self -    where -        T: 'static, -    { -        Self::stream(stream::once(future)) -    } - -    /// Creates a new [`Task`] that runs the given [`Stream`] and produces -    /// each of its items. -    pub fn stream(stream: impl Stream<Item = T> + MaybeSend + 'static) -> Self -    where -        T: 'static, -    { -        Self(Some(boxed_stream(stream.map(Action::Output)))) -    } -      /// Combines the given tasks and produces a single [`Task`] that will run all of them      /// in parallel.      pub fn batch(tasks: impl IntoIterator<Item = Self>) -> Self @@ -176,6 +158,61 @@ impl<T> Task<T> {              ))),          }      } + +    /// Creates a new [`Task`] that can be aborted with the returned [`Handle`]. +    pub fn abortable(self) -> (Self, Handle) +    where +        T: 'static, +    { +        match self.0 { +            Some(stream) => { +                let (stream, handle) = stream::abortable(stream); + +                (Self(Some(boxed_stream(stream))), Handle(Some(handle))) +            } +            None => (Self(None), Handle(None)), +        } +    } + +    /// Creates a new [`Task`] that runs the given [`Future`] and produces +    /// its output. +    pub fn future(future: impl Future<Output = T> + MaybeSend + 'static) -> Self +    where +        T: 'static, +    { +        Self::stream(stream::once(future)) +    } + +    /// Creates a new [`Task`] that runs the given [`Stream`] and produces +    /// each of its items. +    pub fn stream(stream: impl Stream<Item = T> + MaybeSend + 'static) -> Self +    where +        T: 'static, +    { +        Self(Some(boxed_stream(stream.map(Action::Output)))) +    } +} + +/// A handle to a [`Task`] that can be used for aborting it. +#[derive(Debug, Clone)] +pub struct Handle(Option<stream::AbortHandle>); + +impl Handle { +    /// Aborts the [`Task`] of this [`Handle`]. +    pub fn abort(&self) { +        if let Some(handle) = &self.0 { +            handle.abort(); +        } +    } + +    /// Returns `true` if the [`Task`] of this [`Handle`] has been aborted. +    pub fn is_aborted(&self) -> bool { +        if let Some(handle) = &self.0 { +            handle.is_aborted() +        } else { +            true +        } +    }  }  impl<T> Task<Option<T>> { @@ -202,9 +202,14 @@ pub use crate::core::{      Length, Padding, Pixels, Point, Radians, Rectangle, Rotation, Shadow, Size,      Theme, Transformation, Vector,  }; -pub use crate::runtime::{exit, Task}; +pub use crate::runtime::exit;  pub use iced_futures::Subscription; +pub mod task { +    //! Create runtime tasks. +    pub use crate::runtime::task::{Handle, Task}; +} +  pub mod clipboard {      //! Access the clipboard.      pub use crate::runtime::clipboard::{ @@ -309,6 +314,7 @@ pub use executor::Executor;  pub use font::Font;  pub use renderer::Renderer;  pub use settings::Settings; +pub use task::Task;  #[doc(inline)]  pub use application::application;  | 
