async-functional-utils
v1.0.7
Published
Utilities to do async things with fp
Downloads
8
Readme
Async Functional Utils
This utility library is designed to handle async code using functional paradigms like curry
and compose
. It is currently a work in progress and more utilities will be added.
Installation
NPM:
npm install async-functional-utils -S
Yarn:
yarn add async-functional-utils --save
API
handle(Promise) => [Error, Response]
Wraps a promise in a catch and returns an array of any caught errors as the first item in the array and the response as the second item.
Example:
import { handle } from "async-functional-utils";
const [error, response] = await handle(api.deleteEverything);
if (error) {
console.log(error);
}
if (response) {
console.log(response);
}
pipe(...Promises) => (any) : Promise
Compose multiple promises. Each will pass its results to the next.
Example:
import { pipe } from "async-functional-utils";
const result = await pipe(
(x) => Promise.resolve(x * 2), // 6
(x) => Promise.resolve(x + 2), // 8
(x) => Promise.resolve(`${x}?`) // '8?'
)(3);
handlePipe(...Promises) => (any) : Promise<[error, response]>
The same as pipe, but wrapped in a handle. Returns an array of [error, response]
Example:
import { handlePipe } from "async-functional-utils";
const [error, result] = await handlePipe(
(x) => Promise.resolve(x * 2), // 6
(x) => Promise.resolve(x + 2), // 8
(x) => Promise.resolve(`${x}?`) // '8?'
)(3);
compose(...Promises) => (any) : Promise
Compose multiple promises. Composes from right to left.
Example:
import { compose } from "async-functional-utils";
const result = await compose(
(x) => Promise.resolve(`${x}?`), // '8?'
(x) => Promise.resolve(x + 2), // 8
(x) => Promise.resolve(x * 2) // 6
)(3);
handleCompose(...Promises) => (any) : Promise<[error, response]>
The same as compose, but wrapped in a handle. Returns an array of [error, response]
Example:
import { handleCompose } from "async-functional-utils";
const [result, error] = await handleCompose(
(x) => Promise.resolve(`${x}?`), // '8?'
(x) => Promise.resolve(x + 2), // 8
(x) => Promise.resolve(x * 2) // 6
)(3);
map(Promise) => (Array) : Promise
Maps over an array async.
Example:
import { map } from "async-functional-utils";
const result = await map((x) => Promise.resolve(x * 3))([1, 2, 3]);
console.log(result); // [3, 6, 9]
reduce(Promise, ?initialValue) => (Array) : Promise
Reduces over an array async.
Example:
import { reduce } from "async-functional-utils";
const [six, seven] = await reduce((prev, x) => {
return Promise.resolve([...prev, x + 5]);
}, [])([1, 2]);
console.log(six); // 6
filter(Promise) => (Array) : Promise
Filters over an array async.
Example:
import { filter } from "async-functional-utils";
const result = await filter((x) => {
return Promise.resolve(x.includes("hi"));
})(["hi", "high", "hay"]);
console.log(result); // ["hi", "hey"]
batch(Promise, { batchSize?: number; }) => (Array) : Promise
Executes a given number of promises against an array at a time.
Example:
const result = await batch(
(x) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(x);
}, 10);
});
},
{
batchSize: 2,
}
)([1, 2, 3, 4, 5]);
console.log(result); // [1, 2, 3, 4, 5]
sleep(milliseconds: number) => (any) : Promise
Waits for a certain number of milliseconds and then proceeds.
Example:
console.log("Wait a second...");
const result = await sleep(1000)("Okay"); // Sleep for a second
console.log(result); // 'Okay'
timeout({ wait: number, errorMessage?: string }, () => Promise => any : Promise
If the timeout happens before a response comes back, we resolve an error.
Example:
const [error, result] = await handle(
timeout(
{
wait: 3000,
errorMessage: "Chronologically challenged",
},
longRunningPromise
)
);