setting_tracker 0.1.2

Utility type for tracking setting changes
Documentation
# setting_tracker

Setting tracker is a utility type for tracking changes in your settings struct. Other parts of the program are usually only interested when a specific value changes inside settings. This library tries to help achieving that by providing [utility type](https://gitlab.com/osteri/setting_tracker/-/blob/master/src/lib.rs?ref_type=heads#L4) `Setting<T>`.

You can wrap any type inside `Setting<T>` where `T` implements `Clone` and `Default` traits (`Debug` is highly recommended but not enforced).

As a made up example, first define our `Settings` struct (which is not part of this library):
```rust
use setting_tracker::Setting;

#[derive(Default, Debug)]
struct Settings {
    port: Setting<u16>,
    domain: Setting<String>,
}
```

User can now register callbacks when a specific setting changes:
```rust
let mut settings = Settings::default(); // equivalent of `Settings { port: 0, domain: "".to_string() }`
settings.port.cb(|old, new| println!("port: {:?} -> {:?}", old, new));
```
Setting can now be changed through the `set` member function:
```rust
settings.port.set(1);
settings.port.set(10);
```
Get the value by cloning:
```rust
let _ = settings.domain.get();
```
Get the value as reference, when cloning is considered too expensive:
```rust
let _ = settings.domain.as_ref();
```

Outputs:
```
port: 0 -> 1
port: 1 -> 10
```

Run the README.md example and see it yourself:

```sh
cargo run --example readme
```

### Why?
This is useful pattern when individual setting change needs to be tracked. The simple example above just prints setting changes, but more useful pattern would be to use pub/sub signaling for example to other threads that a setting has been changed.

See more complex examples in [example directory](https://gitlab.com/osteri/setting/-/tree/master/examples).