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
use crateDotSet;
/// Evidence that a set of removed dots has been applied at *every* roster
/// member.
///
/// The one claim [`Rhapsody::condense`](crate::metis::Rhapsody::condense) and
/// [`Composer::condense`](crate::metis::Composer::condense) accept. The inner
/// [`DotSet`] is private, so the only ways to build a `Retired` are
/// [`Retirement::retired`](crate::metis::Retirement::retired) (the honest meet
/// across a fixed roster) and the audited [`trust`](Self::trust) escape. A bare
/// `DotSet` no longer condenses: the type is the difference between "dots I have
/// removed locally" and "dots removed and applied everywhere", and only the
/// latter is safe to excise.
///
/// A bare have-set cannot reach
/// [`Rhapsody::condense`](crate::metis::Rhapsody::condense); the over-claim
/// that stranded a laggard's anchor is now unconstructible:
///
/// ```compile_fail
/// use minerva::metis::{Dot, DotSet, Rhapsody};
/// let mut rhapsody = Rhapsody::new();
/// let mut claim = DotSet::new();
/// claim.insert(Dot::from_parts(1, 1).unwrap());
/// // The claim is a bare DotSet, not a witnessed Retired: this does not compile.
/// let _ = rhapsody.condense(&claim);
/// ```
///
/// The honest path takes a witness built by
/// [`Retirement`](crate::metis::Retirement) (or, with the burden documented,
/// [`trust`](Self::trust)):
///
/// ```
/// use minerva::metis::{Dot, DotSet, Retirement, Rhapsody};
/// let mut retirement = Retirement::new([1u32]);
/// let mut applied = DotSet::new();
/// applied.insert(Dot::from_parts(1, 1).unwrap());
/// retirement.acknowledge(1, &applied).unwrap();
/// let mut rhapsody = Rhapsody::new();
/// let _excised = rhapsody.condense(&retirement.retired());
/// ```
;