https://github.com/novacrazy/parallel-event-emitter
Parallel event emitter built on futures-rs
https://github.com/novacrazy/parallel-event-emitter
event-emitter futures parallel rust
Last synced: about 1 year ago
JSON representation
Parallel event emitter built on futures-rs
- Host: GitHub
- URL: https://github.com/novacrazy/parallel-event-emitter
- Owner: novacrazy
- Created: 2017-01-18T08:32:16.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2017-01-20T23:46:08.000Z (over 9 years ago)
- Last Synced: 2025-03-26T23:11:19.963Z (about 1 year ago)
- Topics: event-emitter, futures, parallel, rust
- Language: Rust
- Homepage: https://docs.rs/parallel-event-emitter
- Size: 34.2 KB
- Stars: 29
- Watchers: 1
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
Parallel Event Emitter
======================
Implementation of an event emitter that invokes event listener callbacks concurrently in a configurable thread pool,
using `Future`s to notify callers of success or errors.
Because all values must be transferred across thread boundaries, all types `T` must be `Send`.
Additionally, all types `T` must be `Any`, so `T: 'static`.
## Usage
```toml
[dependencies]
futures = "0.1"
parallel-event-emitter = "0.2.4"
```
Example using a `String` as the key:
```rust
extern crate futures;
extern crate parallel_event_emitter;
use futures::Future;
use parallel_event_emitter::*;
fn main() {
let mut emitter: ParallelEventEmitter = ParallelEventEmitter::new();
emitter.add_listener("some event", || {
println!("Hello, World!");
Ok(())
}).unwrap();
assert_eq!(1, emitter.emit("some event").wait().unwrap());
}
```
Or using a custom event type:
```rust
extern crate futures;
extern crate parallel_event_emitter;
use futures::Future;
use parallel_event_emitter::*;
#[derive(Debug, Hash, PartialEq, Eq, Clone)]
enum MyEvents {
EventA,
EventB,
}
fn main() {
let mut emitter: ParallelEventEmitter = ParallelEventEmitter::new();
emitter.add_listener(MyEvents::EventA, || {
println!("Hello, World!");
Ok(())
}).unwrap();
assert_eq!(1, emitter.emit(MyEvents::EventA).wait().unwrap());
}
```
## `Trace` type
This crate depends on the [`trace-error`](https://crates.io/crates/trace-error) crate to have simple and lightweight backtraces on all error `Result`s.
If you choose not to use that, which is fine by me, simply call `.into_error()` on all `Trace` values to get the real error.
## `impl Trait` feature
Instead of having all the `emit*` methods returning a boxed `Future` (`BoxFuture`),
the Cargo feature **`conservative_impl_trait`** can be given to enable `impl Future` return types on
all the `emit*` methods.
```toml
[dependencies.parallel-event-emitter]
version = "0.2.4"
features = ["default", "conservative_impl_trait"] # And maybe integer_atomics
```
## Larger `ListenerId`s
Although the `ListenerId` type itself is `u64`,
the atomic counter underneath is restricted to `AtomicUsize` by default.
To enable true guaranteed 64-bit counters, use the `integer_atomics` feature for the crate.
```toml
[dependencies.parallel-event-emitter]
version = "0.2.4"
features = ["default", "integer_atomics"] # And maybe conservative_impl_trait
```