use tokio_02::runtime::Handle;
use tokio_02::task::JoinHandle;
use tokio_executor_01::{self as executor_01, Executor as Executor01};
use futures_01::future::{self as future_01, Future as Future01};
use futures_util::{compat::Future01CompatExt, future::FutureExt};
use std::future::Future;
#[derive(Debug, Clone)]
#[cfg_attr(docsrs, doc(cfg(feature = "rt-full")))]
pub struct TaskExecutor {
pub(super) inner: super::compat::CompatSpawner<Handle>,
}
impl TaskExecutor {
pub fn spawn<F>(&self, future: F)
where
F: Future01<Item = (), Error = ()> + Send + 'static,
{
let future = Box::pin(future.compat().map(|_| ()));
self.spawn_std(future)
}
pub fn spawn_std<F>(&self, future: F)
where
F: Future<Output = ()> + Send + 'static,
{
let idle = self.inner.idle.reserve();
let _ = self.inner.inner.spawn(idle.with(future));
}
pub fn spawn_handle<F>(&self, future: F) -> JoinHandle<Result<F::Item, F::Error>>
where
F: Future01 + Send + 'static,
F::Item: Send + 'static,
F::Error: Send + 'static,
{
let future = Box::pin(future.compat());
self.spawn_handle_std(future)
}
pub fn spawn_handle_std<F>(&self, future: F) -> JoinHandle<F::Output>
where
F: Future + Send + 'static,
F::Output: Send + 'static,
{
self.inner.inner.spawn(future)
}
}
impl<T> future_01::Executor<T> for TaskExecutor
where
T: Future01<Item = (), Error = ()> + Send + 'static,
{
fn execute(&self, future: T) -> Result<(), future_01::ExecuteError<T>> {
self.spawn(future);
Ok(())
}
}
impl Executor01 for TaskExecutor {
fn spawn(
&mut self,
future: Box<dyn Future01<Item = (), Error = ()> + Send>,
) -> Result<(), executor_01::SpawnError> {
Executor01::spawn(&mut self.inner, future)
}
}
impl<T> executor_01::TypedExecutor<T> for TaskExecutor
where
T: Future01<Item = (), Error = ()> + Send + 'static,
{
fn spawn(&mut self, future: T) -> Result<(), executor_01::SpawnError> {
executor_01::TypedExecutor::spawn(&mut self.inner, future)
}
}