1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
use {List, Queue};
pub trait ByRef<'a> {
type Refs: 'a;
fn by_ref(&'a self) -> Self::Refs;
}
impl<'a> ByRef<'a> for List<()> {
type Refs = List<()>;
fn by_ref(&'a self) -> Self::Refs {
List::new()
}
}
impl<'a, H: 'a, T: 'a, R: 'a> ByRef<'a> for List<(H, T)>
where T: ByRef<'a, Refs=R>
{
type Refs = List<(&'a H, R)>;
fn by_ref(&'a self) -> Self::Refs {
let List((ref head, ref tail)) = *self;
List((head, tail.by_ref()))
}
}
impl<'a> ByRef<'a> for Queue<()> {
type Refs = Queue<()>;
fn by_ref(&'a self) -> Self::Refs {
Queue::new()
}
}
impl<'a, H: 'a, T: 'a, R: 'a> ByRef<'a> for Queue<(H, T)>
where H: ByRef<'a, Refs=R>
{
type Refs = Queue<(R, &'a T)>;
fn by_ref(&'a self) -> Self::Refs {
let Queue((ref head, ref tail)) = *self;
Queue((head.by_ref(), tail))
}
}