use crate::HostTypes;
pub trait StructuralOperad<H: HostTypes> {
type StructuralOperadTarget: StructuralOperad<H>;
fn operad_structure(&self) -> &Self::StructuralOperadTarget;
}
pub trait OperadComposition<H: HostTypes> {
type TypeDefinition: crate::user::type_::TypeDefinition<H>;
fn outer_type(&self) -> &Self::TypeDefinition;
fn inner_type(&self) -> &Self::TypeDefinition;
fn composed_type(&self) -> &Self::TypeDefinition;
fn composed_site_count(&self) -> u64;
type GroundingMap: crate::user::morphism::GroundingMap<H>;
fn composed_grounding(&self) -> &Self::GroundingMap;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullStructuralOperad<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullStructuralOperad<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullStructuralOperad<H> {
pub const ABSENT: NullStructuralOperad<H> = NullStructuralOperad {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> StructuralOperad<H> for NullStructuralOperad<H> {
type StructuralOperadTarget = NullStructuralOperad<H>;
fn operad_structure(&self) -> &Self::StructuralOperadTarget {
&<NullStructuralOperad<H>>::ABSENT
}
}
#[doc(hidden)]
#[doc = "THEORY-DEFERRED \u{2014} not a valid implementation; see [docs/theory_deferred.md]. Exists only to satisfy downstream trait-bound references."]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullOperadComposition<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullOperadComposition<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullOperadComposition<H> {
pub const ABSENT: NullOperadComposition<H> = NullOperadComposition {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> OperadComposition<H> for NullOperadComposition<H> {
type TypeDefinition = crate::user::type_::NullTypeDefinition<H>;
fn outer_type(&self) -> &Self::TypeDefinition {
&<crate::user::type_::NullTypeDefinition<H>>::ABSENT
}
fn inner_type(&self) -> &Self::TypeDefinition {
&<crate::user::type_::NullTypeDefinition<H>>::ABSENT
}
fn composed_type(&self) -> &Self::TypeDefinition {
&<crate::user::type_::NullTypeDefinition<H>>::ABSENT
}
fn composed_site_count(&self) -> u64 {
0
}
type GroundingMap = crate::user::morphism::NullGroundingMap<H>;
fn composed_grounding(&self) -> &Self::GroundingMap {
&<crate::user::morphism::NullGroundingMap<H>>::ABSENT
}
}
#[derive(Debug)]
pub struct StructuralOperadHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for StructuralOperadHandle<H> {}
impl<H: HostTypes> Clone for StructuralOperadHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for StructuralOperadHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for StructuralOperadHandle<H> {}
impl<H: HostTypes> core::hash::Hash for StructuralOperadHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> StructuralOperadHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait StructuralOperadResolver<H: HostTypes> {
fn resolve(&self, handle: StructuralOperadHandle<H>) -> Option<StructuralOperadRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct StructuralOperadRecord<H: HostTypes> {
pub operad_structure_handle: StructuralOperadHandle<H>,
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedStructuralOperad<'r, R: StructuralOperadResolver<H>, H: HostTypes> {
handle: StructuralOperadHandle<H>,
resolver: &'r R,
record: Option<StructuralOperadRecord<H>>,
}
impl<'r, R: StructuralOperadResolver<H>, H: HostTypes> ResolvedStructuralOperad<'r, R, H> {
#[inline]
pub fn new(handle: StructuralOperadHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> StructuralOperadHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&StructuralOperadRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: StructuralOperadResolver<H>, H: HostTypes> StructuralOperad<H>
for ResolvedStructuralOperad<'r, R, H>
{
type StructuralOperadTarget = NullStructuralOperad<H>;
fn operad_structure(&self) -> &Self::StructuralOperadTarget {
&<NullStructuralOperad<H>>::ABSENT
}
}
impl<'r, R: StructuralOperadResolver<H>, H: HostTypes> ResolvedStructuralOperad<'r, R, H> {
#[inline]
pub fn resolve_operad_structure<'r2, R2: StructuralOperadResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<ResolvedStructuralOperad<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(ResolvedStructuralOperad::new(
record.operad_structure_handle,
r,
))
}
}