# Atalhos do estado: INC, TOGGLE, NUL, UPDATE, UNWATCH, WAIT, BLOCKED e CACHEPATH

> Funções pequenas que alteram ou vigiam um valor do estado pelo seu caminho, esperam até existir um valor, executam algo só uma vez por período e guardam um valor do estado na cache.

Framework: jcomponent20
Product: jComponent 20 (jcomponent@20)
Language: pt
Content-SHA256: 793220efa9573c3bd03461b4ab621a15dd8dcdd5bd42829318515d238e766fb5
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: jcomponent20@3fedd009a277f50fddc608b97afbec553b67c51b
Review: not-recorded

Estas funções trabalham com o estado do jComponent por **caminho** (`'user.visits'`), como `SET()` e `GET()`, e todas elas notificam os componentes e os observadores do caminho.

- `INC(path, [value])` soma `value` (por omissão `1`) a um número; quando o valor está vazio começa em `0` e quando é um texto é lido primeiro como número.
- `TOGGLE(path)` altera um booleano (um valor vazio passa a `true`). `NUL(path)` e o seu alias `NULL(path)` põem o valor a `null`.
- `UPDATE(path)` (alias `UPD`) notifica todos os que usam o caminho **sem alterar o valor**: use-o depois de modificar um objeto ou um array no próprio lugar.
- `UNWATCH(path, [fn])` remove os observadores do caminho criados com `WATCH()`; com `fn`, apenas esse.
- `WAIT(fn or path, callback)` executa `callback` assim que a função devolve algo verdadeiro, ou o caminho tem um valor. Verifica logo e depois **a cada 500 ms**.
- `BLOCKED(key, timeout, [callback])` devolve `false` à primeira vez e `true` durante os `timeout` ms seguintes (também serve `'5 seconds'`): é uma proteção contra um duplo clique ou um pedido repetido. O `callback` só corre quando não está bloqueado.
- `CACHEPATH(path, expire, [default])` guarda um valor do estado na cache (`CACHE()`): põe o caminho no valor em cache quando existe (ou em `default`, que pode ser uma função) e guarda cada alteração sob a chave `path_<path>`.
- Um caminho é um caminho no estado da página, por isso um nome como `name` ou `location` é uma propriedade de `window`: use nomes seus (`person`, `prefs.mode`).
- `setTimeout2(id, fn, ms, [limit], [param])` é um `setTimeout()` com debounce: chamá-lo de novo com o mesmo `id` reinicia o temporizador, pelo que `fn` corre uma vez, `ms` depois da última chamada. Com `limit` o temporizador é reiniciado no máximo esse número de vezes e as chamadas seguintes são ignoradas até `fn` ter corrido, de modo que uma sequência de chamadas não o pode adiar para sempre. `clearTimeout2(id)` cancela-o e devolve `true` quando havia um.
- `CLONE(value)` faz uma cópia profunda (as datas continuam datas), `COPY(from, to)` copia em profundidade as propriedades de um objeto para outro e devolve `to`. `NOOP` é uma função que não faz nada e `WARN(...)` escreve em `console.warn`.

```html public/index.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>jComponent</title>
	<link rel="stylesheet" href="//cdn.componentator.com/spa.min@20.css" />
	<script src="//cdn.componentator.com/spa.min@20.js"></script>
</head>
<body>
	<p class="out"></p>
	<script>

		window.sample = { watched: 0 };

	</script>
</body>
</html>
```
