Fast Async Trait

Library to implement async traits that aren't reliant on boxed futures, relying instead on the type_alias_impl_trait nightly feature for it's base implementation.

Limitations

Example

```rust

![feature(typealiasimpl_trait)]

use fastasynctrait::*;

[asynctraitdef]

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
}

}

[asynctraitimpl]

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 features

The type_alias_impl_trait nightly feature is required to be able to add impl Trait types (in our case, impl Future types) as associated generic types of a trait, which this crate relies on.