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
use crate::futures::promise::{Promise};
use crate::futures::future::{Future, WrappedFuture};
use crate::executors::executor::Executor;
use crate::common::tsafe::TSafe;
use std::sync::{Arc, Mutex};
pub struct AsyncPromise<V: Send + 'static, E: Send + Clone + 'static> {
pub future: TSafe<Future<V, E>>
}
impl <V: Send + Clone, E: Send + Clone> AsyncPromise<V, E> {
pub fn new(f: Box<FnMut() -> Result<V, E> + Send>, executor: TSafe<Executor>) -> AsyncPromise<V, E> {
let fut = tsafe!(Future::new());
let mut f = f;
let executor = executor;
let mut obj = AsyncPromise {
future: fut.clone()
};
executor.lock().unwrap().execute(Box::new(move || {
let result = f();
obj.complete(result);
}), None);
AsyncPromise {
future: fut
}
}
}
impl <V: Send + Clone, E: Send + Clone> Promise<V, E> for AsyncPromise<V, E> {
fn try_complete(&mut self, result: Result<V, E>) -> bool {
if self.future.lock().unwrap().is_completed() {
false
} else {
self.future.lock().unwrap().complete(result);
true
}
}
fn future(&self) -> WrappedFuture<V, E> {
WrappedFuture {inner: self.future.clone()}
}
}