Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::marker::PhantomData;
- trait TransformStep<S, X> { }
- struct Start;
- impl<S> TransformStep<S, S> for Start { }
- struct Transform<S, F, Xin, Xout, P>
- where
- P: TransformStep<S, Xin>,
- F: Fn(Xin) -> Xout,
- {
- previous: P,
- transform: F,
- _a: PhantomData<S>,
- _b: PhantomData<Xin>,
- _c: PhantomData<Xout>,
- }
- impl<S, F, Xin, Xout, P> TransformStep<S, Xout> for Transform<S, F, Xin, Xout, P>
- where
- P: TransformStep<S, Xin>,
- F: Fn(Xin) -> Xout,
- { }
- impl<S, F, Xin, Xout, P> Transform<S, F, Xin, Xout, P>
- where
- P: TransformStep<S, Xin>,
- F: Fn(Xin) -> Xout,
- {
- pub fn new(f: F) -> Transform<S, F, Xin, Xout, P> {
- Transform {
- previous: Start,
- transform: f,
- _a: PhantomData,
- _b: PhantomData,
- _c: PhantomData,
- }
- }
- pub fn extend<XXout, G, PP>(self, f:G) -> Transform<S, G, Xout, XXout, PP>
- where
- PP: TransformStep<S, Xout>,
- G: Fn(Xout) -> XXout,
- {
- Transform {
- previous: self,
- transform: f,
- _a: PhantomData,
- _b: PhantomData,
- _c: PhantomData,
- }
- }
- }
- fn main() {
- let t = Transform::new(|x:u64| x + 10)
- .extend(|x| x * 12)
- .extend(|x| x.to_string());
- }
Add Comment
Please, Sign In to add comment