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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*!
For ordering DOM nodes relative to each other.
When multiple futures are combined (by join, race, etc.), we want to render
them in order. For example, this arrangement of futures
```text
┌───────┐
│ │
│ <div> │
│ │
└───┬───┘
│
│
┌─────────────────────┴─────────────────────┐
│ Join Future │
│ │
│ Child 1 Child 2 Child 3 │
│ ┌───────┐ ┌───────┐ ┌───────┐ │
│ │ │ │ │ │ │ │
│ │ │ │<label>│ │<input>│ │
│ │ │ │ │ │ │ │
│ └───┬───┘ └───────┘ └───────┘ │
│ │ │
└─────┼─────────────────────────────────────┘
│
│
│
┌─────────────┴──────────────┐
│ Race Future │
│ │
│ Child 1 Child 2 │
│ ┌───────┐ ┌───────┐ │
│ │ │ │ │ │
│ │ <nav> │ │ <img> │ │
│ │ │ │ │ │
│ └───────┘ └───────┘ │
│ │
│ │
└────────────────────────────┘
```
should render to
```html
<div>
<nav />
<img />
<label />
<input />
</div>
```
To acheive this, the combinators (join/race/...) give each child its index ([PositionSegment]).
When a future wants to insert something, the indices are assembled into a path ([ChildPosition]).
Paths are ordered and stored in a [BTreeMap][std::collections::BTreeMap], so we find the rendered element
with the next higher path and `insertBefore` that element.
*/
use SmallVec;
use Ordering;
/// Reverse lexicographical comparison.
/// An index that combinators give their children.
type PositionSegment = u32;
/// A path assembled from indices.
///
/// This path is assembled from the leaf up the tree, thus the most significant
/// segment is the last item in it.
;