# Struct chalk_recursive::fixed_point::RecursiveContext

``````pub(crate) struct RecursiveContext<K, V>where
K: Hash + Eq + Debug + Clone,
V: Debug + Clone,{
stack: Stack,
search_graph: SearchGraph<K, V>,
cache: Option<Cache<K, V>>,
max_size: usize,
}``````

## Fields§

§`stack: Stack`§`search_graph: SearchGraph<K, V>`

The “search graph” stores “in-progress results” that are still being solved.

§`cache: Option<Cache<K, V>>`

The “cache” stores results for goals that we have completely solved. Things are added to the cache when we have completely processed their result.

§`max_size: usize`

The maximum size for goals.

## Implementations§

source§

### impl<K, V> RecursiveContext<K, V>where K: Hash + Eq + Debug + Clone, V: Debug + Clone,

source

source

source

#### pub fn solve_root_goal( &mut self, canonical_goal: &K, solver_stuff: impl SolverStuff<K, V>, should_continue: impl Fn() -> bool + Clone ) -> V

Solves a canonical goal. The substitution returned in the solution will be for the fully decomposed goal. For example, given the program

``````struct u8 { }
struct SomeType<T> { }
trait Foo<T> { }
impl<U> Foo<u8> for SomeType<U> { }``````

and the goal `exists<V> { forall<U> { SomeType<U>: Foo<V> } }`, `into_peeled_goal` can be used to create a canonical goal `SomeType<!1>: Foo<?0>`. This function will then return a solution with the substitution `?0 := u8`.

source

#### pub fn solve_goal( &mut self, goal: &K, minimums: &mut Minimums, solver_stuff: impl SolverStuff<K, V>, should_continue: impl Fn() -> bool + Clone ) -> V

Attempt to solve a goal that has been fully broken down into leaf form and canonicalized. This is where the action really happens, and is the place where we would perform caching in rustc (and may eventually do in Chalk).

source

§

§

§

§

§

## Blanket Implementations§

source§

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

source§

#### fn type_id(&self) -> TypeId

Gets the `TypeId` of `self`. Read more
source§

### impl<T> Borrow<T> for Twhere T: ?Sized,

source§

#### fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

### impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

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

Mutably borrows from an owned value. Read more
§

### impl<T> Cast for T

§

#### fn cast<U>(self, interner: <U as HasInterner>::Interner) -> Uwhere Self: CastTo<U>, U: HasInterner,

Cast a value to type `U` using `CastTo`.
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 Twhere 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.

source§

### impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

#### 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 Twhere U: TryFrom<T>,

§

#### 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