Guest User

Untitled

a guest
Jan 16th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.28 KB | None | 0 0
  1. use std::marker::PhantomData;
  2.  
  3. trait TransformStep<S, X> { }
  4.  
  5. struct Start;
  6.  
  7.  
  8. impl<S> TransformStep<S, S> for Start { }
  9.  
  10. struct Transform<S, F, Xin, Xout, P>
  11. where
  12. P: TransformStep<S, Xin>,
  13. F: Fn(Xin) -> Xout,
  14. {
  15. previous: P,
  16. transform: F,
  17. _a: PhantomData<S>,
  18. _b: PhantomData<Xin>,
  19. _c: PhantomData<Xout>,
  20. }
  21.  
  22. impl<S, F, Xin, Xout, P> TransformStep<S, Xout> for Transform<S, F, Xin, Xout, P>
  23. where
  24. P: TransformStep<S, Xin>,
  25. F: Fn(Xin) -> Xout,
  26. { }
  27.  
  28. impl<S, F, Xin, Xout, P> Transform<S, F, Xin, Xout, P>
  29. where
  30. P: TransformStep<S, Xin>,
  31. F: Fn(Xin) -> Xout,
  32. {
  33. pub fn new(f: F) -> Transform<S, F, Xin, Xout, P> {
  34. Transform {
  35. previous: Start,
  36. transform: f,
  37. _a: PhantomData,
  38. _b: PhantomData,
  39. _c: PhantomData,
  40. }
  41. }
  42.  
  43. pub fn extend<XXout, G, PP>(self, f:G) -> Transform<S, G, Xout, XXout, PP>
  44. where
  45. PP: TransformStep<S, Xout>,
  46. G: Fn(Xout) -> XXout,
  47. {
  48. Transform {
  49. previous: self,
  50. transform: f,
  51. _a: PhantomData,
  52. _b: PhantomData,
  53. _c: PhantomData,
  54. }
  55. }
  56. }
  57.  
  58.  
  59. fn main() {
  60. let t = Transform::new(|x:u64| x + 10)
  61. .extend(|x| x * 12)
  62. .extend(|x| x.to_string());
  63. }
Add Comment
Please, Sign In to add comment