use std::marker::PhantomData;
use crate::predicate::Predicate;
pub trait InferenceRule {
type SourceSub;
type SourcePredicate: Predicate<Self::SourceSub>;
type TargetSub;
type TargetPredicate: Predicate<Self::TargetSub>;
type SubjectTransform: Operation<Arg = Self::SourceSub, Result = Self::TargetSub>;
}
pub trait Operation {
type Arg;
type Result;
fn call(self, source_sub: Self::Arg) -> Self::Result;
}
pub trait AuthorizedInferenceRuleGhost<TPredicate: Predicate<TSub>, TSub> {}
pub trait PreservingTransformGhost<SPredicate: Predicate<Sub>, Sub> {}
#[derive(Debug)]
pub struct IdentityTransform<Sub> {
_phantom: PhantomData<fn() -> Sub>,
}
impl<Sub> Default for IdentityTransform<Sub> {
#[inline]
fn default() -> Self {
Self {
_phantom: PhantomData,
}
}
}
impl<Sub> Operation for IdentityTransform<Sub> {
type Arg = Sub;
type Result = Sub;
#[inline]
fn call(self, source_sub: Self::Arg) -> Self::Result {
source_sub
}
}
impl<Sub, P: Predicate<Sub>> PreservingTransformGhost<P, Sub>
for PhantomData<IdentityTransform<Sub>>
{
}