6 个版本 (3 个破坏性更新)

0.4.1 2022年10月8日
0.4.0 2022年10月5日
0.3.0 2022年10月4日
0.2.0 2022年9月29日
0.1.1 2022年9月26日

#23 in #union

MIT 许可证

25KB
590

Coproduct

你是否曾遇到过这样的情况,你想有两个枚举,但只有少数几个变体不同?通常这涉及到大量的重复和模板代码。不再是了!积产品允许你轻松地描述它们并在它们之间进行转换!

use coproduct::{Coproduct, MkUnion, Union};

#[derive(Debug)]
struct A;
#[derive(Debug)]
struct B;
#[derive(Debug)]
struct C;
#[derive(Debug)]
struct D;

type ABC = MkUnion!(A, B, C);

fn main() {
    let abc: Coproduct<ABC> = Coproduct::inject(A);
    let abcd: Coproduct<Union<D, ABC>> = abc.embed();
    println!("{:?}", abcd);
}

更多详情请参阅文档


lib.rs:

Rust 枚举是积产品,但这个库提供的数据结构允许编写操作泛型积产品的函数。

例如,以下函数可以接受任何可能包含猫的积产品。

fn is_cat<C, I>(maybe_cat: C) -> bool
where
    C: coproduct::At<I, Cat>,
{
    maybe_cat.uninject().is_ok()
}

积产品占用的内存与最大的变体相同,加上32位的标签,这几乎是最佳状态。它们不受益于 Rust 的枚举布局优化,但这个 crate 的整个原因就是那些优化并不完美。将积产品实现为类似纯函数列表的嵌套枚举会导致极端的内存使用。(在 Rust 1.66 上测试)

另一个好处是,当不需要假装遍历嵌套结构时,一些函数的实现会更加简单。缺点是,与 frunk 提供的积产品不同,这个库使用了不安全代码。

没有运行时依赖