pub struct GoalBuilder<'i, I: Interner> {
    db: &'i dyn RustIrDatabase<I>,
}

Fields§

§db: &'i dyn RustIrDatabase<I>

Implementations§

source§

impl<'i, I: Interner> GoalBuilder<'i, I>

source

pub fn new(db: &'i dyn RustIrDatabase<I>) -> Self

source

pub fn db(&self) -> &'i dyn RustIrDatabase<I>

Returns the database within the goal builder.

source

pub fn interner(&self) -> I

Returns the interner within the goal builder.

source

pub fn all<GS, G>(&mut self, goals: GS) -> Goal<I>
where GS: IntoIterator<Item = G>, G: CastTo<Goal<I>>,

Creates a goal that ensures all of the goals from the goals iterator are met (e.g., goals[0] && ... && goals[N]).

source

pub fn implies<CS, C, G>( &mut self, clauses: CS, goal: impl FnOnce(&mut Self) -> G ) -> Goal<I>
where CS: IntoIterator<Item = C>, C: CastTo<ProgramClause<I>>, G: CastTo<Goal<I>>,

Creates a goal clauses => goal. The clauses are given as an iterator and the goal is returned via the contained closure.

source

pub fn forall<G, B, P>( &mut self, binders: &Binders<B>, passthru: P, body: fn(_: &mut Self, _: Substitution<I>, _: &B, _: P) -> G ) -> Goal<I>
where B: HasInterner<Interner = I>, P: TypeFoldable<I>, G: CastTo<Goal<I>>,

Given a bound value binders like <P0..Pn> V, creates a goal forall<Q0..Qn> { G } where the goal G is created by invoking a helper function body.

§Parameters to body

body will be invoked with:

  • the goal builder self
  • the substitution Q0..Qn
  • the bound value [P0..Pn => Q0..Qn] V instantiated with the substitution
  • the value passthru, appropriately shifted so that any debruijn indices within account for the new binder
§Why is body a function and not a closure?

This is to ensure that body doesn’t accidentally reference values from the environment whose debruijn indices do not account for the new binder being created.

source

pub fn exists<G, B, P>( &mut self, binders: &Binders<B>, passthru: P, body: fn(_: &mut Self, _: Substitution<I>, _: &B, _: P) -> G ) -> Goal<I>
where B: HasInterner<Interner = I>, P: TypeFoldable<I>, G: CastTo<Goal<I>>,

Like GoalBuilder::forall, but for a exists<Q0..Qn> { G } goal.

source

fn quantified<G, B, P>( &mut self, quantifier_kind: QuantifierKind, binders: &Binders<B>, passthru: P, body: fn(_: &mut Self, _: Substitution<I>, _: &B, _: P) -> G ) -> Goal<I>
where B: HasInterner<Interner = I>, P: TypeFoldable<I>, G: CastTo<Goal<I>>,

A combined helper functon for the various methods to create forall and exists goals. See:

for details.

Auto Trait Implementations§

§

impl<'i, I> !RefUnwindSafe for GoalBuilder<'i, I>

§

impl<'i, I> !Send for GoalBuilder<'i, I>

§

impl<'i, I> !Sync for GoalBuilder<'i, I>

§

impl<'i, I> Unpin for GoalBuilder<'i, I>

§

impl<'i, I> !UnwindSafe for GoalBuilder<'i, I>

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> Cast for T

source§

fn cast<U>(self, interner: <U as HasInterner>::Interner) -> U
where 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 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.

source§

impl<T, U> TryFrom<U> for T
where 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 T
where 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