Skip to content

jvdwrf/type-sets

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Crates.io Documentation

Type-sets

Sets implemented in the rust type-system.

This crate allows the creation of type-sets within the rust type-system. These sets can be compared using SubsetOf and SupersetOf. All traits are marked unsafe, except for AsSet, giving guarantees about conflicting implementations for use in unsafe code.

Sets are implemented up to 12 items.

This library was created for use in meslin, but is general enough that there could be other purposes as well.

Example

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>()]
    );
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages