1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
pub use runtime::{DefaultExecutor, Runtime, TaskExecutor};
use futures::Future;
use std::pin::Pin;
pub trait Executor: Send + Sync + 'static + Clone {
fn spawn(&mut self, future: Pin<Box<dyn Future<Output = ()> + Send>>);
}
#[cfg(all(
feature = "tokio",
not(any(feature = "tokio-02-alpha6-global", feature = "async-std"))
))]
mod runtime {
use super::*;
pub use tokio::runtime::Handle as TaskExecutor;
pub use tokio::runtime::Runtime;
impl Executor for tokio::runtime::Handle {
fn spawn(&mut self, future: Pin<Box<dyn Future<Output = ()> + Send>>) {
tokio::runtime::Handle::spawn(self, future);
}
}
#[derive(Clone)]
pub struct DefaultExecutor;
impl DefaultExecutor {
pub fn current() -> Self {
Self {}
}
}
impl Executor for DefaultExecutor {
fn spawn(&mut self, future: Pin<Box<dyn Future<Output = ()> + Send>>) {
tokio::spawn(future);
}
}
}
#[cfg(all(feature = "async-std", not(feature = "tokio-02-alpha6-global")))]
mod runtime {
use super::*;
use async_std::task;
pub struct Runtime(TaskExecutor);
impl Runtime {
pub fn new() -> Option<Self> {
Some(Runtime(TaskExecutor))
}
pub fn handle(&self) -> &TaskExecutor {
&self.0
}
pub fn block_on<F, T>(&mut self, future: F) -> T
where
F: Future<Output = T>,
{
task::block_on(future)
}
pub fn spawn<F, T>(&self, future: F)
where
F: Future<Output = T> + Send + 'static,
T: Send + 'static,
{
task::spawn(future);
}
}
#[derive(Clone)]
pub struct TaskExecutor;
impl TaskExecutor {
pub fn spawn<F>(&self, future: F)
where
F: Future + Send + 'static,
F::Output: Send + 'static,
{
task::spawn(future);
}
}
#[derive(Clone)]
pub struct DefaultExecutor;
impl DefaultExecutor {
pub fn current() -> Self {
Self {}
}
}
impl Executor for DefaultExecutor {
fn spawn(&mut self, future: Pin<Box<dyn Future<Output = ()> + Send>>) {
task::spawn(future);
}
}
}