8 次重大发布

0.9.0 2020年12月20日
0.8.1 2020年7月2日
0.7.0 2020年6月7日
0.2.0 2020年3月29日

#538 in Rust 模式

每月 22 次下载
3crate中使用(直接使用 2 个)

MIT/Apache

81KB
2K SLoC

Pergola

这是一个小的crate,它提供了一种通用的单位连接半格类型(以下简称“格”)以及一些常见的实例。

格由两部分定义:一个定义 trait LatticeDef,它提供了给定格的类型和函数,以及一个用户界面 struct LatticeElt,它由一个LatticeDef参数化,并提供了方便的方法来操作(包括标准 Rust 操作 traits 的 impl)。

这种不寻常的划分存在的原因是许多类型具有多个同样可行的格,你可以基于它们构建(例如,u32-with-minu32-with-max),我们希望避免任何给定的格定义与类型耦合,或者意外地将类型“标准语义”的任何实现继承为格的语义,例如,我们不希望继承 u32 的标准偏序作为任何格的偏序,除非明确构建此类格。

示例

简单的 u32-with-max 格

use pergola::{MaxDef,LatticeElt};

type Def = MaxDef<u32>;      // lattice def for "u32 with max for join"
type Elt = LatticeElt<Def>;  // element struct, implementing std traits
let v = Elt::new_from(1);
let u = Elt::new_from(2);
let w = v + u;               // calls join(), which calls max()
assert!(v < u);
assert!(v < w);

复合元组格

use pergola::{MaxDef,Tuple3,LatticeElt};

type NumDef = MaxDef<u32>;
type NumElt = LatticeElt<NumDef>;
type TupDef = Tuple3<NumDef,NumDef,NumDef>;
type TupElt = LatticeElt<TupDef>;
let n1: NumElt = (1).into();
let n2: NumElt = (2).into();
let n3: NumElt = (3).into();
let tup: TupElt = (n1, n2, n3).into();
assert!(tup.value.0 < tup.value.1);
assert!((tup.value.0 + tup.value.1) == tup.value.1);
let n1ref: &NumElt = &tup.value.0;
let n2ref: &NumElt = &tup.value.1;
assert!(n1ref < n2ref);

更复杂的并集-映射-并集位集格

use pergola::{BTreeMapWithUnion,BitSetWithUnion,LatticeElt};
use bit_set::BitSet;
use std::collections::BTreeMap;

type Def = BTreeMapWithUnion<String,BitSetWithUnion>;
type Elt = LatticeElt<Def>;
let bs_a1 = BitSet::from_bytes(&[0b11110000]);
let bs_a2 = BitSet::from_bytes(&[0b00001111]);
let bs_b = BitSet::from_bytes(&[0b10101010]);
let v = Elt::new_from([(String::from("a"),bs_a1.into()),
                       (String::from("b"),bs_b.into())].iter().cloned().collect());
let u = Elt::new_from([(String::from("a"),bs_a2.into())].iter().cloned().collect());
let w = &v + &u;
assert!(!(v < u));  // bs_a1 is not a subset of bs_a2,
                    // so v["a"] is unordered wrt. u["a"].
assert!(v < w);     // However, w is a join and join unions
                    // the values at common keys, so v["a"] < w["a"].
assert!(u < w);     // And likewise the other input to the join.
assert_eq!(w.value["a"].value.0, BitSet::from_bytes(&[0b11111111]));
assert_eq!(w.value["b"].value.0, BitSet::from_bytes(&[0b10101010]));

名称

维基百科

凉亭是一种户外花园设施,形成由垂直柱子支撑的遮蔽步行道、通道或休息区,通常支撑着横梁和坚固的开孔格架,通常在格架上栽培木质藤本植物。

依赖项

~2–2.7MB
~61K SLoC