# recul

> Sync State Management with cache through numeric hash

Latest version **3.0.6** (published 2020-12-26) · MIT license · 0 weekly downloads

## Install

```sh
npm install recul
pnpm add recul
yarn add recul
bun add recul
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 3.0.6 |
| Published | 2020-12-26 |
| First published | 2019-02-05 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 0 |
| Unpacked size | 132.3 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | Mykhailo Datsko |
| Maintainers | mikedatsko |

## Links

- npm: https://www.npmjs.com/package/recul
- Repository: https://github.com/mikedatsko/recul
- Homepage: https://github.com/mikedatsko/recul#readme
- Issues: https://github.com/mikedatsko/recul/issues
- npm.io page: https://npm.io/package/recul

## Recent versions

- 3.0.6 (latest) — 2020-12-26
- 3.0.5 — 2020-10-11
- 3.0.4 — 2020-10-10
- 3.0.3 — 2020-10-10
- 3.0.2 — 2020-10-09
- 3.0.1 — 2020-09-30
- 3.0.0 — 2020-09-29
- 2.0.4 — 2020-03-20
- 2.0.3 — 2019-12-28
- 2.0.2 — 2019-08-27
- 2.0.1 — 2019-07-13
- 2.0.0 — 2019-07-13
- 1.3.2 — 2019-07-09
- 1.3.1 — 2019-07-09
- 1.3.0 — 2019-06-27
- … 8 more at https://npm.io/package/recul/versions

## README

# Recul

### Sync State Management

[![npm version](http://img.shields.io/npm/v/recul.svg?style=flat)](https://npmjs.org/package/recul)

## Install

```
npm i -S recul
```

## Get started

### Simple usage

```
const recul = require('recul');

// Set value
recul.setValue('a', 1);

// Get value
console.log(recul.getValue('a'));

// Reset (clear) store
recul.reset();

// Subscribe to value changes
recul.on('a', value => {
  console.log('a', value);
});


// Alias for "on"
recul.subscribe('a', value => {
  console.log('a', value);
});

// Subscribe with listener
const listener = recul.on('a', value => {
  console.log('a', value);
});
recul.setValue('a', 1);

// Unsubscribe
recul.off(listener);
recul.setValue('a', 2);

// Alias for "off"
recul.unsubscribe(listener);

// Subscribe to many listeners
const listener1 = recul.on('a', value => console.log('a', value));
const listener2 = recul.on('a', value => console.log('a', value));
const listener3 = recul.on('a', value => console.log('a', value));
recul.setValue('a', 3);

// Unsubscribe many listeners
recul.off([listener1, listener2, listener3]);
recul.setValue('a', 4);
```

### Flux app store usage

#### Action types

`userActionTypes.js`

```
export const USER = {
  _NAME: 'USER',
  ACCOUNT: 'USER.ACCOUNT',
  IS_AUTHENTICATED: 'USER.IS_AUTHENTICATED'
};
```

#### Action

`userActions.js`

```
import { userReducer } from './userReducer';
import { USER } from './userActionTypes';

export const userActions = {
  setAccount: account => userReducer({
    type: USER.ACCOUNT,
    payload: {
      account
    }
  }),
  authenticate: () => userReducer({
    type: USER.IS_AUTHENTICATED,
    payload: {
      isAuthenticated: true
    }
  }),
  login: (email, password) => {
    httpService
      .post('http://api.your-domain.com/auth')
      .then(response => {
        userActions.setAccount(response.user);
        userActions.authenticate();
      })
      .catch(error => {
        userActions.setAccount();
        userActions.logout();
      });
  },
  logout: userReducer({
    type: USER.IS_AUTHENTICATED,
    payload: {
      isAuthenticated: false
    }
  })
};
```

#### Reducer

`userReducer.js`

```
import { recul } from 'recul';
import { USER } from './userActionTypes';

export const userInitialState = {
  [USER.ACCOUNT]: undefined,
  [USER.IS_AUTHENTICATED]: false
};

recul.setValue(USER._NAME, userInitialState);

export const userReducer = (action, state) => {
  switch(action.type) {
    case USER.ACCOUNT: {
      return {
        ...state,
        [USER.ACCOUNT]: action.payload.account
      };
    }
  }
};
```

#### Selector (with RxJS)

```
import { recul } from 'recul';
import { BehaviorSubject } from 'rxjs';
import { USER } from './userActionTypes';

export const userSelectors = {
  account: () => {
    const subject = new BehaviorSubject(recul.getValue(USER.ACCOUNT));
    recul.subscribe(USER.ACCOUNT, account => subject.next(account));
    return subject;
  },
  isAuthenticated: () => {
    const subject = new BehaviorSubject(recul.getValue(USER.IS_AUTHENTICATED));
    recul.subscribe(USER.IS_AUTHENTICATED, isAuthenticated => subject.next(isAuthenticated));
    return subject;
  }
};
```

## Test

```
npm test
```

---
_Source: https://npm.io/package/recul · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
