#[cfg(feature = "partials")]
mod partials;
use crate::{
core::{Domain, Function, Measure, Measurement, Metric, MetricSpace, Transformation},
error::Fallible,
};
use std::ops::Shr;
use super::{make_chain_mt, make_chain_pm, make_chain_tt};
impl<DI, DX, DO, MI, MX, MO> Shr<Transformation<DX, MX, DO, MO>> for Transformation<DI, MI, DX, MX>
where
DI: 'static + Domain,
DX: 'static + Domain,
DO: 'static + Domain,
MI: 'static + Metric,
MX: 'static + Metric,
MO: 'static + Metric,
(DI, MI): MetricSpace,
(DX, MX): MetricSpace,
(DO, MO): MetricSpace,
{
type Output = Fallible<Transformation<DI, MI, DO, MO>>;
fn shr(self, rhs: Transformation<DX, MX, DO, MO>) -> Self::Output {
make_chain_tt(&rhs, &self)
}
}
impl<DI, DX, DO, MI, MX, MO> Shr<Transformation<DX, MX, DO, MO>>
for Fallible<Transformation<DI, MI, DX, MX>>
where
DI: 'static + Domain,
DX: 'static + Domain,
DO: 'static + Domain,
MI: 'static + Metric,
MX: 'static + Metric,
MO: 'static + Metric,
(DI, MI): MetricSpace,
(DX, MX): MetricSpace,
(DO, MO): MetricSpace,
{
type Output = Fallible<Transformation<DI, MI, DO, MO>>;
fn shr(self, rhs: Transformation<DX, MX, DO, MO>) -> Self::Output {
make_chain_tt(&rhs, &self?)
}
}
impl<DI, DX, MI, MX, MO, TO> Shr<Measurement<DX, MX, MO, TO>> for Transformation<DI, MI, DX, MX>
where
DI: 'static + Domain,
DX: 'static + Domain,
TO: 'static,
MI: 'static + Metric,
MX: 'static + Metric,
MO: 'static + Measure,
(DI, MI): MetricSpace,
(DX, MX): MetricSpace,
{
type Output = Fallible<Measurement<DI, MI, MO, TO>>;
fn shr(self, rhs: Measurement<DX, MX, MO, TO>) -> Self::Output {
make_chain_mt(&rhs, &self)
}
}
impl<DI, DX, MI, MX, MO, TO> Shr<Measurement<DX, MX, MO, TO>>
for Fallible<Transformation<DI, MI, DX, MX>>
where
DI: 'static + Domain,
DX: 'static + Domain,
TO: 'static,
MI: 'static + Metric,
MX: 'static + Metric,
MO: 'static + Measure,
(DI, MI): MetricSpace,
(DX, MX): MetricSpace,
{
type Output = Fallible<Measurement<DI, MI, MO, TO>>;
fn shr(self, rhs: Measurement<DX, MX, MO, TO>) -> Self::Output {
make_chain_mt(&rhs, &self?)
}
}
impl<DI, MI, MO, TX, TO> Shr<Function<TX, TO>> for Measurement<DI, MI, MO, TX>
where
DI: 'static + Domain,
MI: 'static + Metric,
MO: 'static + Measure,
TX: 'static,
TO: 'static,
(DI, MI): MetricSpace,
{
type Output = Fallible<Measurement<DI, MI, MO, TO>>;
fn shr(self, rhs: Function<TX, TO>) -> Self::Output {
make_chain_pm(&rhs, &self)
}
}
impl<DI, TX, TO, MI, MO> Shr<Function<TX, TO>> for Fallible<Measurement<DI, MI, MO, TX>>
where
DI: 'static + Domain,
TX: 'static,
TO: 'static,
MI: 'static + Metric,
MO: 'static + Measure,
(DI, MI): MetricSpace,
{
type Output = Fallible<Measurement<DI, MI, MO, TO>>;
fn shr(self, rhs: Function<TX, TO>) -> Self::Output {
make_chain_pm(&rhs, &self?)
}
}
impl<DI, DX, DO, MI, MO, MTI, MTO> Shr<Transformation<DX, MTI, DO, MTO>>
for Measurement<DI, MI, MO, DX::Carrier>
where
DI: 'static + Domain,
DX: 'static + Domain,
DO: 'static + Domain,
MI: 'static + Metric,
MO: 'static + Measure,
MTI: 'static + Metric,
MTO: 'static + Metric,
(DI, MI): MetricSpace,
(DX, MTI): MetricSpace,
(DO, MTO): MetricSpace,
{
type Output = Fallible<Measurement<DI, MI, MO, DO::Carrier>>;
fn shr(self, rhs: Transformation<DX, MTI, DO, MTO>) -> Self::Output {
make_chain_pm(&rhs.function, &self)
}
}
impl<DI, DX, DO, MI, MO, MTI, MTO> Shr<Transformation<DX, MTI, DO, MTO>>
for Fallible<Measurement<DI, MI, MO, DX::Carrier>>
where
DI: 'static + Domain,
DX: 'static + Domain,
DO: 'static + Domain,
MI: 'static + Metric,
MO: 'static + Measure,
MTI: 'static + Metric,
MTO: 'static + Metric,
(DI, MI): MetricSpace,
(DX, MTI): MetricSpace,
(DO, MTO): MetricSpace,
{
type Output = Fallible<Measurement<DI, MI, MO, DO::Carrier>>;
fn shr(self, rhs: Transformation<DX, MTI, DO, MTO>) -> Self::Output {
make_chain_pm(&rhs.function, &self?)
}
}
impl<TI, TX, TO> Shr<Function<TX, TO>> for Function<TI, TX>
where
TI: 'static,
TX: 'static,
TO: 'static,
{
type Output = Function<TI, TO>;
fn shr(self, rhs: Function<TX, TO>) -> Self::Output {
Function::make_chain(&rhs, &self)
}
}