use super::{TLink, TLinkType};
use serde::{Deserialize, Serialize};
use std::ops::{Deref, DerefMut};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct TLinkage<Target> {
pub(super) target: Target,
pub(super) link_type: TLinkType,
pub(super) index: Box<[usize]>,
}
impl<Target> TLinkage<Target> {
pub(crate) fn new_direct(
target: Target,
link_type: TLinkType,
index: impl Into<Box<[usize]>>,
) -> Self {
Self {
target,
link_type,
index: index.into(),
}
}
pub fn will_from_self_to(&self) -> &Target {
&self.target
}
}
impl<Target> TLink<Target> for TLinkage<Target> {
fn target<'r, 's: 'r>(&'s self) -> impl Deref<Target = Target> + 'r {
&self.target
}
fn target_mut<'r, 's: 'r>(&'s mut self) -> impl DerefMut<Target = Target> + 'r {
&mut self.target
}
fn link_type(&self) -> TLinkType {
self.link_type
}
fn indexes(&self) -> &[usize] {
&self.index
}
}