/// Describes how likely a value is to change -- how "durable" it is. /// By default, inputs have `Durability::LOW` and interned values have /// `Durability::HIGH`. But inputs can be explicitly set with other /// durabilities. /// /// We use durabilities to optimize the work of "revalidating" a query /// after some input has changed. Ordinarily, in a new revision, /// queries have to trace all their inputs back to the base inputs to /// determine if any of those inputs have changed. But if we know that /// the only changes were to inputs of low durability (the common /// case), and we know that the query only used inputs of medium /// durability or higher, then we can skip that enumeration. /// /// Typically, one assigns low durabilites to inputs that the user is /// frequently editing. Medium or high durabilities are used for /// configuration, the source from library crates, or other things /// that are unlikely to be edited. #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] pub struct Durability(u8); impl Durability { /// Low durability: things that change frequently. /// /// Example: part of the crate being edited pub const LOW: Durability = Durability(0); /// Medium durability: things that change sometimes, but rarely. /// /// Example: a Cargo.toml file pub const MEDIUM: Durability = Durability(1); /// High durability: things that are not expected to change under /// common usage. /// /// Example: the standard library or something from crates.io pub const HIGH: Durability = Durability(2); /// The maximum possible durability; equivalent to HIGH but /// "conceptually" distinct (i.e., if we add more durability /// levels, this could change). pub(crate) const MAX: Durability = Self::HIGH; /// Number of durability levels. pub(crate) const LEN: usize = Self::MAX.index() + 1; pub(crate) const fn index(self) -> usize { self.0 as usize } }