+ );
+};
+```
+
+## Reference
+```ts
+const [validity, revalidate] = useStateValidator(
+ state: any[] | { [p: string]: any } | { [p: number]: any },
+ validator: (state, setValidity?)=>[boolean|null, ...any[]],
+ initialValidity: any = [undefined]
+);
+```
+- **`state`**_`: any[] | { [p: string]: any } | { [p: number]: any }`_ can be both an array or object. It's _values_ will be used as a deps for inner `useEffect`.
+- **`validity`**_`: [boolean|null, ...any[]]`_ result of validity check. First element is strictly nullable boolean, but others can contain arbitrary data;
+- **`revalidate`**_`: ()=>void`_ runs validator once again
+- **`validator`**_`: (state, setValidity?)=>[boolean|null, ...any[]]`_ should return an array suitable for validity state described above;
+ - `states` - current states values as the've been passed to the hook;
+ - `setValidity` - if defined hook will not trigger validity change automatically. Useful for async validators;
+- `initialValidity` - validity value which set when validity is nt calculated yet;
diff --git a/docs/useRafState.md b/docs/useRafState.md
new file mode 100644
index 00000000..7740724b
--- /dev/null
+++ b/docs/useRafState.md
@@ -0,0 +1,33 @@
+# `useRafState`
+
+React state hook that only updates state in the callback of [`requestAnimationFrame`](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame).
+
+## Usage
+
+```jsx
+import {useRafState, useMount} from 'react-use';
+
+const Demo = () => {
+ const [state, setState] = useRafState({
+ width: 0,
+ height: 0,
+ });
+
+ useMount(() => {
+ const onResize = () => {
+ setState({
+ width: window.clientWidth,
+ height: window.height,
+ });
+ };
+
+ window.addEventListener('resize', onResize);
+
+ return () => {
+ window.removeEventListener('resize', onResize);
+ };
+ });
+
+ return