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
// src/graph/applier.rs
//
// Single-writer apply: TODAS las mutaciones de estructuras derivadas
// (adyacencia persistida, índice de propiedades `idx:prop:`, cadenas de
// versiones de aristas) pasan por un único embudo serializado.
//
// Motivación: cada operación lógica de escritura abarca varias llamadas a
// storage (read-modify-write). Sin serialización, escritores concurrentes
// directos pierden actualizaciones (ver tests/concurrent_writers_test.rs).
//
// Diseño actual: un write-gate (Mutex async) que serializa la fase de
// aplicación física. Es agnóstico al runtime — funciona aunque el caller
// use runtimes efímeros (p. ej. los bindings Python actuales crean un
// runtime por llamada). Cuando exista un runtime compartido en los bindings
// (roadmap: GIL/runtime) este embudo puede evolucionar a una task dedicada
// con canal mpsc para hacer group-commit y batching sin cambiar callers:
// `WriteOp` ya enumera todas las escrituras y `submit_write` es el único
// punto de entrada.
use crate;
/// Operación de escritura física. Único vocabulario que acepta el embudo:
/// cualquier mutación nueva de estructuras derivadas debe agregarse aquí.
pub