-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Split
iced_futures
into different backend
implementations
- Loading branch information
Showing
19 changed files
with
280 additions
and
318 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
//! The underlying implementations of the `iced_futures` contract! | ||
pub mod null; | ||
|
||
#[cfg(not(target_arch = "wasm32"))] | ||
pub mod native; | ||
|
||
#[cfg(target_arch = "wasm32")] | ||
pub mod wasm; | ||
|
||
pub mod default; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
//! A default, cross-platform backend. | ||
//! | ||
//! - On native platforms, it will use: | ||
//! - `backend::native::tokio` when the `tokio` feature is enabled. | ||
//! - `backend::native::async-std` when the `async-std` feature is | ||
//! enabled. | ||
//! - `backend::native::smol` when the `smol` feature is enabled. | ||
//! - `backend::native::thread_pool` otherwise. | ||
//! | ||
//! - On Wasm, it will use `backend::wasm::wasm_bindgen`. | ||
#[cfg(not(target_arch = "wasm32"))] | ||
mod platform { | ||
#[cfg(feature = "tokio")] | ||
pub use crate::backend::native::tokio::*; | ||
|
||
#[cfg(all(feature = "async-std", not(feature = "tokio"),))] | ||
pub use crate::backend::native::async_std::*; | ||
|
||
#[cfg(all( | ||
feature = "smol", | ||
not(any(feature = "tokio", feature = "async-std")), | ||
))] | ||
pub use crate::backend::native::smol::*; | ||
|
||
#[cfg(not(any( | ||
feature = "tokio", | ||
feature = "async-std", | ||
feature = "smol", | ||
)))] | ||
pub use crate::backend::native::thread_pool::*; | ||
} | ||
|
||
#[cfg(target_arch = "wasm32")] | ||
mod platform { | ||
pub use crate::backend::wasm::wasm_bindgen::*; | ||
} | ||
|
||
pub use platform::*; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
//! Backends that are only available in native platforms: Windows, macOS, or Linux. | ||
#[cfg_attr(docsrs, doc(cfg(feature = "tokio",)))] | ||
#[cfg(feature = "tokio")] | ||
pub mod tokio; | ||
|
||
#[cfg_attr(docsrs, doc(cfg(feature = "async-std",)))] | ||
#[cfg(feature = "async-std")] | ||
pub mod async_std; | ||
|
||
#[cfg_attr(docsrs, doc(cfg(feature = "smol",)))] | ||
#[cfg(feature = "smol")] | ||
pub mod smol; | ||
|
||
#[cfg_attr(docsrs, doc(cfg(feature = "thread-pool",)))] | ||
#[cfg(feature = "thread-pool")] | ||
pub mod thread_pool; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
//! An `async-std` backend. | ||
use futures::Future; | ||
|
||
/// An `async-std` executor. | ||
#[derive(Debug)] | ||
pub struct Executor; | ||
|
||
impl crate::Executor for Executor { | ||
fn new() -> Result<Self, futures::io::Error> { | ||
Ok(Self) | ||
} | ||
|
||
fn spawn(&self, future: impl Future<Output = ()> + Send + 'static) { | ||
let _ = async_std::task::spawn(future); | ||
} | ||
} | ||
|
||
pub mod time { | ||
//! Listen and react to time. | ||
use crate::subscription::{self, Subscription}; | ||
|
||
/// Returns a [`Subscription`] that produces messages at a set interval. | ||
/// | ||
/// The first message is produced after a `duration`, and then continues to | ||
/// produce more messages every `duration` after that. | ||
pub fn every<H: std::hash::Hasher, E>( | ||
duration: std::time::Duration, | ||
) -> Subscription<H, E, std::time::Instant> { | ||
Subscription::from_recipe(Every(duration)) | ||
} | ||
|
||
#[derive(Debug)] | ||
struct Every(std::time::Duration); | ||
|
||
impl<H, E> subscription::Recipe<H, E> for Every | ||
where | ||
H: std::hash::Hasher, | ||
{ | ||
type Output = std::time::Instant; | ||
|
||
fn hash(&self, state: &mut H) { | ||
use std::hash::Hash; | ||
|
||
std::any::TypeId::of::<Self>().hash(state); | ||
self.0.hash(state); | ||
} | ||
|
||
fn stream( | ||
self: Box<Self>, | ||
_input: futures::stream::BoxStream<'static, E>, | ||
) -> futures::stream::BoxStream<'static, Self::Output> { | ||
use futures::stream::StreamExt; | ||
|
||
async_std::stream::interval(self.0) | ||
.map(|_| std::time::Instant::now()) | ||
.boxed() | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
//! A `smol` backend. | ||
use futures::Future; | ||
|
||
/// A `smol` executor. | ||
#[cfg_attr(docsrs, doc(cfg(feature = "smol")))] | ||
#[derive(Debug)] | ||
pub struct Executor; | ||
|
||
impl crate::Executor for Executor { | ||
fn new() -> Result<Self, futures::io::Error> { | ||
Ok(Self) | ||
} | ||
|
||
fn spawn(&self, future: impl Future<Output = ()> + Send + 'static) { | ||
smol::spawn(future).detach(); | ||
} | ||
} | ||
|
||
pub mod time { | ||
//! Listen and react to time. | ||
use crate::subscription::{self, Subscription}; | ||
|
||
/// Returns a [`Subscription`] that produces messages at a set interval. | ||
/// | ||
/// The first message is produced after a `duration`, and then continues to | ||
/// produce more messages every `duration` after that. | ||
pub fn every<H: std::hash::Hasher, E>( | ||
duration: std::time::Duration, | ||
) -> Subscription<H, E, std::time::Instant> { | ||
Subscription::from_recipe(Every(duration)) | ||
} | ||
|
||
#[derive(Debug)] | ||
struct Every(std::time::Duration); | ||
|
||
impl<H, E> subscription::Recipe<H, E> for Every | ||
where | ||
H: std::hash::Hasher, | ||
{ | ||
type Output = std::time::Instant; | ||
|
||
fn hash(&self, state: &mut H) { | ||
use std::hash::Hash; | ||
|
||
std::any::TypeId::of::<Self>().hash(state); | ||
self.0.hash(state); | ||
} | ||
|
||
fn stream( | ||
self: Box<Self>, | ||
_input: futures::stream::BoxStream<'static, E>, | ||
) -> futures::stream::BoxStream<'static, Self::Output> { | ||
use futures::stream::StreamExt; | ||
|
||
smol::Timer::interval(self.0).boxed() | ||
} | ||
} | ||
} |
7 changes: 3 additions & 4 deletions
7
futures/src/executor/thread_pool.rs → futures/src/backend/native/thread_pool.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
//! A `tokio` backend. | ||
use futures::Future; | ||
|
||
/// A `tokio` executor. | ||
pub type Executor = tokio::runtime::Runtime; | ||
|
||
impl crate::Executor for Executor { | ||
fn new() -> Result<Self, futures::io::Error> { | ||
tokio::runtime::Runtime::new() | ||
} | ||
|
||
fn spawn(&self, future: impl Future<Output = ()> + Send + 'static) { | ||
let _ = tokio::runtime::Runtime::spawn(self, future); | ||
} | ||
|
||
fn enter<R>(&self, f: impl FnOnce() -> R) -> R { | ||
let _guard = tokio::runtime::Runtime::enter(self); | ||
f() | ||
} | ||
} | ||
|
||
pub mod time { | ||
//! Listen and react to time. | ||
use crate::subscription::{self, Subscription}; | ||
|
||
/// Returns a [`Subscription`] that produces messages at a set interval. | ||
/// | ||
/// The first message is produced after a `duration`, and then continues to | ||
/// produce more messages every `duration` after that. | ||
pub fn every<H: std::hash::Hasher, E>( | ||
duration: std::time::Duration, | ||
) -> Subscription<H, E, std::time::Instant> { | ||
Subscription::from_recipe(Every(duration)) | ||
} | ||
|
||
#[derive(Debug)] | ||
struct Every(std::time::Duration); | ||
|
||
impl<H, E> subscription::Recipe<H, E> for Every | ||
where | ||
H: std::hash::Hasher, | ||
{ | ||
type Output = std::time::Instant; | ||
|
||
fn hash(&self, state: &mut H) { | ||
use std::hash::Hash; | ||
|
||
std::any::TypeId::of::<Self>().hash(state); | ||
self.0.hash(state); | ||
} | ||
|
||
fn stream( | ||
self: Box<Self>, | ||
_input: futures::stream::BoxStream<'static, E>, | ||
) -> futures::stream::BoxStream<'static, Self::Output> { | ||
use futures::stream::StreamExt; | ||
|
||
let start = tokio::time::Instant::now() + self.0; | ||
|
||
let stream = { | ||
futures::stream::unfold( | ||
tokio::time::interval_at(start, self.0), | ||
|mut interval| async move { | ||
Some((interval.tick().await, interval)) | ||
}, | ||
) | ||
}; | ||
|
||
stream.map(tokio::time::Instant::into_std).boxed() | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
//! Backends that are only available on Wasm targets. | ||
pub mod wasm_bindgen; |
8 changes: 4 additions & 4 deletions
8
futures/src/executor/wasm_bindgen.rs → futures/src/backend/wasm/wasm_bindgen.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.