# `Expresso.Watch.Files`
[🔗](https://github.com/rellen/expresso/blob/main/lib/expresso/watch/files.ex#L1)

Finds a change to the files of a deck

`Expresso.Watch` takes a snapshot of the files two times each second, and
`changed?/2` compares it with the snapshot before it. `Expresso.DeckFile`
gives the list of the files.

A snapshot holds the size of each file and the time of its last change. The
file system gives that time to the second, so a file that changed in the
last two seconds also gets a digest of its bytes. `changed?/2` compares two
digests only when both snapshots have one:

  * Two changes in the same second give two different digests, so the second
    change is found.
  * An old file gets no digest, so a digest that goes away is not a change.

The section "The watch mode" of `docs/architecture.md` tells why the watch
mode reads the file system, and not the events of the operating system.

# `snapshot`

```elixir
@type snapshot() :: %{
  required(Path.t()) =&gt;
    {integer(), non_neg_integer(), binary() | nil} | :missing
}
```

The state of each file of a deck

# `changed?`

```elixir
@spec changed?(snapshot(), snapshot()) :: boolean()
```

Tell whether a file changed from one snapshot to the next

A file changed when:

  * its size or its time of change is different,
  * it appeared or it went away,
  * both snapshots have a digest, and the digests are different, or
  * its path is in only one of the two snapshots.

# `snapshot`

```elixir
@spec snapshot([Path.t()]) :: snapshot()
```

Record the state of each file in a list

A file that does not exist gets `:missing`. A new file or a removed file
thus also gives a different snapshot.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
