Skip to main content

cgp_handler/components/
computer.rs

1use core::marker::PhantomData;
2
3use cgp::component::UseDelegate;
4use cgp::prelude::*;
5
6use crate::UseInputDelegate;
7
8#[cgp_component(Computer)]
9#[prefix(@cgp.extra.handler in DefaultNamespace)]
10#[derive_delegate(UseDelegate<Code>)]
11#[derive_delegate(UseInputDelegate<Input>)]
12pub trait CanCompute<Code, Input> {
13    type Output;
14
15    fn compute(&self, _code: PhantomData<Code>, input: Input) -> Self::Output;
16}
17
18#[cgp_component(ComputerRef)]
19#[prefix(@cgp.extra.handler in DefaultNamespace)]
20#[derive_delegate(UseDelegate<Code>)]
21#[derive_delegate(UseInputDelegate<Input>)]
22pub trait CanComputeRef<Code, Input> {
23    type Output;
24
25    fn compute_ref(&self, _code: PhantomData<Code>, input: &Input) -> Self::Output;
26}
27
28#[cgp_provider]
29impl<Context, Code, Input, Tag, Output> Computer<Context, Code, Input> for UseField<Tag>
30where
31    Context: HasField<Tag>,
32    Context::Value: CanCompute<Code, Input, Output = Output>,
33{
34    type Output = Output;
35
36    fn compute(context: &Context, code: PhantomData<Code>, input: Input) -> Output {
37        context.get_field(PhantomData).compute(code, input)
38    }
39}