2个版本

0.1.1 2022年11月26日
0.1.0 2022年11月26日

#70#async-trait


用于 fast_async_trait

MIT 许可证

24KB
537 代码行

快速异步特性

一个库,用于实现不依赖于boxed futures的异步特性,而是依赖于nightly特性type_alias_impl_trait作为其基本实现。

限制

  • 目前,每个异步函数只允许一个生命周期
pub trait AsyncTrait {
    // allowed
    async fn test1 (&self, right: u8);
    // allowed
    async fn test2 (&self, right: &u8);
    // allowed
    async fn test3<'b> (&'b self, right: &'b u8);
    // compiler error
    async fn test4<'b> (&self, right: &'b u8);
}
  • 不支持具有Self: Rc<Self>和类似类型的异步函数

示例

#![feature(type_alias_impl_trait)]

use fast_async_trait::*;

#[async_trait_def]
pub trait AsyncTrait {
    type Item;

    async fn owned (self) -> Option<Self::Item>;
    async fn by_ref (&self) -> Option<Self::Item>;
    async fn by_mut (&mut self) -> Option<Self::Item>;
    
    #[inline]
    async fn owned_default (self, _n: usize) -> Option<Self::Item> where Self: Sized {
        return self.owned().await
    }

    #[inline]
    async fn by_ref_default (&self, n: usize) -> Option<Self::Item> {
        for _ in 0..n {
            let _ = self.by_ref().await;
        }
        return self.by_ref().await
    }

    #[inline]
    async fn by_mut_default (&mut self, n: usize) -> Option<Self::Item> {
        for _ in 0..n {
            let _ = self.by_mut().await;
        }
        return self.by_mut().await
    }
}

#[async_trait_impl]
impl AsyncTrait for (usize, &[u8]) {
    type Item = u8;

    async fn owned (self) -> Option<Self::Item> {
        return self.1.get(self.0).copied()
    }

    #[inline]
    async fn by_ref (&self) -> Option<Self::Item> {
        return self.1.get(self.0).copied()
    }

    #[inline]
    async fn by_mut (&mut self) -> Option<Self::Item> {
        let v = self.1.get(self.0).copied();
        self.0 += 1;
        return v;
    }
}

nightly特性

需要nightly特性type_alias_impl_trait才能将impl Trait类型(在我们的情况下,impl Future类型)作为特性的关联泛型类型添加,这个crate依赖于它。

依赖项

~1.5MB
~36K SLoC