use accepts::AsyncAccepts;
use core::{future::Future, marker::PhantomData};
#[must_use = "AsyncStatefulCallback must be used to run the async stateful callback"]
#[derive(Debug, Clone)]
pub struct AsyncStatefulCallback<Value, State, CallbackFn, CallbackFut> {
state: State,
callback: CallbackFn,
_marker: PhantomData<(Value, CallbackFut)>,
}
impl<Value, State, CallbackFn, CallbackFut>
AsyncStatefulCallback<Value, State, CallbackFn, CallbackFut>
where
CallbackFn: Fn(&State, Value) -> CallbackFut,
CallbackFut: Future<Output = ()>,
{
pub fn new(state: State, callback: CallbackFn) -> Self {
Self {
state,
callback,
_marker: PhantomData,
}
}
}
impl<Value, State, CallbackFn, CallbackFut> AsyncAccepts<Value>
for AsyncStatefulCallback<Value, State, CallbackFn, CallbackFut>
where
CallbackFn: Fn(&State, Value) -> CallbackFut,
CallbackFut: Future<Output = ()>,
{
fn accept_async<'a>(&'a self, value: Value) -> impl Future<Output = ()> + 'a
where
Value: 'a,
{
(self.callback)(&self.state, value)
}
}