tawasuyu/hifas
Motor en Rust para decidir, con demostración y no a ojo, cuándo un conjunto de réplicas local-first puede operar sin coordinación y cuándo no — y, cuando la respuesta es "sí, dentro de límites", proveer el mecanismo que lo garantiza.
M0/T0: scaffold del crate sheafsync
1//! `nerve` — el grafo de qué réplicas comparten datos con cuáles (§6.2).
2//!
3//! Vértices = réplicas, aristas = pares que comparten un dato.
4
5use petgraph::graph::UnGraph;
6
7/// Identificador de una réplica (vértice del nervio).
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9pub struct ReplicaId(pub usize);
10
11/// Qué coordenadas del estado se comparten en una arista.
12///
13/// M0: forma únicamente; el detalle de la proyección se fija en `sheaf` (T1/T2).
14#[derive(Debug, Clone, Default, PartialEq)]
15pub struct SharedLink {
16 /// Índices de las coordenadas compartidas en esta arista.
17 pub shared_coords: Vec<usize>,
18}
19
20/// El nervio: grafo no dirigido de réplicas y sus enlaces compartidos.
21#[derive(Debug, Default)]
22pub struct Nerve {
23 /// Grafo no dirigido: vértices = réplicas, aristas = pares que comparten datos.
24 pub graph: UnGraph<ReplicaId, SharedLink>,
25}
26
27impl Nerve {
28 /// Nervio vacío.
29 pub fn new() -> Self {
30 Self {
31 graph: UnGraph::new_undirected(),
32 }
33 }
34}