3 releases
0.5.7 | Nov 8, 2024 |
---|---|
0.5.6 | Aug 30, 2024 |
0.5.5 | Jul 23, 2024 |
#1798 in Procedural macros
84 downloads per month
Used in 9 crates
(via lattices)
22KB
466 lines
#[derive(Lattice)]
Macro
A struct of multiple lattices can form a product lattice. The simplest case of this is the Pair
lattice, which is a product of two sub-lattices. For more than two lattices, and/or to improve
readability, users can create their own product lattice structs, where each field is a sub-lattice,
and use the #[derive(Lattice)]
macro to automatically derive the lattice traits.
Derives Merge
, PartialEq
, PartialOrd
, LatticeOrd
, IsBot
, IsTop
, and LatticeFrom
,
and therefore Lattice
too. Alternatively, individual traits can be derived:
#[derive(Merge, LatticeOrd, IsBot, IsTop, LatticeFrom)]
. Note that LatticeOrd
also derives
PartialEq
and PartialOrd
.
Note that all fields must be lattice types. If any field cannot be a lattice type then the
where
clauses prevent the trait impl from compiling.
These derive macros will create a second set of generics to allow conversion and merging between varying types. For example, given this struct:
#[derive(Lattice)]
struct MyLattice<KeySet, Epoch>
where
KeySet: Collection,
Epoch: Ord,
{
keys: SetUnion<KeySet>,
epoch: Max<Epoch>,
}
Will create derive macros impl
s in the form:
impl<KeySet, Epoch, KeySetOther, EpochOther>
Merge<MyLattice<KeySetOther, EpochOther>> for MyLattice<KeySet, Epoch>
where
KeySet: Collection,
Epoch: Ord,
KeySetOther: Collection,
EpochOther: Ord,
{
// ...
}
Dependencies
~3MB
~56K SLoC