wd_pool 0.1.0

A pool crate for rust
Documentation
use std::future::Future;
use std::pin::Pin;
use std::time::Duration;

// 异步任务池 放入的是Future
#[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);
}

//可以通过function对目前先处理一遍
#[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 new()->Self; //创建对象,在整个对象的生命周期里只会被调用一次
    async fn init(&mut self); //初始化对象,每次对象被取出时会调用一次
    async fn reset(&mut self); //重置对象,在对象重新入池时调用
}