1use crate::bounded::{Bounded, DuplicateKey, ForeignRosterReference, KeyedRoster, NonEmpty};
7
8#[path = "type_guard.rs"]
9mod guard;
10
11#[path = "questions.rs"]
12mod questions;
13
14#[derive(Debug, Clone, PartialEq, Eq, Hash)]
18pub struct KeyedRosterRows<
19 'rosters,
20 Left,
21 LeftKey,
22 Right,
23 RightKey,
24 Payload,
25 const LEFT: usize,
26 const RIGHT: usize,
27 const ROWS: usize,
28> {
29 left: &'rosters KeyedRoster<Left, LeftKey, LEFT>,
30 right: &'rosters KeyedRoster<Right, RightKey, RIGHT>,
31 rows: Bounded<ReferencedRosterRow<'rosters, Left, LeftKey, Right, RightKey, Payload>, ROWS>,
32 canonical_indices: Bounded<usize, ROWS>,
33}
34
35#[derive(Debug, Clone, PartialEq, Eq, Hash)]
37pub struct KeyedRosterRelation<
38 'rosters,
39 Left,
40 LeftKey,
41 Right,
42 RightKey,
43 Payload,
44 const LEFT: usize,
45 const RIGHT: usize,
46 const ROWS: usize,
47> {
48 rows: KeyedRosterRows<'rosters, Left, LeftKey, Right, RightKey, Payload, LEFT, RIGHT, ROWS>,
49}
50
51crate::roster! {
52 pub enum RowOrder {
54 Authored = "authored",
56 Canonical = "canonical",
58 }
59}
60
61crate::roster! {
62 pub(crate) enum RelationQuestion {
64 Empty = "empty",
66 Repetition = "repetition",
68 Membership = "membership",
70 Completeness = "completeness",
72 Density = "density",
74 Absence = "absence",
76 SelfRelation = "self_relation",
78 Cycle = "cycle",
80 }
81}
82
83crate::roster! {
84 pub enum RepetitionPosture {
86 Allowed = "allowed",
88 Refusal = "refused",
90 }
91}
92
93crate::roster! {
94 pub enum EmptyPosture {
96 Allowed = "allowed",
98 Refusal = "refused",
100 }
101}
102
103crate::roster! {
104 pub enum MembershipPosture {
106 Open = "open",
108 Closed = "closed",
110 }
111}
112
113crate::roster! {
114 pub enum CompletenessPosture {
116 Partial = "partial",
118 Total = "total",
120 }
121}
122
123crate::roster! {
124 pub enum DensityPosture {
126 Sparse = "sparse",
128 Dense = "dense",
130 }
131}
132
133crate::roster! {
134 pub enum AbsencePosture {
136 Allowed = "allowed",
138 Refusal = "refused",
140 }
141}
142
143crate::roster! {
144 pub enum SelfRelationPosture {
146 Allowed = "allowed",
148 Refusal = "refused",
150 }
151}
152
153crate::roster! {
154 pub enum CyclePosture {
156 Allowed = "allowed",
158 Refusal = "refused",
160 }
161}
162
163crate::roster! {
164 pub enum OccupancyStanding {
166 Empty = "empty",
168 Populated = "populated",
170 }
171}
172
173crate::roster! {
174 pub enum RepetitionStanding {
176 Distinct = "distinct",
178 Repeated = "repeated",
180 }
181}
182
183crate::roster! {
184 pub enum CompletenessStanding {
186 Partial = "partial",
188 Complete = "complete",
190 }
191}
192
193crate::roster! {
194 pub enum DensityStanding {
196 Sparse = "sparse",
198 Dense = "dense",
200 }
201}
202
203crate::roster! {
204 pub enum RosterRelationStanding {
206 Same = "same",
208 Cross = "cross",
210 }
211}
212
213crate::roster! {
214 pub enum SelfRelationStanding {
216 Absent = "absent",
218 Present = "present",
220 }
221}
222
223crate::roster! {
224 pub enum CycleStanding {
226 Acyclic = "acyclic",
228 Cyclic = "cyclic",
230 }
231}
232
233#[must_use = "a structural requirement has not been settled against an observed answer"]
235#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
236pub struct StructuralRequirement<Answer> {
237 required: Answer,
238}
239
240#[must_use = "a structural mismatch names the required and observed answers"]
242#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
243pub struct StructuralMismatch<Answer> {
244 required: Answer,
245 observed: Answer,
246}
247
248#[must_use = "a reachability reading retains the complete reachable and unreachable position partition"]
250#[derive(Debug, Clone, PartialEq, Eq, Hash)]
251pub struct Reachability<const N: usize> {
252 reachable: NonEmpty<usize, N>,
253 unreachable: Bounded<usize, N>,
254}
255
256#[must_use = "a same-roster refusal means the question has no lawful subject"]
258#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
259pub struct SameRosterRequired;
260
261#[must_use = "a reachability refusal names whether its roster or root was unavailable"]
263#[derive(Debug, Clone, PartialEq, Eq, Hash)]
264pub enum ReachabilityError<Key> {
265 DifferentRosters(SameRosterRequired),
267 RootOutsideRoster {
269 root: Key,
271 },
272}
273
274#[derive(Debug, Clone, PartialEq, Eq, Hash)]
276struct ReferencedRosterRow<'rosters, Left, LeftKey, Right, RightKey, Payload> {
277 left_position: usize,
278 left_key: &'rosters LeftKey,
279 left_member: &'rosters Left,
280 right_position: usize,
281 right_key: &'rosters RightKey,
282 right_member: &'rosters Right,
283 payload: Payload,
284}
285
286#[derive(Clone, PartialEq, Eq, Hash)]
288pub struct RepeatedRelationPair<const N: usize> {
289 duplicate: DuplicateKey<RelationPair, N>,
290}
291
292#[must_use = "a repeated-pair refusal carries every duplicated relation coordinate"]
294#[derive(Debug, Clone, PartialEq, Eq, Hash)]
295pub struct RepeatedRelationPairs<const N: usize> {
296 pairs: NonEmpty<RepeatedRelationPair<N>, N>,
297}
298
299#[derive(Debug, Clone, PartialEq, Eq, Hash)]
301pub enum KeyedRosterRowsError<LeftKey, RightKey, const N: usize> {
302 Overflow(crate::bounded::Overflow),
304 ForeignLeft(NonEmpty<ForeignRosterReference<LeftKey>, N>),
306 ForeignRight(NonEmpty<ForeignRosterReference<RightKey>, N>),
308}
309
310struct ResolvedRosterMember<'roster, Member, Key> {
311 position: usize,
312 key: &'roster Key,
313 member: &'roster Member,
314}
315
316struct CanonicalRelationPosition {
317 authored: usize,
318 left: usize,
319 right: usize,
320}
321
322#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
323struct RelationPair {
324 left: usize,
325 right: usize,
326}
327
328enum RowResolutionError<Key, const N: usize> {
329 Overflow(crate::bounded::Overflow),
330 Foreign(NonEmpty<ForeignRosterReference<Key>, N>),
331}