2 个版本
0.1.1 | 2022年11月26日 |
---|---|
0.1.0 | 2022年11月26日 |
#43 in #self
7KB
62 行代码(不包括注释)
快速异步特性
一个库,用于实现不依赖于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 功能
需要 type_alias_impl_trait
nightly 功能才能将 impl Trait
类型(在我们的情况下,impl Future
类型)添加为特性的关联泛型类型,这个库依赖于它。
依赖关系
~1.5MB
~35K SLoC