UNPKG

async-ray

Version:

Allow perform every, filter, find, findIndex, forEach, map, reduce, reduceRight and some on array using Async callback

443 lines (354 loc) 10.3 kB
# Async-Ray [![License](https://img.shields.io/npm/l/async-ray.svg)](https://img.shields.io/npm/l/async-ray.svg) [![Version](https://img.shields.io/npm/v/async-ray.svg)](https://img.shields.io/npm/v/async-ray.svg) [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/rpgeeganage/async-ray.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/rpgeeganage/async-ray/context:javascript) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/967e339f9fdb4424a48ba37a0292f221)](https://app.codacy.com/app/rpgeeganage/async-ray?utm_source=github.com&utm_medium=referral&utm_content=rpgeeganage/async-ray&utm_campaign=Badge_Grade_Settings) [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/3e1503ed17af4dc5aadb1fbbc41191d3)](https://www.codacy.com/app/rpgeeganage/async-ray?utm_source=github.com&utm_medium=referral&utm_content=rpgeeganage/async-ray&utm_campaign=Badge_Coverage) [![Build Status](https://travis-ci.org/rpgeeganage/async-ray.svg?branch=master)](https://travis-ci.org/rpgeeganage/async-ray) [![Known Vulnerabilities](https://snyk.io/test/github/rpgeeganage/async-ray/badge.svg?targetFile=package.json)](https://snyk.io/test/github/rpgeeganage/async-ray?targetFile=package.json) [![Maintainability](https://api.codeclimate.com/v1/badges/4c9603df3595612def57/maintainability)](https://codeclimate.com/github/rpgeeganage/async-ray/maintainability) Purpose of this package is to provide `async/await` callbacks for `every`, `filter`, `find`, `findIndex`, `forEach`, `map`, `reduce`, `reduceRight` and `some` methods in **_Array_**. ### TypeScript Doc: [https://rpgeeganage.github.io/async-ray/doc/](https://rpgeeganage.github.io/async-ray/doc/) ### Content * [ ***Basic Usage*** ](#basic-usage) * [ ***Supported methods*** ](#supported-methods) * [ ***Using methods individually*** ](#using-methods-individually) * [ ***Chaining*** ](#chaining) ## Basic usage ```js const { AsyncRay } = require('async-ray'); ``` ## Supported methods * [ ***.aEvery*** ](#aevery) * [ ***.aFilter*** ](#afilter) * [ ***.aFind*** ](#afind) * [ ***.aFindIndex*** ](#afindindex) * [ ***.aFlatMap*** ](#aflatMap) * [ ***.aForEach*** ](#aforeach) * [ ***.aMap*** ](#amap) * [ ***.aReduce*** ](#areduce) * [ ***.aReduceRight*** ](#areduceright) * [ ***.aSome*** ](#asome) ### .aEvery ##### .aEvery(async callback(element[, index[, array]])) ```js async function dummy(element, needle) { return Promise.resolve(element > needle); } const inputArray = [10, 20, 30, 40]; // Call Every method const output = await AsyncRay(inputArray).aEvery( async (i, index, collection) => { // Dummy async function return await dummy(i, 5); } ); console.log(output); // Output is true ``` ### .aFilter ##### .aFilter(async callback(element[, index[, array]])) ```js async function dummy(element, needle) { return Promise.resolve(element > needle); } const inputArray = [1, 2, 3, 4]; // Call Filter method const filterArray = await AsyncRay(inputArray).aFilter( async (i, index, collection) => { // Dummy async function return await dummy(i, 2); } ); console.log(filterArray); // Output is [3, 4] ``` ### .aFind ##### .aFind(async callback(element[, index[, array]])) Find will return the found value or undefined ```js async function dummy(element, needle) { return Promise.resolve(element === needle); } const inputArray = [1, 2, 3, 4]; // Call Find method const outputElement = await AsyncRay(inputArray).aFind( async (i, index, collection) => { return await dummy(i, 2); } ); console.log('Output is ', outputElement); // Output is 2 ``` ### .aFindIndex ##### .aFindIndex(async callback(element[, index[, array]])) FindIndex will return the index of found value or -1 ```js async function dummy(element, needle) { return Promise.resolve(element === needle); } const inputArray = [1, 2, 3, 4]; // Call Find method const outputIndex = await AsyncRay(inputArray).aFindIndex( async (i, index, collection) => { return await dummy(i, 2); } ); console.log('Output is ', outputIndex); // Output is 1 ``` ### .aFlatMap ##### .aFlatMap(async callback(element[, index[, array]])) ```js async function dummy(element) { return Promise.resolve([element, element * 2]); } const inputArray = [1, 2, 3, 4]; // Call Map method const flatMappedArray = await AsyncRay(inputArray).aFlatMap( async (i, index, collection) => { // Dummy async function return await dummy(i); } ); console.log(flatMappedArray); // Output is [1, 2, 2, 4, 3, 6, 4, 8] ``` ### .aForEach ##### .aForEach(async callback(element[, index[, array]])) ```js async function dummy(element) { return Promise.resolve(element); } const inputArray = [1, 2, 3, 4]; const outputArray = []; // Call ForEach method await AsyncRay(inputArray).aForEach(async (i, index, collection) => { outputArray.push(await dummy(i)); }); console.log('Output is ', outputArray); // Output is [1, 2, 3, 4] ``` ### .aMap ##### .aMap(async callback(element[, index[, array]])) ```js async function dummy(element) { return Promise.resolve(element); } const inputArray = [1, 2, 3, 4]; // Call Map method const mappedArray = await AsyncRay(inputArray).aMap( async (i, index, collection) => { // Dummy async function return await dummy(i); } ); console.log(mappedArray); // Output is [1, 2, 3, 4] ``` ### .aReduce ##### .aReduce(async callback(accumulator, element[, index[, array]]), [initialValue]) ```js async function dummy(element) { return Promise.resolve(element); } const inputArray = [10, 20, 30, 40]; // Call Reduce method const output = await AsyncRay(inputArray).aReduce( async (acc, i, index, collection) => { return acc + (await dummy(i)); }, 1 ); console.log('Output is ', output); // Output is 101 ``` ### .aReduceRight ##### .aReduceRight(async callback(accumulator, element[, index[, array]]), [initialValue]) ```js async function dummy(element) { return Promise.resolve(element); } const inputArray = [10, 20, 30, 40]; // Call Reduce method const output = await AsyncRay(inputArray).aReduceRight( async (acc, i, index, collection) => { return acc + (await dummy(i)); }, 1 ); console.log('Output is ', output); // Output is 101 ``` ### .aSome ##### .aSome(async callback(element[, index[, array]])) ```js async function dummy(element, needle) { return Promise.resolve(element > needle); } const inputArray = [10, 20, 30, 40]; // Call Some method const output = await AsyncRay(inputArray).aSome( async (i, index, collection) => { // Dummy async function return await dummy(i, 30); } ); console.log(output); // Output is true ``` ## Using methods individually You can use each method without creating ```AsyncRay ``` object. ```js import { aEvery, aFilter, aFind, aFindIndex, aForEach, aMap, aReduce, aReduceRight, aSome } from 'async-ray'; // aEvery const everyResult = await aEvery( [1, 2, 3], async (e) => Promise.resolve(e > 0) ); // aFilter const filterResult = await aFilter( [1, 2, 3], async (e) => Promise.resolve(e > 1) ); // aFind const findResult = await aFind( [1, 2, 3], async (e) => Promise.resolve(e === 3) ); // aFindIndex const findIndexResult = await aFindIndex( [1, 2, 3], async (e) => Promise.resolve(e === 2) ); // aForEach const forEachResult: number[] = []; await aForEach( [1, 2, 3], async (e) => { const op = await Promise.resolve(e * 10); forEachResult.push(op); } ); // aMap const mapResult = await aMap( [1, 2, 3], async (e) => Promise.resolve(e * 10) ); // aReduce const reduceResult = await aReduce( [1, 2, 3], async (acc, e) => Promise.resolve(e + acc), 0 ); // aReduceRight const reduceRightResult = await aReduceRight( [1, 2, 3], async (acc, e) => Promise.resolve(e + acc), 0 ); // aSome const someResult = await aSome( [1, 2, 3], async (e) => Promise.resolve(e > 1) ); ``` ## Chaining ### Async-Ray methods can be chained using ```Chain``` functionality ### Basic usage ```js const { Chain } = require('async-ray'); ``` --- ***Chaining will return an instance of Async-Ray if returned type is an array.*** --- #### sample 1 - `aMap()` and `aFilter()` ##### ([sample code](https://github.com/rpgeeganage/async-ray/blob/master/examples/chain_sample_1.ts)) --- The `process()` method __***must be called explicitly***__ to process the chain because `aMap()` and `aFilter()` method returns an array. ```js const input = [1, 2, 3]; const op = await Chain(input) .aMap( async (e) => Promise.resolve(e * 10) ) .aFilter( async (e) => Promise.resolve(e > 10) ) .aMap( async (e) => Promise.resolve(e * 10) ) // Call the process() method to execute the chain .process(); console.log('Output is ', op); // Output is [ 200, 300 ] ``` #### sample 2 - `aMap()`, `aFilter()` and `aFind()` ##### ([sample code](https://github.com/rpgeeganage/async-ray/blob/master/examples/chain_sample_2.ts)) --- The `process()` method __***should not be called***__ because `aFind()` does not return an array. ```js const input = [1, 2, 3]; const op = await Chain(input) .aMap( async (e) => Promise.resolve(e * 10) ) .aFilter( async (e) => Promise.resolve(e > 10) ) .aMap( async (e) => Promise.resolve(e * 10) ) .aFind( async (e) => Promise.resolve(e === 300) ); // No need to call process() method console.log('Output is ', op); // Output is 300 ``` #### Between other [Array methods](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#) methods --- #### Sample 1 - Async-Ray `Chain` with `filter()` ```js const input = [1, 2, 3]; const op = ( await Chain(input) .aMap( async (e) => Promise.resolve(e * 10) ) .aFilter( async (e) => Promise.resolve(e > 10) ) .aMap( async (e) => Promise.resolve(e * 10) ) .process() ) .filter(e => e > 200) console.log('Output is ', op); // Output is [ 300 ] ``` --- #### Sample 2 - Async-Ray `Chain` with `find()` ```js const input = [1, 2, 3]; const op = ( await Chain(input) .aMap( async (e) => Promise.resolve(e * 10) ) .aFilter( async (e) => Promise.resolve(e > 10) ) .aMap( async (e) => Promise.resolve(e * 10) ) .process() ) .find(e => e === 200) console.log('Output is ', op); // Output is 200 ```