use super::{Symbol, Tape, Value, ValueId};
use crate::Differentiable;
pub trait ValueRef<Data>: sealed::Sealed<Data> {}
impl<Data: Differentiable> ValueRef<Data> for Value<'_, Data> {}
impl<Data> ValueRef<Data> for Symbol {}
pub(crate) enum Designation<'reference, Data> {
Bound {
tape: &'reference Tape<Data>,
id: ValueId,
},
Named(Symbol),
}
#[allow(private_interfaces)]
pub(crate) mod sealed {
use super::{Designation, Symbol, Value};
use crate::Differentiable;
pub trait Sealed<Data> {
fn designation(&self) -> Designation<'_, Data>;
}
impl<Data: Differentiable> Sealed<Data> for Value<'_, Data> {
fn designation(&self) -> Designation<'_, Data> {
Designation::Bound {
tape: self.tape(),
id: self.id(),
}
}
}
impl<Data> Sealed<Data> for Symbol {
fn designation(&self) -> Designation<'_, Data> {
Designation::Named(*self)
}
}
}
#[cfg(test)]
#[path = "tests/reference_tests.rs"]
mod tests;