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
use std::future::Future;
use crate::error::FutureResult;
use crate::selector::Selector;
use crate::task::future::TaskFuture;
pub mod future;
pub(in crate) type StateRef<'state, State> = &'state Option<State>;
pub struct ReactiveTask<'state, State> {
pub(in crate) state: StateRef<'state, State>,
}
impl<'state, State> ReactiveTask<'state, State> {
/// Create a new task.
///
/// Several [`Selector`](crate::selector::Selector)s are provided by default, but you can also define your own.
///
/// The default [`Selector`](crate::selector::Selector)s are as follows.
///
/// * [`wait::until`](crate::prelude::wait::until)
/// * [`wait::while`](crate::prelude::wait::while_)
/// * [`once::run`](crate::prelude::once::run)
/// * [`repeat::count`](crate::prelude::repeat::count)
/// * [`repeat::forever`](crate::prelude::repeat::forever)
/// * [`delay::time`](crate::prelude::delay::time)
///
/// ## Examples
///
/// ```ignore
/// use flurx::prelude::once;
/// use flurx::Scheduler;
///
/// let mut scheduler = Scheduler::<usize>::new();
/// scheduler.schedule(|task|async move{
/// task.will(once::run(|state: usize|{
/// state
/// })).await;
/// });
/// ```
#[inline]
pub fn will<Out, Sel>(&self, selector: Sel) -> impl Future<Output=Out> + 'state
where Sel: Selector<State, Output=Out> + 'state,
State: Clone + 'state
{
TaskFuture::<State, Sel, false> {
state: self.state,
selector,
}
}
/// This method will not be made public as the specifications have not yet been finalized.
#[allow(unused)]
pub(in crate) async fn try_will<Out, Sel>(&self, selector: Sel) -> FutureResult<Out>
where Sel: Selector<State, Output=Out>,
State: Clone + 'state
{
TaskFuture::<State, Sel, true> {
state: self.state,
selector,
}
.await
}
}
#[allow(clippy::missing_trait_methods)]
impl<'state, State> Clone for ReactiveTask<'state, State> {
#[inline]
fn clone(&self) -> Self { *self }
}
impl<'state, State> Copy for ReactiveTask<'state, State> {}