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
48
49
50
51
sequenceDiagram
    participant walker as Walker
    participant request as RequestHint
    participant value as Value\nT
    participant value_borrow as Value\n&'ctx T
    participant value_temp_borrow as Value\n&'a T
    participant value_mut_borrow as Value\n&'ctx mut T
    participant value_temp_mut_borrow as Value\n&'a mut T

    Note over request,value_temp_mut_borrow: ValueBuilder

    rect rgba(120, 120, 120, 0.2)
        note left of walker: Value Flow\nOwned
        walker ->> value: visit()
    end
    rect rgba(120, 120, 120, 0.2)
        note left of walker: Value Flow\nContext Borrowed 
        walker ->> value_borrow: visit()
    end
    rect rgba(120, 120, 120, 0.2)
        note left of walker: Value Flow\nTemp Borrowed 
        walker ->> value_temp_borrow: visit()
    end
    rect rgba(120, 120, 120, 0.2)
        note left of walker: Value Flow\nContext Mutable Borrowed 
        walker ->> value_mut_borrow: visit()
    end
    rect rgba(120, 120, 120, 0.2)
        note left of walker: Value Flow\nTemp Mutable Borrowed 
        walker ->> value_temp_mut_borrow: visit()
    end
    rect rgba(120, 120, 120, 0.2)
        note left of walker: Request Hint Flow
        walker ->> request: request_hint()
        alt Walker supports by ownership
            request ->> walker: hint<Value<T>>()
            walker ->> value: visit()
        else Walker supports by context borrow
            request ->> walker: hint<Value<&'ctx T>>()
            walker ->> value_borrow: visit()
        else Walker supports by temp borrow
            request ->> walker: hint<Value<&'a T>>()
            walker ->> value_temp_borrow: visit()
        else Walker supports by context mutable borrow
            request ->> walker: hint<Value<&'ctx mut T>>()
            walker ->> value_mut_borrow: visit()
        else Walker supports by tmep mutable borrow
            request ->> walker: hint<Value<&'a mut T>>()
            walker ->> value_temp_mut_borrow: visit()
        end
    end