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 次下载
在 3 个crate中使用(直接使用 2 个)
81KB
2K SLoC
Pergola
这是一个小的crate,它提供了一种通用的单位连接半格类型(以下简称“格”)以及一些常见的实例。
格由两部分定义:一个定义 trait LatticeDef
,它提供了给定格的类型和函数,以及一个用户界面 struct LatticeElt
,它由一个LatticeDef
参数化,并提供了方便的方法来操作(包括标准 Rust 操作 traits 的 impl)。
这种不寻常的划分存在的原因是许多类型具有多个同样可行的格,你可以基于它们构建(例如,u32
-with-min
或 u32
-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