Variance is a set of PhantomData
-like marker types that make it easier to
specify the [variance] of your generic types with respect to their parameters.
The Variance crate is available on crates.io. Add the following dependency to your Cargo manifest:
toml
[dependencies]
type-variance = "0.0.1"
See the docs for detailed usage information.
The crate provides three zero-sized marker types: Covariant<T>
,
Contravariant<T>
, and Invariant<T>
, each marking the given type parameter
as having the respective variance.
For example: ``` rust use type_variance::{Covariant, Contravariant};
// UnaryFunction is a zero-sized type that is covariant to Arg
and
// contravariant to Ret
.
struct UnaryFunction
fn foo<'sup>() {
// Here, the type &'static() is a subtype of &'sup().
// Therefore, Arg
may be replaced with a subtype and Ret
may be
// replaced with a supertype.
let _func: UnaryFunction<&'sup(), &'static()> = UnaryFunction {
arg: Covariant::<&'static()>::default(),
ret: Contravariant::<&'sup()>::default(),
};
}
```
This crate is MIT licensed.