Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.74 KB | None | 0 0
  1. struct Rocket;
  2. struct Actix;
  3.  
  4. trait Retriever<'a, Back> {
  5. type Value;
  6. fn get(&'a self) -> Self::Value;
  7. }
  8.  
  9. struct Generator<G> {
  10. gen: G,
  11. }
  12.  
  13. impl<'a, G, T> Retriever<'a, Rocket> for Generator<G> where G: Fn() -> T {
  14. type Value = T;
  15. fn get(&'a self) -> T {
  16. (self.gen)()
  17. }
  18. }
  19.  
  20. impl<'a, G, T> Retriever<'a, Actix> for Generator<G> where G: Fn() -> T {
  21. type Value = T;
  22. fn get(&'a self) -> T {
  23. (self.gen)()
  24. }
  25. }
  26.  
  27. struct Reference<'borrow, T> {
  28. reference: &'borrow T,
  29. }
  30.  
  31. impl<'a, 'borrow, T> Retriever<'a, Rocket> for Reference<'borrow, T> {
  32. type Value = &'borrow T;
  33. fn get(&'a self) -> &'borrow T {
  34. self.reference
  35. }
  36. }
  37.  
  38. impl<'a, 'borrow, T> Retriever<'a, Actix> for Reference<'borrow, T> {
  39. type Value = &'borrow T;
  40. fn get(&'a self) -> &'borrow T {
  41. self.reference
  42. }
  43. }
  44.  
  45. trait WithRetriever<'a, I, R, Back> {
  46. fn run<T: Retriever<'a, Back, Value=I>>(&self, retriever: &'a T) -> R;
  47. }
  48.  
  49. impl<'a, I, R, F, Back> WithRetriever<'a, I, R, Back> for Box<F> where F: Fn(I) -> R {
  50. fn run<T: Retriever<'a, Back, Value=I>>(&self, retriever: &'a T) -> R {
  51. self(retriever.get())
  52. }
  53. }
  54.  
  55. fn double(a: u32) -> u32 {
  56. a * 2
  57. }
  58.  
  59. fn double_ref(a: &u32) -> u32 {
  60. a * 2
  61. }
  62.  
  63. fn main() {
  64. let a = Generator { gen: || 42 };
  65. let b = Reference { reference: &13 };
  66.  
  67. println!("{}", Retriever::<'_, Rocket>::get(&a));
  68. println!("{}", Retriever::<'_, Actix>::get(&b));
  69.  
  70. let c = Box::new(double);
  71. println!("{}", WithRetriever::<'_, _, _, Rocket>::run(&c, &a));
  72.  
  73. let a = Generator { gen: || &42 };
  74. let d = Box::new(double_ref);
  75. println!("{}", WithRetriever::<'_, _, _, Rocket>::run(&d, &a));
  76. println!("{}", WithRetriever::<'_, _, _, Rocket>::run(&d, &b));
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement