airlang/
cache.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use std::ops::Deref;

use crate::{
    case::Case,
    ctx::ref1::CtxMeta,
    FuncVal,
    Val,
};

#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Cache<F, I, O>(Case<F, I, O>);

impl Cache<Val, Val, Val> {
    pub(crate) fn new<'a, Ctx>(ctx: Ctx, func: FuncVal, input: Val) -> Self
    where
        Ctx: CtxMeta<'a>,
    {
        let output = func.transform(ctx, input.clone());
        let func = Val::Func(func);
        let case = Case::new(func, input, output);
        Self(case)
    }
}

impl<F, I, O> Deref for Cache<F, I, O> {
    type Target = Case<F, I, O>;
    fn deref(&self) -> &Self::Target {
        &self.0
    }
}