nosy 0.3.0

Change notification / observation / broadcast channels, with filtering and coalescing. no_std compatible.
Documentation
`nosy`
======

`nosy` is a Rust library for broadcasting messages/events such as change notifications.

The niche which `nosy` seeks to fill is: delivering precise change notifications
(e.g. “these particular elements of this collection have changed”) from a data source
to a set of listeners (observers) in such a way that

* there is no unbounded buffering of messages (as an unbounded channel would have),
* there is no blocking/suspending (as a bounded channel would have),
* there is no execution of further application logic while the message is being delivered
  (as plain event-listener registration would have), and
* the scheduling of the execution of said application logic is fully under application control
  (rather than implicitly executing some sort of work queue, as a “reactive” framework might).

The tradeoff we make in order to achieve this is that message delivery does involve execution
of a *small* amount of code on behalf of each listener;
this code is responsible for deciding whether the message is of interest, and if so, storing it
or its implications for later reading.
(We could say that *the listeners are nosy*.)

Because of this strategy, `nosy` is not a good choice if you expect to have very many listeners
of the same character (e.g. many identical worker tasks updating their state); in those cases,
you would probably be better off using a conventional broadcast channel or watch channel.
It is also not a good choice if it is critical that no third-party code executes on your thread
or while your function is running.

Platform requirements
---------------------

`nosy` is compatible with `no_std` platforms.
The minimum requirements for using `nosy` are the following.
(All [platforms which support `std`] meet these requirements, and many others do too.)

* The `alloc` standard library crate, and a global allocator.
* Pointer-sized and `u8`-sized atomics (`cfg(target_has_atomic = "ptr")` and `cfg(target_has_atomic = "8")`).

[platforms which support `std`]: https://doc.rust-lang.org/rustc/platform-support.html

License
-------

Licensed under either of

 * Apache License, Version 2.0
   ([LICENSE-APACHE]LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
 * MIT license
   ([LICENSE-MIT]LICENSE-MIT or http://opensource.org/licenses/MIT)

at your option.

Contribution
------------

Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.