//! Tranformer use std::marker::PhantomData; use std::ops::Add; /// Represents transformation of type `T`. pub trait Transform { /// Transforms value. fn transform(&self, value: T) -> T; } impl, Tr2: Transform> Transform<(T1, T2)> for (Tr1, Tr2) { fn transform(&self, value: (T1, T2)) -> (T1, T2) { todo!() } } /// Identity transformation. #[derive(Debug, Clone, Copy)] pub struct Identity; impl Transform for Identity { fn transform(&self, value: T) -> T { todo!() } } /// Custom transformation. #[derive(Debug, Clone, Copy)] pub struct Custom T> { f: F, _marker: PhantomData, } impl T> From for Custom { fn from(f: F) -> Self { Self { f, _marker: PhantomData, } } } impl T> Transform for Custom { fn transform(&self, value: T) -> T { todo!() } } /// Repeats transformation for `n` times. #[derive(Debug, Clone, Copy)] pub struct Repeat> { inner: Tr, n: u32, _marker: PhantomData, } impl> Repeat { /// Creates a new repeat transformation. pub fn new(inner: Tr, n: u32) -> Self { Repeat { inner, n, _marker: PhantomData, } } } impl> Transform for Repeat { fn transform(&self, mut value: T) -> T { todo!() } } /// Repeats transformation until converges. #[derive(Debug, Clone, Copy)] pub struct RepeatUntilConverge> { inner: Tr, _marker: PhantomData, } impl> RepeatUntilConverge { /// Creates a new repeat transformation. pub fn new(inner: Tr) -> Self { RepeatUntilConverge { inner, _marker: PhantomData, } } } impl> Transform for RepeatUntilConverge { fn transform(&self, mut value: T) -> T { todo!() } }