use crate::HostTypes;
pub trait MonoidalProduct<H: HostTypes> {
type ComputationDatum: crate::user::morphism::ComputationDatum<H>;
fn left_operand(&self) -> &Self::ComputationDatum;
fn right_operand(&self) -> &Self::ComputationDatum;
type Datum: crate::kernel::schema::Datum<H>;
fn composed_result(&self) -> &Self::Datum;
fn saturation_value(&self) -> H::Decimal;
}
pub trait MonoidalUnit<H: HostTypes> {
type Certificate: crate::bridge::cert::Certificate<H>;
fn unit_witness_ref(&self) -> &Self::Certificate;
}
pub trait MonoidalAssociator<H: HostTypes> {
type MonoidalProduct: MonoidalProduct<H>;
fn associator_left(&self) -> &Self::MonoidalProduct;
fn associator_right(&self) -> &Self::MonoidalProduct;
type Certificate: crate::bridge::cert::Certificate<H>;
fn associator_witness_ref(&self) -> &Self::Certificate;
}
#[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 NullMonoidalProduct<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullMonoidalProduct<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullMonoidalProduct<H> {
pub const ABSENT: NullMonoidalProduct<H> = NullMonoidalProduct {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> MonoidalProduct<H> for NullMonoidalProduct<H> {
type ComputationDatum = crate::user::morphism::NullComputationDatum<H>;
fn left_operand(&self) -> &Self::ComputationDatum {
&<crate::user::morphism::NullComputationDatum<H>>::ABSENT
}
fn right_operand(&self) -> &Self::ComputationDatum {
&<crate::user::morphism::NullComputationDatum<H>>::ABSENT
}
type Datum = crate::kernel::schema::NullDatum<H>;
fn composed_result(&self) -> &Self::Datum {
&<crate::kernel::schema::NullDatum<H>>::ABSENT
}
fn saturation_value(&self) -> H::Decimal {
H::EMPTY_DECIMAL
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullMonoidalUnit<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullMonoidalUnit<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullMonoidalUnit<H> {
pub const ABSENT: NullMonoidalUnit<H> = NullMonoidalUnit {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> MonoidalUnit<H> for NullMonoidalUnit<H> {
type Certificate = crate::bridge::cert::NullCertificate<H>;
fn unit_witness_ref(&self) -> &Self::Certificate {
&<crate::bridge::cert::NullCertificate<H>>::ABSENT
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullMonoidalAssociator<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullMonoidalAssociator<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullMonoidalAssociator<H> {
pub const ABSENT: NullMonoidalAssociator<H> = NullMonoidalAssociator {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> MonoidalAssociator<H> for NullMonoidalAssociator<H> {
type MonoidalProduct = NullMonoidalProduct<H>;
fn associator_left(&self) -> &Self::MonoidalProduct {
&<NullMonoidalProduct<H>>::ABSENT
}
fn associator_right(&self) -> &Self::MonoidalProduct {
&<NullMonoidalProduct<H>>::ABSENT
}
type Certificate = crate::bridge::cert::NullCertificate<H>;
fn associator_witness_ref(&self) -> &Self::Certificate {
&<crate::bridge::cert::NullCertificate<H>>::ABSENT
}
}
#[derive(Debug)]
pub struct MonoidalUnitHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for MonoidalUnitHandle<H> {}
impl<H: HostTypes> Clone for MonoidalUnitHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for MonoidalUnitHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for MonoidalUnitHandle<H> {}
impl<H: HostTypes> core::hash::Hash for MonoidalUnitHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> MonoidalUnitHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait MonoidalUnitResolver<H: HostTypes> {
fn resolve(&self, handle: MonoidalUnitHandle<H>) -> Option<MonoidalUnitRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct MonoidalUnitRecord<H: HostTypes> {
pub unit_witness_ref_handle: crate::bridge::cert::CertificateHandle<H>,
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedMonoidalUnit<'r, R: MonoidalUnitResolver<H>, H: HostTypes> {
handle: MonoidalUnitHandle<H>,
resolver: &'r R,
record: Option<MonoidalUnitRecord<H>>,
}
impl<'r, R: MonoidalUnitResolver<H>, H: HostTypes> ResolvedMonoidalUnit<'r, R, H> {
#[inline]
pub fn new(handle: MonoidalUnitHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> MonoidalUnitHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&MonoidalUnitRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: MonoidalUnitResolver<H>, H: HostTypes> MonoidalUnit<H>
for ResolvedMonoidalUnit<'r, R, H>
{
type Certificate = crate::bridge::cert::NullCertificate<H>;
fn unit_witness_ref(&self) -> &Self::Certificate {
&<crate::bridge::cert::NullCertificate<H>>::ABSENT
}
}
impl<'r, R: MonoidalUnitResolver<H>, H: HostTypes> ResolvedMonoidalUnit<'r, R, H> {
#[inline]
pub fn resolve_unit_witness_ref<'r2, R2: crate::bridge::cert::CertificateResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<crate::bridge::cert::ResolvedCertificate<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(crate::bridge::cert::ResolvedCertificate::new(
record.unit_witness_ref_handle,
r,
))
}
}
#[derive(Debug)]
pub struct MonoidalAssociatorHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for MonoidalAssociatorHandle<H> {}
impl<H: HostTypes> Clone for MonoidalAssociatorHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for MonoidalAssociatorHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for MonoidalAssociatorHandle<H> {}
impl<H: HostTypes> core::hash::Hash for MonoidalAssociatorHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> MonoidalAssociatorHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait MonoidalAssociatorResolver<H: HostTypes> {
fn resolve(&self, handle: MonoidalAssociatorHandle<H>) -> Option<MonoidalAssociatorRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct MonoidalAssociatorRecord<H: HostTypes> {
pub associator_witness_ref_handle: crate::bridge::cert::CertificateHandle<H>,
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedMonoidalAssociator<'r, R: MonoidalAssociatorResolver<H>, H: HostTypes> {
handle: MonoidalAssociatorHandle<H>,
resolver: &'r R,
record: Option<MonoidalAssociatorRecord<H>>,
}
impl<'r, R: MonoidalAssociatorResolver<H>, H: HostTypes> ResolvedMonoidalAssociator<'r, R, H> {
#[inline]
pub fn new(handle: MonoidalAssociatorHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> MonoidalAssociatorHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&MonoidalAssociatorRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: MonoidalAssociatorResolver<H>, H: HostTypes> MonoidalAssociator<H>
for ResolvedMonoidalAssociator<'r, R, H>
{
type MonoidalProduct = NullMonoidalProduct<H>;
fn associator_left(&self) -> &Self::MonoidalProduct {
&<NullMonoidalProduct<H>>::ABSENT
}
fn associator_right(&self) -> &Self::MonoidalProduct {
&<NullMonoidalProduct<H>>::ABSENT
}
type Certificate = crate::bridge::cert::NullCertificate<H>;
fn associator_witness_ref(&self) -> &Self::Certificate {
&<crate::bridge::cert::NullCertificate<H>>::ABSENT
}
}
impl<'r, R: MonoidalAssociatorResolver<H>, H: HostTypes> ResolvedMonoidalAssociator<'r, R, H> {
#[inline]
pub fn resolve_associator_witness_ref<'r2, R2: crate::bridge::cert::CertificateResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<crate::bridge::cert::ResolvedCertificate<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(crate::bridge::cert::ResolvedCertificate::new(
record.associator_witness_ref_handle,
r,
))
}
}