Advertisement
Guest User

Untitled

a guest
Jul 16th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.13 KB | None | 0 0
  1. #[derive(Clone)]
  2. pub struct Foobar {
  3. first: String,
  4. second: String,
  5. third: String,
  6. }
  7.  
  8. fn grab_first(foobar: &Foobar) -> &str {
  9. &foobar.first
  10. }
  11.  
  12. #[derive(PartialEq)]
  13. pub struct Wrapper<'a>(&'a str);
  14.  
  15. fn grab_first_wrapper(foobar: &Foobar) -> Wrapper {
  16. Wrapper(&foobar.first)
  17. }
  18.  
  19. pub trait CompareCallback<'a> {
  20. type Output: 'a + PartialEq;
  21. fn call(&'a self, arg: &'a Foobar) -> Self::Output;
  22. }
  23. impl<'a, R: 'a, F> CompareCallback<'a> for F
  24. where
  25. F: Fn(&'a Foobar) -> R,
  26. R: PartialEq,
  27. {
  28. type Output = R;
  29. fn call(&'a self, arg: &'a Foobar) -> R {
  30. self(arg)
  31. }
  32. }
  33.  
  34. pub fn go<F>(lhs: Foobar, rhs: Foobar, f: F) -> bool
  35. where
  36. F: for<'a> CompareCallback<'a>,
  37. {
  38. f.call(&lhs) == f.call(&rhs)
  39. }
  40.  
  41. fn main() {
  42. let a = Foobar {
  43. first: "alpha".to_owned(),
  44. second: "beta".to_owned(),
  45. third: "gamma".to_owned()
  46. };
  47. let b = Foobar {
  48. first: "alpha".to_owned(),
  49. second: "delta".to_owned(),
  50. third: "epsilon".to_owned()
  51. };
  52. dbg!(go(a.clone(), b.clone(), grab_first));
  53. dbg!(go(a.clone(), b.clone(), grab_first_wrapper));
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement