mago_codex/ttype/template/
variance.rs1use mago_phpdoc_syntax::cst::TemplateTagValueVariance;
2
3#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
4#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5pub enum Variance {
6 Invariant,
7 Covariant,
8 Contravariant,
9}
10
11impl From<TemplateTagValueVariance> for Variance {
12 fn from(variance: TemplateTagValueVariance) -> Self {
13 match variance {
14 TemplateTagValueVariance::Invariant => Variance::Invariant,
15 TemplateTagValueVariance::Covariant => Variance::Covariant,
16 TemplateTagValueVariance::Contravariant => Variance::Contravariant,
17 }
18 }
19}
20
21impl Variance {
22 #[inline]
23 #[must_use]
24 pub const fn is_invariant(&self) -> bool {
25 matches!(self, Variance::Invariant)
26 }
27
28 #[inline]
29 #[must_use]
30 pub const fn is_covariant(&self) -> bool {
31 matches!(self, Variance::Covariant)
32 }
33
34 #[inline]
35 #[must_use]
36 pub const fn is_contravariant(&self) -> bool {
37 matches!(self, Variance::Contravariant)
38 }
39
40 #[inline]
41 #[must_use]
42 pub const fn is_readonly(&self) -> bool {
43 matches!(self, Variance::Covariant | Variance::Invariant)
44 }
45
46 #[inline]
60 #[must_use]
61 pub const fn combine(outer_variance: Self, inner_variance: Self) -> Self {
62 match (outer_variance, inner_variance) {
63 (Variance::Invariant, _) | (_, Variance::Invariant) => Variance::Invariant,
65 (Variance::Covariant, Variance::Covariant) => Variance::Covariant,
67 (Variance::Contravariant, Variance::Contravariant) => Variance::Covariant,
69 (Variance::Covariant, Variance::Contravariant) => Variance::Contravariant,
71 (Variance::Contravariant, Variance::Covariant) => Variance::Contravariant,
73 }
74 }
75}
76
77impl std::fmt::Display for Variance {
78 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
79 match self {
80 Variance::Invariant => write!(f, "invariant"),
81 Variance::Covariant => write!(f, "covariant"),
82 Variance::Contravariant => write!(f, "contravariant"),
83 }
84 }
85}