This is a small crate that provides a generic unital-join-semilattice type (hereafter: "lattice") along with a few common instances.
Lattices are defined in two separate pieces: a definition trait LatticeDef
that provides the type-and-functions for a given lattice and a user interface
struct LatticeElt
that's parameterized by a LatticeDef
and provides
convenient methods to work with (including impls of standard Rust operator
traits).
This unusual split exists because many types have multiple equally viable lattices you can build on them (eg. u32-with-min or u32-with-max) and we want to avoid both coupling any given lattice definition to the type or accidentally inheriting an impl for any of the type's "standard semantics" as the lattice semantics, eg. we don't want to inherit u32's standard partial order as any lattice's partial order, unless explicitly building such a lattice.
To minimize disruption caused by this two-level wrapping scheme and provide a
degree of compositionality, every LatticeElt
also implements LatticeDef
by
delegation to the LatticeDef
it's parameterized over.
```rust use pergola::{MaxDef,LatticeElt};
type Def = MaxDef
```rust use pergola::{BTreeMapWithUnion,BitSetWithUnion,LatticeElt}; use bit_set::BitSet; use std::collections::BTreeMap;
type Def = BTreeMapWithUnion
Wikipedia:
A pergola is an outdoor garden feature forming a shaded walkway, passageway, or sitting area of vertical posts or pillars that usually support cross-beams and a sturdy open lattice, often upon which woody vines are trained.