#sets #type #type-level #type-system #set

type-sets

Rust 类型系统中实现的集合

6 个版本

0.0.6 2024 年 1 月 21 日
0.0.5 2024 年 1 月 19 日

#627Rust 模式

每月 27 下载
用于 meslin

MIT/Apache

14KB
200

Crates.io Documentation

Type-sets

在 Rust 类型系统中实现的集合。

这个 crate 允许在 Rust 类型系统中创建类型集合。这些集合可以使用 SubsetOfSupersetOf 进行比较。所有特性都标记为 unsafe,除了 AsSet,这为在 unsafe 代码中使用冲突实现提供了保证。

集合最多实现 12 个项目。

这个库是为在 meslin 中使用而创建的,但它足够通用,可能还有其他用途。

示例

use type_sets::*;
use std::any::TypeId;

// We can define functions, that may only be called if the parameter `T` is
// a subset or superset of another set.
fn is_subset<T: SubsetOf<Set![u32, u64]>>() {}
fn is_superset<T: SupersetOf<Set![u32, u64]>>() {}
fn contains_u64<T: Contains<u64>>() {}

// We can also use custom structs as sets
struct MySet;
impl AsSet for MySet {
    type Set = Set![u32];
}

fn main() {
    is_subset::<Set![u32, u64]>(); // compiles
    is_subset::<Set![u64, u32]>(); // compiles
    is_subset::<Set![u32]>();
    // is_subset::<Set![u32, u64, u32]>(); // does not compile

    is_superset::<Set![u32, u64]>(); // compiles
    is_superset::<Set![u32, u64, u128]>(); // compiles
    is_superset::<Set![u128, u32, u64, u32, u32, u32]>(); // compiles
    // is_superset::<Set![u32]>(); // does not compile

    is_subset::<MySet>(); // compiles
    // is_superset::<MySet>(); // does not compile

    contains_u64::<Set![u64]>();
    // contains_u64::<Set![u32]>(); // does not compile

    assert_eq!(
        <Set![u64, u32]>::members(), 
        [TypeId::of::<u64>(), TypeId::of::<u32>()]
    );
    assert_eq!(
        MySet::members(),
        [TypeId::of::<u32>()]
    );
}

依赖项

~2MB
~37K SLoC