drop-queue 0.0.9

drop-queue, is a simple drop queue system for async operations. (Until async-drop is a thing)
Documentation
# ๐ŸงŠ drop-queue

**`drop-queue`** is a simple, composable async drop queue for Rust โ€” built to run queued tasks in FIFO order and ensure graceful shutdown via draining. It's useful in lifecycle-managed environments (e.g., `notmad`) or as a lightweight alternative until async drop is stabilized in Rust.

> ๐Ÿ’ก Tasks are executed one at a time. If the queue is marked for draining, no further items can be added.

---

## โœจ Features

* Assign one-off async tasks (closures) to a queue
* FIFO task processing
* Draining mechanism to flush the queue before shutdown
* Optional integration with [`notmad`]https://crates.io/crates/notmad for graceful component lifecycle control
* `Send + Sync + 'static` guaranteed

---

## ๐Ÿš€ Usage

### Add to `Cargo.toml`

```toml
[dependencies]
drop-queue = "*"
```

### Enable `notmad` integration (optional)

```toml
[dependencies]
drop-queue = { version = "*", features = ["notmad"] }
```

---

## ๐Ÿ›  Example

```rust
use drop-queue::DropQueue;
use tokio::sync::oneshot;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let queue = DropQueue::new();

    let (tx, rx) = oneshot::channel();

    queue.assign(|| async move {
        println!("Running closure task");
        tx.send(()).unwrap();
        Ok(())
    })?;

    queue.process_next().await?;

    rx.await?;

    Ok(())
}
```

---

## ๐Ÿ” Lifecycle with `notmad`

If using the [`notmad`](https://crates.io/crates/notmad) lifecycle framework:

```rust
#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let queue = drop-queue::DropQueue::new();
    let app = notmad::Mad::new().add(queue);
    app.run().await?;
    Ok(())
}
```

This will process tasks until the cancellation token is triggered, e.g., via SIGINT.

---

## ๐Ÿ”’ Drain Mode

You can signal the queue to stop accepting new items and finish processing the current ones:

```rust
queue.drain().await?;
```

After this call, any further `assign()` will panic.

---

## ๐Ÿงช Tests

Run the test suite using:

```bash
cargo test
```

---

## ๐Ÿ“œ License

MIT