use std::marker::PhantomData;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(transparent)]
#[serde(transparent)]
pub struct Id<K> {
index: u32,
#[serde(skip)]
kind: PhantomData<fn() -> K>,
}
impl<K> Id<K> {
pub fn index(self) -> u32 {
self.index
}
pub(crate) fn new(index: u32) -> Self {
Self {
index,
kind: PhantomData,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct UnitIdKind;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct DefinitionIdKind;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ReferenceIdKind;
pub type ResolutionUnitId = Id<UnitIdKind>;
pub type DefinitionId = Id<DefinitionIdKind>;
pub type ReferenceId = Id<ReferenceIdKind>;