minipool 0.1.2

Lightweight, generic tokio-based pool implementation for Rust.
Documentation
use super::{Pool, PoolEntry};

#[tokio::test]
async fn test() {
  struct Item;

  impl PoolEntry for Item {
    fn is_closed(&self) -> bool {
      false
    }
  }

  let pool = Pool::default();
  assert!(pool.is_empty());

  pool.push(Item);
  assert_eq!(pool.len(), 1);
  assert!(!pool.is_empty());

  assert!(pool.acquire().await.is_some());
  assert!(pool.acquire().await.is_some());

  pool.push(Item);
  assert_eq!(pool.len(), 2);

  let a = pool.acquire().await;
  let b = pool.acquire().await;

  assert!(a.is_some());
  assert!(b.is_some());
}

#[tokio::test]
async fn test_closed_entries() {
  struct Item {
    closed: bool,
  }

  impl PoolEntry for Item {
    fn is_closed(&self) -> bool {
      self.closed
    }
  }

  let pool = Pool::default();
  assert!(pool.is_empty());

  pool.push(Item { closed: true });
  assert_eq!(pool.len(), 1);
  assert!(!pool.is_empty());

  assert!(pool.acquire().await.is_some());
  assert!(pool.is_empty());

  pool.push(Item { closed: false });
  pool.push(Item { closed: true });
  pool.push(Item { closed: false });
  assert_eq!(pool.len(), 3);

  {
    let a = pool.acquire().await;
    let b = pool.acquire().await;
    let c = pool.acquire().await;

    assert!(a.is_some());
    assert!(b.is_some());
    assert!(c.is_some());
  }

  assert_eq!(pool.len(), 2);
}