Guest User

Untitled

a guest
Sep 22nd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.01 KB | None | 0 0
  1. mod broken {
  2. use std::ops::Deref;
  3.  
  4. pub struct Ref<'a, T: 'a + ?Sized> {
  5. data: &'a T,
  6. }
  7.  
  8. impl<'a, T: 'a + ?Sized> Ref<'a, T> {
  9. fn data(&self) -> &T {
  10. self.data
  11. }
  12. }
  13.  
  14. impl<'a, T: 'a + ?Sized> Deref for Ref<'a, T> {
  15. type Target = T;
  16. fn deref(&self) -> &T {
  17. self.data
  18. }
  19. }
  20.  
  21. pub trait Elem {
  22. fn get_subelem<'a>(&'a self, name: &str) -> Option<Ref<'a, dyn Elem>>;
  23. }
  24.  
  25. pub trait Table {
  26. fn get_elem<'a>(&'a self, name: &str) -> Option<Ref<'a, dyn Elem>>;
  27. }
  28.  
  29. fn resolve_name<'a, T: Table + 'a>(
  30. table: &'a T,
  31. name: &[String],
  32. ) -> Option<Ref<'a, dyn Elem>> {
  33. let mut segments = name.iter();
  34. if let Some(first_segment) = segments.next() {
  35. segments.fold(table.get_elem(&first_segment), |res, next| {
  36. res.and_then(|elem| elem.data/*()*/.get_subelem(next))
  37. })
  38. } else {
  39. None
  40. }
  41. }
  42. }
Add Comment
Please, Sign In to add comment