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
//! **What hangs UNDER a conversation, and whether it is on the glass**
//! (bl-00f5).
//!
//! # The strip is the index of what is happening, and two thirds of it was
//! bookkeeping
//!
//! One session of ordinary work answered twelve conversations, of which five
//! were compactors the operator never started — each with a minted name as
//! memorable as the work's, each at the same weight, four of the five
//! belonging to ONE conversation. The rows were not wrong: `depth` is 1 and
//! the preview says what they are. But an index whose majority is machinery is
//! an index people learn to stop reading.
//!
//! # The rule is about DESCENT and not about compactors
//!
//! **The wire carries no kind.** A conversation row spells its address, its
//! badge, its preview and how far it hangs under its root; nothing on it says
//! *this one is a compactor*, and nothing should — a fork's candidate is a
//! depth-1 row the operator DID start, and a seat that guessed from a preview
//! would be reading prose to make a structural decision.
//!
//! What the engine does give is the descent, and the descent is the whole
//! answer: **the list is the conversations, and what hangs under one is under
//! it.** A root is always on the glass; its subtree is one gesture away and
//! says how much of it there is. That satisfies the ball's own first remedy —
//! *compactors fold under the conversation they compact* — without a rule
//! about compactors, and it folds a fork's candidates on the same terms, which
//! is right for the same reason: both are what this conversation is made of.
//!
//! # It is ONE list, so the fold is here rather than in the pane
//!
//! [`Model::rows`] is what the pointer paints and the keyboard walks
//! (`super::claim`), so a fold applied in the pane would be a row a click
//! could not reach and a key could — which is the second surface
//! `crate::ui::keys` exists in order not to have. Filtering the one list keeps
//! both honest for free.
//!
//! **What the attention rows say is not this seat's to fix.** Every compactor
//! in that session earned an `attention` row saying *came to rest — your
//! turn*, which is false of a finished compaction; that is a fact the engine
//! answers and yog's own ball owns it. This seat's half is where the rows are
//! painted.
use crateConvRow;
use crateModel;