use core::marker::PhantomData;
use cgp::component::UseDelegate;
use cgp::prelude::*;
use crate::UseInputDelegate;
#[cgp_component(Computer)]
#[prefix(@cgp.extra.handler in DefaultNamespace)]
#[derive_delegate(UseDelegate<Code>)]
#[derive_delegate(UseInputDelegate<Input>)]
pub trait CanCompute<Code, Input> {
type Output;
fn compute(&self, _code: PhantomData<Code>, input: Input) -> Self::Output;
}
#[cgp_component(ComputerRef)]
#[prefix(@cgp.extra.handler in DefaultNamespace)]
#[derive_delegate(UseDelegate<Code>)]
#[derive_delegate(UseInputDelegate<Input>)]
pub trait CanComputeRef<Code, Input> {
type Output;
fn compute_ref(&self, _code: PhantomData<Code>, input: &Input) -> Self::Output;
}
#[cgp_provider]
impl<Context, Code, Input, Tag, Output> Computer<Context, Code, Input> for UseField<Tag>
where
Context: HasField<Tag>,
Context::Value: CanCompute<Code, Input, Output = Output>,
{
type Output = Output;
fn compute(context: &Context, code: PhantomData<Code>, input: Input) -> Output {
context.get_field(PhantomData).compute(code, input)
}
}