Skip to main content

GenericFunction

Struct GenericFunction 

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

A named generic function: a set of DispatchMethods sharing one name.

This is the dispatch organ’s central object. Methods are added with add_method; a call selects the single most specific applicable primary method (plus around/before/after methods) by matching arguments through the kernel Shape protocol. The kernel defines the callable/operation contracts; this type supplies the concrete dispatch.

§Examples

use std::sync::Arc;
use sim_kernel::{Cx, DefaultFactory, ExprKind, NoopEvalPolicy, Shape, Symbol};
use sim_lib_dispatch::{DispatchMethod, GenericFunction, MethodRole};
use sim_shape::{AnyShape, ExprKindShape};

let mut cx = Cx::new(Arc::new(NoopEvalPolicy), Arc::new(DefaultFactory));
let mut generic = GenericFunction::new(Symbol::qualified("demo", "describe"));

// A broad fallback and a more specific string method.
generic.add_method(DispatchMethod::new(
    Symbol::qualified("method", "any"),
    MethodRole::Primary,
    vec![Arc::new(AnyShape) as Arc<dyn Shape>],
    Arc::new(|cx: &mut Cx, _| cx.factory().string("any".to_owned())),
)).unwrap();
generic.add_method(DispatchMethod::new(
    Symbol::qualified("method", "string"),
    MethodRole::Primary,
    vec![Arc::new(ExprKindShape::new(ExprKind::String)) as Arc<dyn Shape>],
    Arc::new(|cx: &mut Cx, _| cx.factory().string("string".to_owned())),
)).unwrap();

let args = [cx.factory().string("hi".to_owned()).unwrap()];
// The string method is more specific, so it is selected.
let selected = generic.select_primary(&mut cx, &args).unwrap();
assert_eq!(selected.method(), &Symbol::qualified("method", "string"));

Implementations§

Source§

impl GenericFunction

Source

pub fn new(name: Symbol) -> Self

Creates an empty generic function with the given name.

Source

pub fn name(&self) -> &Symbol

Returns the generic function’s name.

Source

pub fn methods(&self) -> &[DispatchMethod]

Returns the methods added to this generic function, in insertion order.

Source

pub fn operation_hints(&self) -> Vec<HintMetadata>

Returns agent-consumable operation hints from the generic and methods.

Source

pub fn add_method(&mut self, method: DispatchMethod) -> Result<()>

Adds a method, erroring if one with the same id, role, and arity exists.

Source

pub fn select_primary( &self, cx: &mut Cx, args: &[Value], ) -> Result<MethodSpecificity>

Returns the specificity of the most specific applicable primary method.

Errors if no primary method applies, or if the two most specific tie (an ambiguous primary).

Source

pub fn dispatch_order(&self, cx: &mut Cx, args: &[Value]) -> Result<Vec<Symbol>>

Returns the method ids in the order call runs them.

The plan is around (most specific first), before (most specific first), the selected primary, then after (least specific first).

Source

pub fn inspect_specificity( &self, cx: &mut Cx, args: &[Value], ) -> Result<Vec<MethodSpecificity>>

Returns every applicable method’s specificity, ordered for display.

Sorts by combination role, then most specific first, then method id; backs the dispatch inspect operation.

Source

pub fn call(&self, cx: &mut Cx, args: &[Value]) -> Result<Value>

Dispatches the call: runs the combination and returns the primary result.

Executes around, before, the selected primary, and after methods in order; errors if no applicable primary method exists.

Source

pub fn call_for_profile( &self, cx: &mut Cx, _profile: &Symbol, args: &[Value], ) -> Result<Value>

Dispatches the call for a named language profile.

One generic function serves every profile: dispatch is profile-neutral, so this delegates to call. The profile argument lets profile-specific surfaces share a single generic.

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.

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

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.