Skip to content

mversic/disjoint_impls

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

156 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Disjoint Impls

crates.io docs.rs CI

Crate will be maintained (at least) until this idiom is allowed by the Rust compiler directly

Description

Enables writing non-overlapping (disjoint) impls distinguished by a set of associated types.

Works for trait and inherent implementations alike (no special syntax).

Trait implementations

use disjoint_impls::disjoint_impls;

pub trait Dispatch {
    type Group;
}

disjoint_impls! {
    pub trait Kita {}

    impl<T: Dispatch<Group = u32>> Kita for T {}
    impl<T: Dispatch<Group = i32>> Kita for T {}
}

Inherent implementations

use disjoint_impls::disjoint_impls;

pub trait Dispatch {
    type Group;
}

struct Wrapper<T>(T);

disjoint_impls! {
    impl<T: Dispatch<Group = u32>> Wrapper<T> {}
    impl<T: Dispatch<Group = i32>> Wrapper<T> {}
}

Foreign(remote) traits

For traits defined outside the current crate (a.k.a. foreign or remote traits), duplicate the trait definition inside the macro and annotate it with #[disjoint_impls(remote)].

use disjoint_impls::disjoint_impls;
// A foreign trait must be brought into scope so
// the `disjoint_impls!` macro can refer to it.
use remote_trait::ForeignKita;

pub trait Dispatch {
    type Group;
}

// (orphan rule): You can define blanket impls only
// for types that are defined in the current crate
pub struct LocalType<T>(T);

disjoint_impls! {
    #[disjoint_impls(remote)]
    pub trait ForeignKita {
        fn kita() {
            unreachable!("method is accessed through the original trait");
        }
    }

    impl<T: Dispatch<Group = u32>> ForeignKita for LocalType<T> {}
    impl<T: Dispatch<Group = i32>> ForeignKita for LocalType<T> {}
}

Other, much more complex examples, can be found in tests.

About

Support for variety of disjoint impls distinguished by associated types

Resources

License

Stars

22 stars

Watchers

1 watching

Forks

Sponsor this project

  •  

Packages

 
 
 

Contributors

Languages