29 releases
0.12.0 | Jul 2, 2023 |
---|---|
0.11.3 | Jun 1, 2021 |
0.10.0 | Mar 27, 2021 |
0.8.2 | Dec 25, 2020 |
0.3.0 | Mar 12, 2020 |
#579 in Rust patterns
89 downloads per month
Used in 2 crates
(via deltoid-derive)
185KB
5K
SLoC
Deltoid
Synopsis
Deltoid is a type-driven rust library that can be used to calculate deltas.
A delta Δ
can be calculated between 2 values a
and b
of the same type.
Once calculated, Δ
can then be applied to the first value a
to obtain a new
value c
that is equivalent to the second value b
.
A primary use case for calculating delta's is to keep track of a sequence of related and potentially deeply-nested data trees while making sure to keep resource consumption (e.g. RAM, network bandwidth) reasonable. Since such a sequence may be exported for further processing, delta's are by definition de/serializable. This allows you to collect the data in once place as a sequence of delta's, export it (perhaps over a network connection), and then reconstruct the original sequence on the receiving side by successively applying the delta's in the sequence.
Usage
Add this to your Cargo.toml
:
[dependencies]
deltoid = "0.11.1"
deltoid-derive = "0.11.1"
Computing a delta, then applying it:
use deltoid::Deltoid;
use serde_derive::{Deserialize, Serialize};
#[derive(Deserialize, Serialize, Deltoid)]
struct Point {
x: usize,
y: usize,
}
fn main() {
// Define 2 instances of the same type
let point0 = Point { x: 0, y: 0 };
let point1 = Point { x: 42, y: 8 };
// Calculate the delta between them
let delta = point0.delta(&point1).unwrap();
// Apply the delta to `point0`
let point2 = point0.apply(delta).unwrap();
assert_eq!(point1, point2);
}
Limitations
There are some limitations to this library:
-
Unions are not supported. Only
struct
s andenum
s are currently supported. -
The derive macro tries to accommodate generic types, but for types making use of advanced generics a manual implementation is generally recommended over using
deltoid-derive
because it allows for finer control. -
Types that have fields that have a borrow type (i.e.
&T
and&mut T
for some typeT
) are not currently supported. This limitation may be lifted in the future for mutable borrows, but is pretty fundamental for immutable borrows. -
It's possible that while developing you notice that a set of impls is missing for a type in Rust's
stdlib
. If so, this is because support for types that are a part ofstdlib
must be added manually and simply hasn't been done yet. You can file an issue for that, or even better, send a PR :)
Special Thanks
A special thanks to Accept B.V. for sponsoring this project.
Dependencies
~0.3–8MB
~71K SLoC