use std::future::Future;
use std::pin::Pin;
use std::time::Duration;
#[async_trait::async_trait]
pub trait TaskPool{
type Out;
async fn push<F:Future<Output=Self::Out>+Send+'static>(&self,task:F)->anyhow::Result<Self::Out>{
Ok(task.await)
}
async fn close(&self,_: Duration)->anyhow::Result<()> {Ok(())}
}
#[async_trait::async_trait]
pub trait ObjectPool<Obj:Object>{
async fn get(&self)->Obj;
async fn release(&self,o:Obj);
}
#[async_trait::async_trait]
pub trait ObjectPoolHandle<Obj,Out>{
async fn handle(self,o:Obj)->(Option<Obj>,Out);
}
#[async_trait::async_trait]
impl<T,Obj,Out> ObjectPoolHandle<Obj,Out> for T
where T: FnOnce(Obj)->Pin<Box<dyn Future<Output=(Option<Obj>, Out)>+Send>> +Send,
for<'async_trait> Obj:Send + 'async_trait,
Out:Send,
{
async fn handle(self, o:Obj) -> (Option<Obj>, Out) {
self(o).await
}
}
#[async_trait::async_trait]
pub trait Object : Default{
async fn init(&mut self); async fn reset(&mut self); }