6 releases
0.0.6 | Jan 21, 2024 |
---|---|
0.0.5 | Jan 19, 2024 |
#644 in Rust patterns
Used in meslin
14KB
200 lines
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>()]
);
}
Dependencies
~2MB
~40K SLoC