Crates.io | compost |
lib.rs | compost |
version | 0.4.0 |
source | src |
created_at | 2022-12-28 18:19:41.706393 |
updated_at | 2023-01-08 18:57:44.729583 |
description | Adds a macro to decompose tuples into tuples containing a subset of their values |
homepage | |
repository | https://github.com/Radbuglet/compost |
max_upload_size | |
id | 746933 |
size | 62,881 |
This library exposes decompose!
, a macro to decompose tuples into tuples
containing a subset of their values.
use compost::decompose;
// Pack all your context into a tuple...
let mut cx = (&mut 1u32, &2u8, (&3u16, &mut 'e', "f", &mut [1, 2, 3]));
// And cal your target function!
consumer(decompose!(cx));
// Define functions taking tuples of context...
fn consumer_2((a, b, c, d, e): (&u32, &str, &char, &f32, &i8)) {
dbg!(a, b, c, d, e);
}
fn consumer_3((f, g, h): (&char, &str, &mut [u8; 3])) {
dbg!(f, g, h);
}
fn consumer(mut cx: (&mut u32, &char, &str, &mut [u8; 3])) {
// Bring types into scope and produce a remainder tuple.
decompose!(cx => rest & {
char: &char,
bytes: &mut [u8; 3],
});
// Combine contexts...
let mut rest = (rest, (&mut 4.3f32, &-4i8), &mut 5i16);
// ...and forward them to further functions.
consumer_2(decompose!(rest));
// ...all without invalidating existing borrows!
dbg!(char, bytes);
// Reborrow the original context after its borrows have expired.
consumer_3(decompose!(cx));
}
See decompose!
's documentation for more details on the precise semantics and
limitations of the macro.
Yes, this library...
decompose!
does not consume its input. Once you're done
with the borrow, you can reuse the original tuple).Deref
) components.TypeId
, allowing the macro to operate on non-'static
types.no_std
environments and does not rely on unsafe code.