Skip to main content

cgp_handler/components/
computer.rs

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