suck/README.md
Callum Leslie faa5ba23c5
feat: add multiple channel providers
Each provider is enabled via a feature flag.
The currently implemented providers are:
- std::mpsc
- flume
- crossbeam_channel
2025-09-04 09:37:55 +01:00

75 lines
1.8 KiB
Markdown

# 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.