use crate::bounded::{Bounded, DuplicateKey, ForeignRosterReference, KeyedRoster, NonEmpty};
#[path = "type_guard.rs"]
mod guard;
#[path = "questions.rs"]
mod questions;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct KeyedRosterRows<
'rosters,
Left,
LeftKey,
Right,
RightKey,
Payload,
const LEFT: usize,
const RIGHT: usize,
const ROWS: usize,
> {
left: &'rosters KeyedRoster<Left, LeftKey, LEFT>,
right: &'rosters KeyedRoster<Right, RightKey, RIGHT>,
rows: Bounded<ReferencedRosterRow<'rosters, Left, LeftKey, Right, RightKey, Payload>, ROWS>,
canonical_indices: Bounded<usize, ROWS>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct KeyedRosterRelation<
'rosters,
Left,
LeftKey,
Right,
RightKey,
Payload,
const LEFT: usize,
const RIGHT: usize,
const ROWS: usize,
> {
rows: KeyedRosterRows<'rosters, Left, LeftKey, Right, RightKey, Payload, LEFT, RIGHT, ROWS>,
}
crate::roster! {
pub enum RowOrder {
Authored = "authored",
Canonical = "canonical",
}
}
crate::roster! {
pub(crate) enum RelationQuestion {
Empty = "empty",
Repetition = "repetition",
Membership = "membership",
Completeness = "completeness",
Density = "density",
Absence = "absence",
SelfRelation = "self_relation",
Cycle = "cycle",
}
}
crate::roster! {
pub enum RepetitionPosture {
Allowed = "allowed",
Refusal = "refused",
}
}
crate::roster! {
pub enum EmptyPosture {
Allowed = "allowed",
Refusal = "refused",
}
}
crate::roster! {
pub enum MembershipPosture {
Open = "open",
Closed = "closed",
}
}
crate::roster! {
pub enum CompletenessPosture {
Partial = "partial",
Total = "total",
}
}
crate::roster! {
pub enum DensityPosture {
Sparse = "sparse",
Dense = "dense",
}
}
crate::roster! {
pub enum AbsencePosture {
Allowed = "allowed",
Refusal = "refused",
}
}
crate::roster! {
pub enum SelfRelationPosture {
Allowed = "allowed",
Refusal = "refused",
}
}
crate::roster! {
pub enum CyclePosture {
Allowed = "allowed",
Refusal = "refused",
}
}
crate::roster! {
pub enum OccupancyStanding {
Empty = "empty",
Populated = "populated",
}
}
crate::roster! {
pub enum RepetitionStanding {
Distinct = "distinct",
Repeated = "repeated",
}
}
crate::roster! {
pub enum CompletenessStanding {
Partial = "partial",
Complete = "complete",
}
}
crate::roster! {
pub enum DensityStanding {
Sparse = "sparse",
Dense = "dense",
}
}
crate::roster! {
pub enum RosterRelationStanding {
Same = "same",
Cross = "cross",
}
}
crate::roster! {
pub enum SelfRelationStanding {
Absent = "absent",
Present = "present",
}
}
crate::roster! {
pub enum CycleStanding {
Acyclic = "acyclic",
Cyclic = "cyclic",
}
}
#[must_use = "a structural requirement has not been settled against an observed answer"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct StructuralRequirement<Answer> {
required: Answer,
}
#[must_use = "a structural mismatch names the required and observed answers"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct StructuralMismatch<Answer> {
required: Answer,
observed: Answer,
}
#[must_use = "a reachability reading retains the complete reachable and unreachable position partition"]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Reachability<const N: usize> {
reachable: NonEmpty<usize, N>,
unreachable: Bounded<usize, N>,
}
#[must_use = "a same-roster refusal means the question has no lawful subject"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct SameRosterRequired;
#[must_use = "a reachability refusal names whether its roster or root was unavailable"]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum ReachabilityError<Key> {
DifferentRosters(SameRosterRequired),
RootOutsideRoster {
root: Key,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
struct ReferencedRosterRow<'rosters, Left, LeftKey, Right, RightKey, Payload> {
left_position: usize,
left_key: &'rosters LeftKey,
left_member: &'rosters Left,
right_position: usize,
right_key: &'rosters RightKey,
right_member: &'rosters Right,
payload: Payload,
}
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct RepeatedRelationPair<const N: usize> {
duplicate: DuplicateKey<RelationPair, N>,
}
#[must_use = "a repeated-pair refusal carries every duplicated relation coordinate"]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct RepeatedRelationPairs<const N: usize> {
pairs: NonEmpty<RepeatedRelationPair<N>, N>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum KeyedRosterRowsError<LeftKey, RightKey, const N: usize> {
Overflow(crate::bounded::Overflow),
ForeignLeft(NonEmpty<ForeignRosterReference<LeftKey>, N>),
ForeignRight(NonEmpty<ForeignRosterReference<RightKey>, N>),
}
struct ResolvedRosterMember<'roster, Member, Key> {
position: usize,
key: &'roster Key,
member: &'roster Member,
}
struct CanonicalRelationPosition {
authored: usize,
left: usize,
right: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
struct RelationPair {
left: usize,
right: usize,
}
enum RowResolutionError<Key, const N: usize> {
Overflow(crate::bounded::Overflow),
Foreign(NonEmpty<ForeignRosterReference<Key>, N>),
}