|
|
@ -79,9 +79,11 @@ where |
|
|
|
S: Send + Sync,
|
|
|
|
E: Send + Sync,
|
|
|
|
{
|
|
|
|
fn act<O, F>(self, f: F) -> ItemActionStage<O, ItemStateAction<T, S, E>, F, S, E>
|
|
|
|
pub fn act<O, F, Fut>(self, f: F) -> ItemActionStage<O, ItemStateAction<T, S, E>, F, Fut, S, E>
|
|
|
|
where
|
|
|
|
F: Fn(S, ()) -> Pin<Box<dyn Future<Output=Result<(S, O), E>> + Send>> + Send + Sync
|
|
|
|
//F: FnOnce(S, ()) -> Pin<Box<dyn Future<Output=Result<(S, O), E>> + Send>> + Send + Sync
|
|
|
|
F: Fn(S, ()) -> Fut + Send + Sync,
|
|
|
|
Fut: Future<Output=Result<(S, O), E>> + Send
|
|
|
|
{
|
|
|
|
ItemActionStage {
|
|
|
|
_s: Default::default(),
|
|
|
@ -92,10 +94,12 @@ where |
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct ItemActionStage<O, P, F, S, E>
|
|
|
|
pub struct ItemActionStage<O, P, F, Fut, S, E>
|
|
|
|
where
|
|
|
|
P: ItemAction,
|
|
|
|
F: Fn(S, P::Output) -> Pin<Box<dyn Future<Output=Result<(S, O) , E>> + Send>> + Send + Sync,
|
|
|
|
F: Fn(S, P::Output) -> Fut + Send + Sync,
|
|
|
|
Fut: Future<Output=Result<(S, O) , E>> + Send,
|
|
|
|
//F: FnOnce(S, P::Output) -> Pin<Box<dyn Future<Output=Result<(S, O) , E>> + Send>> + Send + Sync,
|
|
|
|
{
|
|
|
|
_s: std::marker::PhantomData<S>,
|
|
|
|
_e: std::marker::PhantomData<E>,
|
|
|
@ -104,10 +108,12 @@ where |
|
|
|
}
|
|
|
|
|
|
|
|
#[async_trait::async_trait]
|
|
|
|
impl<O, P: ItemAction, F, S, E> ItemAction for ItemActionStage<O, P, F, S, E>
|
|
|
|
impl<O, P: ItemAction, F, Fut, S, E> ItemAction for ItemActionStage<O, P, F, Fut, S, E>
|
|
|
|
where
|
|
|
|
P: ItemAction + ItemAction<Start = S, Error = E> + Send + Sync,
|
|
|
|
F: Fn(S, P::Output) -> Pin<Box<dyn Future<Output=Result<(S, O), E>> + Send>> + Send + Sync,
|
|
|
|
//F: FnOnce(S, P::Output) -> Pin<Box<dyn Future<Output=Result<(S, O), E>> + Send>> + Send + Sync,
|
|
|
|
F: Fn(S, P::Output) -> Fut + Send + Sync,
|
|
|
|
Fut: Future<Output=Result<(S, O), E>> + Send,
|
|
|
|
S: Send + Sync,
|
|
|
|
P::Output: Send + Sync,
|
|
|
|
E: Send + Sync,
|
|
|
@ -129,20 +135,23 @@ where |
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<O, P: ItemAction, F, S, E> ItemActionStage<O, P, F, S, E>
|
|
|
|
impl<O, P: ItemAction, F, Fut, S, E> ItemActionStage<O, P, F, Fut, S, E>
|
|
|
|
where
|
|
|
|
P: ItemAction<Start = S, Error = E> + Send + Sync,
|
|
|
|
F: Fn(S, P::Output) -> Pin<Box<dyn Future<Output=Result<(S, O), E>> + Send>> + Send + Sync,
|
|
|
|
F: Fn(S, P::Output) -> Fut + Send + Sync,
|
|
|
|
Fut: Future<Output=Result<(S, O), E>> + Send,
|
|
|
|
S: Send + Sync,
|
|
|
|
P::Output: Send + Sync,
|
|
|
|
E: Send + Sync,
|
|
|
|
O: Send + Sync,
|
|
|
|
P::Error: Send + Sync,
|
|
|
|
{
|
|
|
|
fn act<O2, G>(self, g: G) -> ItemActionStage<O2, ItemActionStage<O, P, F, S, E>, G, S, E>
|
|
|
|
pub fn act<O2, G, GFut>(self, g: G) -> ItemActionStage<O2, ItemActionStage<O, P, F, Fut, S, E>, G, GFut, S, E>
|
|
|
|
where
|
|
|
|
S: Send + Sync,
|
|
|
|
G: Fn(S, <ItemActionStage<O, P, F, S, E> as ItemAction>::Output) -> Pin<Box<dyn Future<Output=Result<(S, O2), E>> + Send>> + Send + Sync,
|
|
|
|
//G: FnOnce(S, <ItemActionStage<O, P, F, S, E> as ItemAction>::Output) -> Pin<Box<dyn Future<Output=Result<(S, O2), E>> + Send>> + Send + Sync,
|
|
|
|
G: Fn(S, <ItemActionStage<O, P, F, Fut, S, E> as ItemAction>::Output) -> GFut + Send + Sync,
|
|
|
|
GFut: Future<Output=Result<(S, O2), E>> + Send,
|
|
|
|
O2: Send + Sync,
|
|
|
|
{
|
|
|
|
ItemActionStage {
|
|
|
|