suck 0.0.2

Suck data up through a channel
Documentation
# suck

Suck data up through a channel

<div align="center">

[![Crates.io](https://img.shields.io/crates/v/suck.svg)](https://crates.io/crates/suck)
[![Github Actions](https://img.shields.io/github/actions/workflow/status/callumio/suck/ci.yml?branch=main)](https://github.com/callumio/suck/actions?workflow=ci)
[![Documentation](https://docs.rs/suck/badge.svg)](https://docs.rs/suck)
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)

</div>

> [!WARNING]\
> This is unstable, untested and subject to change - use at your own risk.

## Features

- Pull-based communication: Consumers request values on-demand
- Contextual values: Designed for current state rather than event streams
- Flexible sources: Support both static values and dynamic closures

## Installation

Add this to your `Cargo.toml`:

```toml
[dependencies]
suck = "*"
```

## Quick Start

```rust
use suck::sync::StdSuck;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Create a pair (using default std backend)
    let (sucker, sourcer) = StdSuck::<i32>::pair();

    // Start producer in a thread
    let producer = std::thread::spawn(move || {
        // Set a static value
        sourcer.set_static(42).unwrap();

        // Or set a dynamic closure
        sourcer.set(|| {
            // Generate fresh values each time
            42 * 2
        }).unwrap();

        // Run the producer loop
        sourcer.run().unwrap();
    });

    // Consumer pulls values
    let value = sucker.get()?;
    println!("Got value: {}", value);

    // Clean up
    sucker.close()?;
    producer.join().unwrap();

    Ok(())
}
```

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
for details.