/* Page prose (es) */
"VersionAClassic" = "# Versión A (clásica): GCD + completion handlers + `DispatchGroup`\n\nCada obtención toma un **completion handler**, una clausura a la que llama de vuelta con un `Result` cuando la red (simulada) termina. Como las dos obtenciones son independientes, empujamos ambas a colas en segundo plano y usamos un **`DispatchGroup`** para saber cuándo *ambas* han llamado de vuelta. Luego saltamos al principal para combinar y reportar.";
"VersionAClassic-2" = "**Míralo en acción:** `Fetching menu and stock...` se imprime primero: ambas llamadas a `fetch` retornaron de inmediato. Las dos obtenciones se ejecutan en paralelo (0.6 s y 0.4 s), así que alrededor de 0.6 segundos después el grupo se vacía y obtienes, en el hilo principal:\n\n* callout(Salida):\n`Fetching menu and stock...`  \n`Sellable today: [\"Latte\", \"Espresso\"]`\n\nEl cold brew se filtra porque su inventario es `0`.\n\n* callout(Pruébalo): Cambia el inventario del cold brew en `fetchStock` de `0` a `2`. ¿Aparece ahora en la lista de vendibles?\n\nAhora cuenta lo que esto te costó:\n\n* Dos variables mutables `Result?` viviendo fuera de las clausuras, para sacar de contrabando cada respuesta de su completion handler.\n* Contabilidad manual de `enter()`/`leave()`: un resbalón y el grupo se cuelga o falla.\n* El resultado son dos `Result` **opcionales** en el punto de unión, así que necesitas un `guard` *y* un `do`-`try`-`catch` para pasar de \"dos `Result?`\" a \"dos valores reales o un error.\"\n* El salto al hilo principal es algo que *tú* te acordaste de hacer (`notify(queue: .main)`). Olvídalo y combinarías en un hilo en segundo plano y actualizarías la UI desde ahí, un error que el compilador nunca menciona.\n\nNada de esto está mal. Pero cada pieza es manual, y la lógica de verdad, \"filtrar el menú por el inventario,\" queda enterrada en ceremonia.\n\n* callout(Nota sobre carreras de datos): `menuResult` y `stockResult` se escriben desde hilos en segundo plano y se leen en `notify`. Esto resulta seguro porque el orden `leave()` → `notify` del grupo garantiza que las escrituras terminen antes de la lectura, pero *nada lo comprueba por ti*. Esta es exactamente la clase de riesgo que causan las carreras de datos en general, y exactamente lo que el modelo moderno elimina por construcción.\n\n[Anterior](@previous)  |  página 3 de 8  |  [Siguiente: Versión B: la forma moderna](@next)";
