mago_codex/ttype/template/
variance.rs1use serde::Deserialize;
2use serde::Serialize;
3
4#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, PartialOrd, Ord)]
5pub enum Variance {
6 Invariant,
7 Covariant,
8 Contravariant,
9}
10
11impl Variance {
12 #[inline]
13 #[must_use]
14 pub const fn is_invariant(&self) -> bool {
15 matches!(self, Variance::Invariant)
16 }
17
18 #[inline]
19 #[must_use]
20 pub const fn is_covariant(&self) -> bool {
21 matches!(self, Variance::Covariant)
22 }
23
24 #[inline]
25 #[must_use]
26 pub const fn is_contravariant(&self) -> bool {
27 matches!(self, Variance::Contravariant)
28 }
29
30 #[inline]
31 #[must_use]
32 pub const fn is_readonly(&self) -> bool {
33 matches!(self, Variance::Covariant | Variance::Invariant)
34 }
35
36 #[inline]
50 #[must_use]
51 pub const fn combine(outer_variance: Self, inner_variance: Self) -> Self {
52 match (outer_variance, inner_variance) {
53 (Variance::Invariant, _) | (_, Variance::Invariant) => Variance::Invariant,
55 (Variance::Covariant, Variance::Covariant) => Variance::Covariant,
57 (Variance::Contravariant, Variance::Contravariant) => Variance::Covariant,
59 (Variance::Covariant, Variance::Contravariant) => Variance::Contravariant,
61 (Variance::Contravariant, Variance::Covariant) => Variance::Contravariant,
63 }
64 }
65}
66
67impl std::fmt::Display for Variance {
68 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
69 match self {
70 Variance::Invariant => write!(f, "invariant"),
71 Variance::Covariant => write!(f, "covariant"),
72 Variance::Contravariant => write!(f, "contravariant"),
73 }
74 }
75}