summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--runtime/src/task.rs73
-rw-r--r--src/lib.rs8
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>> {
diff --git a/src/lib.rs b/src/lib.rs
index 09d9860e..79e2f276 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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;