---
name: file_poll_diff
kind: function
lang: cpp
domain: core
version: "1.0.0"
purity: pure
signature: "fn_ui::FileDiff fn_ui::file_poll_diff(const std::vector<fn_ui::FileEntry>& before, const std::vector<fn_ui::FileEntry>& after)"
description: "Diff puro entre dos snapshots de filesystem (path/size/mtime). Devuelve vectores added/modified/removed. Sin I/O. Pareja del file_watcher para fallback portable basado en polling."
tags: [filesystem, diff, poll, snapshot, pure]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
tested: true
tests: ["file_poll_diff detects added/modified/removed", "file_poll_diff: empty inputs", "file_poll_diff: identical snapshots"]
test_file_path: "cpp/tests/test_file_poll_diff.cpp"
file_path: "cpp/functions/core/file_poll_diff.cpp"
params:
  - name: before
    desc: "Snapshot anterior. Vector de FileEntry {path, size, mtime}, paths unicos"
  - name: after
    desc: "Snapshot actual. Mismo formato. Paths unicos"
output: "FileDiff con tres vectores de paths: added (en after y no en before), modified (path comun pero size o mtime distinto), removed (en before y no en after)."
---

# file_poll_diff

Logica pura para calcular cambios de filesystem entre dos snapshots. Sin
I/O, sin estado: el caller hace `stat()`/`opendir()` por su lado, construye
los `FileEntry`, y esta funcion los compara.

## API

```cpp
namespace fn_ui {

struct FileEntry {
    std::string path;
    uint64_t    size  = 0;
    int64_t     mtime = 0;  // unix seconds
};

struct FileDiff {
    std::vector<std::string> added;
    std::vector<std::string> modified;
    std::vector<std::string> removed;
};

FileDiff file_poll_diff(const std::vector<FileEntry>& before,
                        const std::vector<FileEntry>& after);

}
```

## Reglas

- Comparacion por `path` exacto.
- "Modified": al menos uno de `size` o `mtime` cambia.
- Asume paths unicos por snapshot (la funcion no deduplica).
- Complejidad: O(N+M) con un `unordered_map<string, const FileEntry*>` para
  indexar `before`.

## Cuando usar

- En plataformas donde `file_watcher` no tiene backend nativo (stub) y se
  necesita un fallback basado en polling.
- Para consolidar bursts de eventos: tomar dos snapshots en el tiempo y
  reportar solo el cambio neto (sin los intermedios).
- Tests del watcher: simular cambios de FS sin tocar disco.

## Por que pura

No abre archivos, no llama `stat`, no usa el reloj. Misma entrada produce la
misma salida — testeable sin fixtures de FS.
