4 releases

0.5.8 Dec 23, 2024
0.5.7 Nov 8, 2024
0.5.6 Aug 30, 2024
0.5.5 Jul 23, 2024

#2054 in Procedural macros

Download history 33/week @ 2024-09-25 12/week @ 2024-10-02 9/week @ 2024-10-09 10/week @ 2024-10-16 2/week @ 2024-10-23 4/week @ 2024-10-30 116/week @ 2024-11-06 13/week @ 2024-11-13 18/week @ 2024-11-20 11/week @ 2024-11-27 33/week @ 2024-12-04 23/week @ 2024-12-11 128/week @ 2024-12-18 35/week @ 2024-12-25 14/week @ 2025-01-01 9/week @ 2025-01-08

188 downloads per month
Used in 8 crates (via lattices)

Apache-2.0

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 impls 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
~55K SLoC