use-relax
TypeScript icon, indicating that this package has built-in type declarations

2.0.0 • Public • Published

use-relax

pipeline status

Relax your async methods calls !

use-relax is written in Typescript and contains only a single function useRelax that allows memorizing an async method call. Once "relaxed", your async method will only be called once at a time with the same parameters.

Installation

use-relax can be installed through yarn and npm.

To install from npm, run:

npm install use-relax

To install from yarn, run:

yarn add use-relax

Usage

useRelax takes as a first argument the async method to relax. The second argument is the configuration that allows setting a custom predicate for parameters equality and determine if the value returned should be memorized or not.

Basic usage

With no configuration given, the equality of parameters is based on strict equality and the value is not memorized.

import { useRelax } from 'use-relax';
 
const myAsyncFunction = async (value1: string, value2: number) =>
  new Promise<string>((yeah) => {
    setTimeout(() => {
      console.log(`Called with "${value1}" and "${value2}"`);
      yeah(value1 + value2.toString());
    }, 1000);
  });
 
const [myRelaxedFunction] = useRelax(myAsyncFunction);
 
await Promise.all([
  myRelaxedFunction('relax', 42), 
  myRelaxedFunction('relax', 42), 
 
  myRelaxedFunction('stay cool', 42)
]);
// Logs:
// Called with "relax" and "42"
// Called with "stay cool" and "42"
 
await myRelaxedFunction('relax', 42);
// Logs:
// Called with "relax" and "42"

Configuration

The configuration is composed of two optional properties: parametersPredicate and memorizeValue.

parametersPredicate is a predicate function used to check if two list of arguments of the async function are equal. By default, it uses strict equality between arguments.

const myCustomPredicate = <U extends any[]>(args1: U, args2: U) =>
  args1.every((arg, index) => arg === args2[index]);
 
const [myRelaxedFunction] = useRelax(myAsyncFunction, { 
  parametersPredicate: myCustomPredicate,
});
// "myCustomPredicate" will be used to determine if two list of parameters are equal

memorizeValue is a boolean. If set to true, it will memorize the value returned by the async function. Default value is false.

const myAsyncFunction = async (value1: string, value2: number) =>
  new Promise<string>((yeah) => {
    setTimeout(() => {
      console.log(`Called with "${value1}" and "${value2}"`);
      yeah(value1 + value2.toString());
    }, 1000);
  });
 
const [myRelaxedFunction] = useRelax(myAsyncFunction, {
  memorizeValue: true,
});
 
await Promise.all([
  myRelaxedFunction('relax', 42), 
  myRelaxedFunction('relax', 42), 
 
  myRelaxedFunction('stay cool', 42)
]);
// Logs:
// Called with "relax" and "42"
// Called with "stay cool" and "42"
 
await myRelaxedFunction('relax', 42);
// Logs nothing !

Unmemorize

useRelax also returns a method to unmemorize the promise and the value.

const myAsyncFunction = async (value1: string, value2: number) =>
  new Promise<string>((yeah) => {
    setTimeout(() => {
      console.log(`Called with "${value1}" and "${value2}"`);
      yeah(value1 + value2.toString());
    }, 1000);
  });
 
const [myRelaxedFunction, resetRelax] = useRelax(myAsyncFunction, {
  memorizeValue: true,
});
 
const promises = [
  myRelaxedFunction('relax', 42), 
  myRelaxedFunction('relax', 42), 
 
  myRelaxedFunction('stay cool', 42)
];
 
resetRelax('relax', 42);
 
promises.push(
  myRelaxedFunction('relax', 42)
);
 
await Promise.all(promises);
// Logs:
// Called with "relax" and "42"
// Called with "relax" and "42"
// Called with "stay cool" and "42"

Development

Prerequisites

The project has been developed with NodeJS v12.18.0 and yarn v1.22.4. To install the dependencies, run:

yarn install

Launch tests

To run the tests, run:

yarn test

To run the linter, run:

yarn lint

Build project

To build the project, run:

yarn build

The build will be available in the dist/ directory.

Versions

Current Tags

  • Version
    Downloads (Last 7 Days)
    • Tag
  • 2.0.0
    3
    • latest

Version History

Package Sidebar

Install

npm i use-relax

Weekly Downloads

9

Version

2.0.0

License

MIT

Unpacked Size

16.5 kB

Total Files

20

Last publish

Collaborators

  • chabert