diplomatic-bag

Crates.iodiplomatic-bag
lib.rsdiplomatic-bag
version0.3.1
sourcesrc
created_at2021-02-13 16:56:06.318693
updated_at2022-05-17 18:56:25.486809
descriptionA wrapper type that allows you to send `!Send` types to different threads.
homepage
repositoryhttps://github.com/Skepfyr/DiplomaticBag
max_upload_size
id354781
size45,726
Jack Rickard (Skepfyr)

documentation

README

Diplomatic Bag

Crates.io API reference License Rust

Hide !Send and !Sync types inside a DiplomaticBag which can be sent between thread freely.

let one = DiplomaticBag::new(|| Rc::new(RefCell::new(1)));
let two = DiplomaticBag::new(|| Rc::new(RefCell::new(2)));
let three: u8 = std::thread::spawn(|| {
    one.as_ref()
        .zip(two.as_ref())
        .map(|(one, two)| *one.borrow() + *two.borrow())
        .into_inner()
}).join()?;

(I don't know why you'd want to do this ^, but I promise this comes in handy for !Send types not in std, for example, cpal's Stream type.)

How it works

All the operations on values inside DiplomaticBags are sent to a worker thread (the home country 😉). This means the values are only ever read on one thread, allowing the DiplomaticBag to be Send even if the type it contains is not. This model does have some drawbacks, see the docs for more information.

License

Licensed under either of

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.

Commit count: 18

cargo fmt