Substitution

Struct Substitution 

Source
pub struct Substitution { /* private fields */ }
Expand description

A substitution mapping type variables to their resolved types.

The substitution is built incrementally during unification. It maps type variable IDs to InferTypes, which may themselves be type variables (requiring transitive lookup via apply).

§Performance

Uses a Vec<Option<InferType>> instead of HashMap<TypeVarId, InferType> for O(1) lookups without hashing overhead. This works because TypeVarId is a sequential u32 starting from 0.

Additionally implements path compression: when following a chain of variable references, intermediate links are updated to point directly to the final result, amortizing the cost of chain traversal.

Implementations§

Source§

impl Substitution

Source

pub fn new() -> Self

Create an empty substitution.

Source

pub fn with_capacity(capacity: usize) -> Self

Create a substitution with pre-allocated capacity.

Use when you know approximately how many type variables will be created.

Source

pub fn insert(&mut self, var: TypeVarId, ty: InferType)

Insert a mapping from a type variable to a type.

If the variable is already mapped, the old mapping is replaced.

Source

pub fn get(&self, var: TypeVarId) -> Option<InferType>

Look up a type variable’s immediate mapping (without following chains).

Source

pub fn apply(&self, ty: &InferType) -> InferType

Apply the substitution to a type, following type variable chains to their ultimate resolution.

  • Concrete(ty)Concrete(ty) (unchanged)
  • Var(id) → follows chain until concrete or unbound variable
  • IntLiteralIntLiteral (unchanged, unless we add IntLiteral to variable mappings)
  • Array { element, length } → recursively apply to element type
§Path Compression

When following a chain like v0 -> v1 -> v2 -> i32, this method updates all intermediate links to point directly to the final result. This amortizes the cost of repeated lookups.

Source

pub fn occurs_in(&self, var: TypeVarId, ty: &InferType) -> bool

Check if a type variable occurs in a type (for occurs check).

This prevents creating infinite types like α = List<α>. Returns true if the variable occurs in the type.

Source

pub fn len(&self) -> usize

Get the number of mappings in the substitution.

Note: This counts all slots that have values, requiring a full scan. For performance-critical code, consider tracking this separately.

Source

pub fn is_empty(&self) -> bool

Check if the substitution is empty.

Trait Implementations§

Source§

impl Debug for Substitution

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Substitution

Source§

fn default() -> Substitution

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<'src, T> IntoMaybe<'src, T> for T
where T: 'src,

§

type Proj<U: 'src> = U

§

fn map_maybe<R>( self, _f: impl FnOnce(&'src T) -> &'src R, g: impl FnOnce(T) -> R, ) -> <T as IntoMaybe<'src, T>>::Proj<R>
where R: 'src,

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more