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))
    }
}