{"id":13550306,"url":"https://github.com/mkloubert/node-enumerable","last_synced_at":"2025-04-14T17:31:04.616Z","repository":{"id":21155865,"uuid":"91852633","full_name":"mkloubert/node-enumerable","owner":"mkloubert","description":"ES2017 ready LINQ features written in TypeScript.","archived":false,"fork":false,"pushed_at":"2022-04-08T22:58:31.000Z","size":705,"stargazers_count":14,"open_issues_count":6,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-11-01T05:42:34.225Z","etag":null,"topics":["arrays","async-await","ecmascript","ecmascript2015","ecmascript2017","es6-javascript","generators","iterator","javascript","linq","linq-methods","mit-license","nodejs-library","promises","typescript","typescript2"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mkloubert.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"custom":["https://paypal.me/MarcelKloubert"]}},"created_at":"2017-05-19T23:30:56.000Z","updated_at":"2024-03-30T13:12:19.000Z","dependencies_parsed_at":"2022-07-27T01:47:10.217Z","dependency_job_id":null,"html_url":"https://github.com/mkloubert/node-enumerable","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkloubert%2Fnode-enumerable","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkloubert%2Fnode-enumerable/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkloubert%2Fnode-enumerable/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkloubert%2Fnode-enumerable/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mkloubert","download_url":"https://codeload.github.com/mkloubert/node-enumerable/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223639403,"owners_count":17177816,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arrays","async-await","ecmascript","ecmascript2015","ecmascript2017","es6-javascript","generators","iterator","javascript","linq","linq-methods","mit-license","nodejs-library","promises","typescript","typescript2"],"created_at":"2024-08-01T12:01:31.394Z","updated_at":"2024-11-08T06:03:44.716Z","avatar_url":"https://github.com/mkloubert.png","language":"TypeScript","readme":"[![npm](https://img.shields.io/npm/v/node-enumerable.svg)](https://www.npmjs.com/package/node-enumerable)\n[![npm](https://img.shields.io/npm/dt/node-enumerable.svg?label=npm%20downloads)](https://www.npmjs.com/package/node-enumerable)\n\n# node-enumerable\n\n[ES2017](https://en.wikipedia.org/wiki/ECMAScript#8th_Edition_-_ECMAScript_2017) ready [LINQ](https://en.wikipedia.org/wiki/Language_Integrated_Query) library written in [TypeScript](https://www.typescriptlang.org/).\n\n[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026hosted_button_id=9BX9ZJCAJHQ8U) [![](https://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?fid=o62pkd\u0026url=https%3A%2F%2Fgithub.com%2Fmkloubert%2Fnode-enumerable)\n\n## Table of contents\n\n1. [Requirements](#requirements-)\n2. [Installation](#installation-)\n   * [NodeJS](#nodejs-)\n   * [Browser](#browser-)\n3. [Usage](#usage-)\n   * [Create a sequence](#create-a-sequence-)\n   * [Work with them](#work-with-them-)\n     * [Async operations](#async-operations-)\n4. [Playground / demos](#playground--demos-)\n5. [Examples](#examples-)\n   * [Filters](#filters-)\n   * [Sort elements](#sort-elements-)\n   * [Take / skip elements](#take--skip-elements-)\n   * [Get one element](#get-one-element-)\n   * [Accumulators](#accumulators-)\n   * [Minimum / maximum values](#minimum--maximum-values-)\n   * [Joins](#joins-)\n   * [Groupings](#groupings-)\n   * [Projection](#projection-)\n   * [Checks / conditions](#checks--conditions-)\n   * [Conversions](#conversions-)\n   * [Count](#count-)\n   * [Math](#math-)\n   * [More](#more-)\n     * [assert](#assert-)\n     * [chunk](#chunk-)\n     * [clone](#clone-)\n     * [concat / concatArray](#concat--concatarray-)\n     * [consume](#consume-)\n     * [defaultIfEmpty / defaultArrayIfEmpty](#defaultifempty--defaultarrayifempty-)\n     * [forAll](#forall-)\n     * [intersperse / intersperseArray](#intersperse--interspersearray-)\n     * [pipe](#pipe-)\n     * [popFrom / shiftFrom](#popfrom--shiftfrom-)\n     * [prepend / prependArray](#prepend--prependarray-)\n     * [pushTo](#pushto-)\n     * [random](#random-)\n     * [reset](#reset-)\n     * [trace](#trace-)\n6. [Documentation](#documentation-)\n7. [License](#license-)\n8. [Tests](#tests-)\n\n## Requirements [[\u0026uarr;](#table-of-contents)]\n\n* a [ES2019](https://en.wikipedia.org/wiki/ECMAScript#10th_Edition_%E2%80%93_ECMAScript_2019) compatible environment like [modern browsers](https://en.wikipedia.org/wiki/ECMAScript#Implementations) or [NodeJS](https://nodejs.org/en/)\n* [TypeScript](https://www.typescriptlang.org/) 4.1 or later (ONLY when using [defintion files](https://github.com/mkloubert/node-enumerable/blob/master/index.d.ts))\n\n## Installation [[\u0026uarr;](#table-of-contents)]\n\n### NodeJS [[\u0026uarr;](#installation-)]\n\nRun\n\n```bash\nnpm install node-enumerable --save\n```\n\ninside project folder to install the module.\n\nThe module requires at least [Node.js 12+](https://nodejs.org/uk/blog/release/v12.0.0/).\n\n### Browser [[\u0026uarr;](#installation-)]\n\nDownload the latest version from [here](https://github.com/mkloubert/node-enumerable/releases).\n\n```html\n\u003chtml\u003e\n  \u003chead\u003e\n    \u003c!-- node-enumerable --\u003e\n    \u003cscript type=\"text/javascript\" src=\"js/enumerable.js\"\u003e\u003c/script\u003e\n  \u003c/head\u003e\n\n  \u003cbody\u003e\n    \u003cscript type=\"text/javascript\"\u003e\n    \n        // test code\n\n        let seq = Enumerable.create(1, 2, 3);\n\n        for (let item of seq) {\n            alert(item);\n        }\n    \n    \u003c/script\u003e\n  \u003c/body\u003e\n\u003c/html\u003e\n```\n\n## Usage [[\u0026uarr;](#table-of-contents)]\n\n### Create a sequence [[\u0026uarr;](#usage-)]\n\n```javascript\nconst Enumerable = require('node-enumerable');\n\nfunction *testGenerator() {\n    yield 111;\n    yield 222;\n    yield 333;\n}\n\n// from a list of values / objects with variable length\nlet seq1 = Enumerable.create(1, 'MK', true, null, {});\n\n// from an array\nlet seq2 = Enumerable.from([11, 22, 33, 44]);\n// from a generator\nlet seq3 = Enumerable.from( testGenerator() );\n// from a string\n// \n// 'A', 'j', 'n', 'a', 't'\nlet seq4 = Enumerable.from('Ajnat');  // alt: Enumerable.fromString('Ajnat');\n\n// range of numbers: 2, 3, 4, 5, 6\nlet seq5 = Enumerable.range(2, 5);\n\n// 5979 'TM' strings\nlet seq6 = Enumerable.repeat('TM', 5979);\n\n// build, using factory function\n// \n// 'item_1', 'item_2', 'item_3'\nlet seq7 = Enumerable.build((cancel, index) =\u003e {\n    if (index \u003c 3) {\n        return 'item_' + (index + 1);\n    }\n    else {\n        cancel();  // we tell that we\n                   // want to cancel here\n    }\n});\n\n// build, using factory function\n// by building a flatten list\n// \n// 1, 10, 100, 2, 20, 200, 3, 30, 300\nlet seq8 = Enumerable.buildMany((cancel, index) =\u003e {\n    let n = index + 1;\n\n    return [ n, n * 10, n * 100 ];\n}, 3);  // create 3 elements\n        // \n        // the 'build()' function has\n        // a same argument\n\n// create empty sequence\nlet seq9 = Enumerable.empty();\n```\n\n### Work with them [[\u0026uarr;](#usage-)]\n\n```javascript\nlet seq = Enumerable.create(5979, 23979, null, '23979', 1781, 241279);\n\nlet newSeq = seq.where((x) =\u003e x !== null)  // remove all elements that are (null)\n                .skip(1)  // skip one element (5979)\n                .take(3)  // take next remaining 3 elements (23979, 23979, 1781)\n                .distinct()  // remove duplicates\n                .select((x) =\u003e \"\" + x)  // convert to strings\n                .order();  // order by element ascending\n\n// you also can use the\n// 'each' and 'forEach' methods\n// of the sequence to do the\n// following job\nfor (let item of newSeq) {\n    // [0] 1781\n    // [1] 23979\n    console.log(item);\n}\n```\n\nMost methods are chainable as in [.NET](https://en.wikipedia.org/wiki/.NET_Framework) context.\n\n#### Async operations [[\u0026uarr;](#work-with-them-)]\n\n```javascript\nconst FS = require('fs');\nconst Path = require('path');\n\nlet seq = Enumerable.create('file1.txt', 'file2.txt', 'file3.txt', 'file4.txt');\n\nseq.async((context) =\u003e {\n    if (context.isFirst) {\n        context.result = 0;  // initialize a counter\n                             // value for the result\n                             // s. 'counter' parameter\n                             // of then() method below\n    }\n\n    // [0] file1.txt\n    // [1] file2.txt\n    // [2] file3.txt\n    // [3] file4.txt\n    let fileName = context.item;\n\n    let fullPath = Path.join(__dirname, fileName);\n\n    if (context.index \u003c 2) {\n        FS.readFile(fullPath, (err, data) =\u003e {\n            if (err) {\n                context.reject(err);  // has to be called if action\n                                      // FAILED with the error object\n                                      // or value as argument\n            }\n            else {\n                ++context.result;  // update counter value\n                                   // for the result\n                                   // s. 'counter' of then()\n                                   // method below\n\n                context.resolve();  // has to be invoked if\n                                    // invocation was SUCCESSFUL\n            }\n        });\n    }\n    else {\n        context.cancel();  // cancel at 3rd element\n    }\n}).then((counter) =\u003e {\n    // OK\n\n    console.log('Number of loaded files: ' + counter);  // 2\n}).catch((err) =\u003e {\n    console.log('One action failed: ' + err);\n});\n```\n\nThe `context` argument of the `async()` method uses the [AsyncActionContext](https://mkloubert.github.io/node-enumerable/interfaces/_index_.enumerable.asyncactioncontext.html) interface.\n\n## Playground / demos [[\u0026uarr;](#table-of-contents)]\n\nYou can test all features in [your browser](https://mkloubert.github.io/demos/node-enumerable/).\n\n## Examples [[\u0026uarr;](#table-of-contents)]\n\n### Filters [[\u0026uarr;](#examples-)]\n\n```javascript\n// distinct()\n// 1, 2, 4, 3\nEnumerable.create(1, 2, 4, 2, 3)\n          .distinct();\n// distinctBy()\n// \"grape\", \"passionfruit\", \"banana\", \"raspberry\"\nEnumerable.create(\"grape\", \"passionfruit\", \"banana\", \"mango\", \n                  \"orange\", \"raspberry\", \"apple\", \"blueberry\")\n          .distinctBy(x =\u003e x.length);\n \n// except()\n// 2.0, 2.1, 2.3, 2.4, 2.5\nEnumerable.create(2.0, 2.1, 2.2, 2.3, 2.4, 2.5)\n          .except([2.2]); \n \n// intersect()\n// 26, 30\nEnumerable.create(44, 26, 92, 30, 71, 38)\n          .intersect([30, 59, 83, 47, 26, 4, 3]);\n       \n// ofType()\n// '5979', 'Tanja'\nEnumerable.create(1, '5979', 2, 'Tanja', 3)\n          .ofType('string');  // typeof x === 'string'\n          \n// union()\n// 5, 3, 9, 7, 8, 6, 4, 1, 0\nEnumerable.create(5, 3, 9, 7, 5, 9, 3, 7)\n          .union([8, 3, 6, 4, 4, 9, 1, 0]);\n          \n// where()\n// 1, 2, 3\nEnumerable.create(1, 2, 3, 4)\n          .where((x) =\u003e x \u003c 4);\n```\n\n### Sort elements [[\u0026uarr;](#examples-)]\n\n```javascript\n// orderBy(), thenBy()\n//\n// \"apple\", \"grape\", \"mango\", \"banana\",\n// \"orange\", \"blueberry\", \"raspberry\", \"passionfruit\"\nEnumerable.create(\"grape\", \"passionfruit\", \"banana\", \"mango\", \n                  \"orange\", \"raspberry\", \"apple\", \"blueberry\")\n          .orderBy((x) =\u003e x.length)  // complement: orderByDescending()\n          .thenBy((x) =\u003e x);  // complement: thenByDescending()\n                              // shorter: then()\n\n// reverse()\n// 4, 3, 2, 1\nEnumerable.create(1, 2, 3, 4)\n          .reverse();\n\n// rand()\n// e.g.: 2, 5, 7, 8, 0, 4, 6, 9, 3, 1\nEnumerable.range(0, 10)\n          .rand();  // alt: shuffle()\n```\n\n### Take / skip elements [[\u0026uarr;](#examples-)]\n\n```javascript\n// skip()\n// 3, 4\nEnumerable.create(0, 1, 2, 3, 4)\n          .skip(3);\n\n// skipLast()\n// 0, 1, 2, 3\nEnumerable.create(0, 1, 2, 3, 4)\n          .skipLast();\n\n// skipWhile()\n// 55, 666, 77\nEnumerable.create(22, 33, 44, 55, 666, 77)\n          .skipWhile((x) =\u003e x \u003c 50);\n          \n// take()\n// 0, 1, 2\nEnumerable.create(0, 1, 2, 3, 4)\n          .take(3);\n\n// takeWhile()\n// 22, 33, 44\nEnumerable.create(22, 33, 44, 55)\n          .takeWhile((x) =\u003e x \u003c 50);\n```\n\n### Get one element [[\u0026uarr;](#examples-)]\n\n```javascript\n// elementAt()\n// 33\nEnumerable.create(11, 22, 33, 44)\n          .elementAt(2);\n          \n// elementAtOrDefault()\n// 'TM'\nEnumerable.create(11, 22, 33, 44)\n          .elementAtOrDefault(4, 'TM');  // out of range\n          \n// first()\n// 11\nEnumerable.create(11, 22, 33, 44)\n          .first();\n          \n// firstOrDefault()\n// 'MK'\nEnumerable.create()\n          .firstOrDefault('MK');\n          \n// last()\n// 44\nEnumerable.create(11, 22, 33, 44)\n          .last();\n          \n// lastOrDefault()\n// 'PZ'\nEnumerable.create()\n          .lastOrDefault('PZ');\n\n// single()\n// EXCEPTION, because we have more than one element\nEnumerable.create(11, 22, 33, 44)\n          .single();\n          \n// singleOrDefault()\n// 11\nEnumerable.create(11)\n          .singleOrDefault('YS');\n```\n\nAll methods with NO `OrDefault` suffix will throw exceptions if no element was found.\n\nYou also can use a function as first argument for all of these methods that works as filter / condition:\n\n```javascript\n// first()\n// 22\nEnumerable.create(11, 22, 33, 44)\n          .first((x) =\u003e x \u003e= 20);\n```\n\n### Accumulators [[\u0026uarr;](#examples-)]\n\n```typescript\n// aggregate()\n// \" Marcel Joachim Kloubert\"\nEnumerable.create('Marcel', 'Joachim', 'Kloubert')\n          .aggregate((accumulator, item) =\u003e {\n                         return accumulator += ' ' + item;\n                     }, '');\n\n// average()\n// 2.5\nEnumerable.create(1, 2, 3, 4)\n          .average();\n\n// \"M., Tanja\"\nEnumerable.create('M.', 'Tanja')\n          .joinToString(', ');\n```\n\n### Minimum / maximum values [[\u0026uarr;](#examples-)]\n\n```typescript\n// max()\n// 3\nEnumerable.create(1, 3, 2)\n          .max(); \n          \n// min()\n// 1\nEnumerable.create(2, 3, 1, 2)\n          .min();\n```\n\n### Joins [[\u0026uarr;](#examples-)]\n\n```typescript\nclass Person {\n    constructor(name: string) {\n        this.name = name;\n    }\n\n    public name: string;\n}\n\nclass Pet {\n    constructor(name: string, owner: Person) {\n        this.name = name;\n        this.owner = owner;\n    }\n\n    public name: string;\n    public owner: Person;\n}\n\nlet persons = [\n    new Person(\"Tanja\"),\n    new Person(\"Marcel\"),\n    new Person(\"Yvonne\"),\n    new Person(\"Josefine\")\n];\n\nlet pets = [\n    new Pet(\"Gina\", persons[1]),\n    new Pet(\"Schnuffi\", persons[1]),\n    new Pet(\"Schnuffel\", persons[2]),\n    new Pet(\"WauWau\", persons[0]),\n    new Pet(\"Lulu\", persons[3]),\n    new Pet(\"Asta\", persons[1]),\n];\n\n// groupJoin()\n// \n// [0] 'Owner: Tanja; Pets: WauWau, Sparky'\n// [1] 'Owner: Marcel; Pets: Gina, Schnuffi, Asta'\n// [2] 'Owner: Yvonne; Pets: Schnuffel'\n// [3] 'Owner: Josefine; Pets: Lulu'\nEnumerable.from(persons)\n          .groupJoin(pets,\n                     (person) =\u003e person.name,\n                     (pet) =\u003e pet.owner.name,\n                     (person, petsOfPerson) =\u003e {\n                         let petList = petsOfPerson\n                             .select(pet =\u003e pet.name)\n                             .joinToString(', ');\n                     \n                         return 'Owner: ' + person.name + '; Pets: ' + petList;\n                     });\n\n// join()\n// \n// [0] 'Owner: Tanja; Pet: WauWau'\n// [1] 'Owner: Marcel; Pet: Gina'\n// [2] 'Owner: Marcel; Pet: Schnuffi'\n// [3] 'Owner: Marcel; Pet: Asta'\n// [4] 'Owner: Yvonne; Pet: Schnuffel'\n// [5] 'Owner: Josefine; Pet: Lulu'\nEnumerable.from(persons)\n          .join(pets,\n                (person) =\u003e person.name,\n                (pet) =\u003e pet.owner.name,\n                (person, pet) =\u003e {\n                    return 'Owner: ' + person.name + '; Pet: ' + pet.name;\n                });\n```\n\n### Groupings [[\u0026uarr;](#examples-)]\n\n```javascript\n// groupBy()\nEnumerable.create(\"grape\", \"passionfruit\", \"blueberry\",\n                  \"apple\", \"banana\")\n          .groupBy(fruit =\u003e fruit[0].toLowerCase())\n          .each((grouping) =\u003e {\n                    // grouping[0].key = 'g'\n                    // grouping[0][0] = 'grape'\n                    \n                    // grouping[1].key = 'p'\n                    // grouping[1][0] = 'passionfruit'\n                    \n                    // grouping[2].key = 'b'\n                    // grouping[2][0] = 'blueberry'\n                    // grouping[2][1] = 'banana'\n                    \n                    // grouping[3].key = 'a'\n                    // grouping[3][0] = 'apple'\n                });\n```\n\n### Projection [[\u0026uarr;](#examples-)]\n\n```javascript\n// flatten()\n// 1, (false), 3, 44, '555', 66.6, (true)\nEnumerable.from( [ [ 1, false, 3 ], 44, [ '555', 66.6, true ] ] )\n          .flatten();\n\n// select()\n// \"MARCEL\", \"KLOUBERT\"\nEnumerable.create(\"Marcel\", \"Kloubert\")\n          .select(x =\u003e x.toUpperCase());\n          \n// selectMany()\n// 1, 10, 100, 2, 20, 200, 3, 30, 300\nEnumerable.create(1, 2, 3)\n          .selectMany(x =\u003e [ x, x * 10, x * 100 ]);\n\n// zip()\n// \"Marcel Kloubert\", \"Bill Gates\", \"Albert Einstein\"\nEnumerable.create('Marcel', 'Bill', 'Albert')\n          .zip(['Kloubert', 'Gates', 'Einstein', 'Adenauer'],\n               (firstName, lastName) =\u003e {\n                   return `${firstName} ${lastName}`;\n               });\n```\n\n### Checks / conditions [[\u0026uarr;](#examples-)]\n\n```javascript\n// all()\n// (false)\nEnumerable.create(1, 2, '3', 4)\n          .all((x) =\u003e typeof x !== \"string\");\n\n// any()\n// (true)\nEnumerable.create(1, 2, '3', 4)\n          .any((x) =\u003e typeof x === \"string\");\n\n// contains()\n// (true)\nEnumerable.create(1, 2, '3')\n          .contains(3);\n\n// not()\n// 1, 2, 4\nEnumerable.create(1, 2, '3', 4)\n          .not((x) =\u003e typeof x === \"string\");\n \n// sequenceEqual()\n// (false)         \nEnumerable.create(1, 2, 3)\n          .sequenceEqual([1, 3, 2]);\n```\n\n### Conversions [[\u0026uarr;](#examples-)]\n\n```javascript\n// toArray()\nlet jsArray = Enumerable.create(1, 2, 3, 4)\n                        .toArray();\n  \n// toObject()\nlet obj = Enumerable.create(1, 2, 3, 4)\n                    .toObject((item, index) =\u003e \"item\" + index);  \n\n// toLookup()\n// \n// lookup['A'][0] = 'Albert'\n// lookup['B'][0] = 'Bill'\n// lookup['B'][1] = 'barney'\n// lookup['K'][0] = 'Konrad'\n// lookup['M'][0] = 'Marcel'\nlet lookup = Enumerable.create('Bill', 'Marcel', 'barney', 'Albert', 'Konrad')\n                       .toLookup(x =\u003e x[0].toUpperCase());\n```\n\n### Count [[\u0026uarr;](#examples-)]\n\n```javascript\n// 3\nEnumerable.create(0, 1, 2)\n          .count();  // a second call will return 0\n                     // if reset() method is not called\n          \n// 2\nEnumerable.create(0, 1, 2)\n          .count((x) =\u003e x \u003e 0);\n\n// 4\nEnumerable.create(11, 22, 33, 44)\n          .length();  // a second call will return\n                      // the same value, because we have an array\n                      // based sequence here\n                      //\n                      // a generator based sequence will behave as count()\n\n// (false)\nEnumerable.create(111, 222, 333)\n          .isEmpty();\n\n// all are (false)\nEnumerable.isNullOrEmpty(\n    Enumerable.create(1111, 2222, 3333)\n);\nEnumerable.isUndefinedNullOrEmpty(\n    Enumerable.create(11111, 22222, 33333)\n);\nEnumerable.isUndefinedNullOrEmpty(\n    Enumerable.create(0, true, false)\n);\n```\n\n### Math [[\u0026uarr;](#math-)]\n\n```javascript\n// abs()\n// 1, 22.57, 444, NaN, -333.85, NaN\nEnumerable.create(-1, 22.57, 444, true, -333.85, false)\n          .abs();\n\n// ceil()\n// -1, 23, 444, NaN, -333, NaN\nEnumerable.create(-1, 22.47, 444, null, -333.85, false)\n          .ceil();\n\n// cos()\n// 0.004, -0.99996, -0.01\nEnumerable.create(11, 22, 33)\n          .cos();  // complement: arcCos()\n\n// cosH()\n// 29937.07, 1792456423.07, 107321789892958.03\nEnumerable.create(11, 22, 33)\n          .cosH();  // complement: arcCosH()\n\n// exp()\n// 2.72, 7.39, 20.09\nEnumerable.create(1, 2, 3)\n          .exp();\n\n// floor()\n// -1, 23, 444, NaN, -334, NaN\nEnumerable.create(-1, 22.47, 444.0, undefined, -333.85, true)\n          .floor();\n\n// log()\n// 0, 1, 2, 3, 4\nEnumerable.create(1, 2, 4, 8, 16)\n          .log(2);\n\n// pow()\n// 1, 4, 9, 16\nEnumerable.create(1, 2, 3, 4)\n          .pow(2);\n\n// product()\n// 24\nEnumerable.create(1, 2, 3, 4)\n          .product();\n\n// root()\n// 1, 2, 3, 4\nEnumerable.create(1, 8, 27, 64)\n          .root(3);\n\n// round()\n// -1, 23, 444, NaN, -334, 2, NaN\nEnumerable.create(-1, 22.47, 444.0, undefined, -333.85, 1.5, true)\n          .round();\n\n// sin()\n// 0.84, 0.91, 0.14\nEnumerable.create(1, 2, 3)\n          .sin();  // complement: arcSin()\n\n// sinH()\n// 1.18, 3.63, 10.02\nEnumerable.create(1, 2, 3)\n          .sinH();  // complement: arcSinH()\n\n// sqrt()\n// 1, 2, 3, 4\nEnumerable.create(1, 4, 9, 16)\n          .sqrt();\n\n// sum()\n// 10\nEnumerable.create(1, 2, 3, 4)\n          .sum();\n\n// tan()\n// 1.72, -1.76, -0.01\nEnumerable.create(111, 222, 333)\n          .tan();  // complement: arcTan()\n\n// tanH()\n// 0, 0.46, -0.76\nEnumerable.create(0, 0.5, -1)\n          .tanH();  // complement: arcTanH()\n```\n\n### More [[\u0026uarr;](#examples-)]\n\n#### assert [[\u0026uarr;](#more-)]\n\n```javascript\nlet seq1 = Enumerable.range(0, 10);\nseq1.assert((x) =\u003e {\n    return x % 2 !== 1;\n});  // will throw an exception\n     // at second element (1)\n\nlet seq2 = Enumerable.range(0, 10);\nseq2.assertAll((x) =\u003e {\n    return x % 2 !== 1;\n});  // will throw an aggregated exception\n     // at the end\n     // for all odd values\n```\n\n#### chunk [[\u0026uarr;](#more-)]\n\n```javascript\nlet seq = Enumerable.range(0, 10);\nfor (let chunk of seq.chunk(3)) {\n    // [0] =\u003e [0, 1, 2]\n    // [1] =\u003e [3, 4, 5]\n    // [2] =\u003e [6, 7, 8]\n    // [3] =\u003e [9]\n}\n```\n\n#### clone [[\u0026uarr;](#more-)]\n\n```javascript\nlet father = Enumerable.create(0, 1, 2);\n\n// create 3 clones of 'father'\nfor (let child of father.clone(3)) {\n    //TODO\n}\n\n// alt: father.clone().take(3)\n```\n\n#### concat / concatArray [[\u0026uarr;](#more-)]\n\n```javascript\n// 0, 1, 2, 'PZ', 'TM', 'MK'\nEnumerable.create(0, 1, 2)\n          .concat(['PZ'], ['TM', 'MK']);  // alt: append()\n\n// 0, 111, 222, 'pz', 'tm', 'mk'\nEnumerable.create(0, 111, 222)\n          .concatArray([ [ 'pz', 'tm' ], [ 'mk' ] ]);  // alt: appendArray()\n```\n\n#### consume [[\u0026uarr;](#more-)]\n\n```javascript\nfunction createIteratorAndStorage(size) {\n    let storage = [];\n\n    return {\n        iterator: makeIterator(size, storage),\n        storage: storage,\n    };\n}\n\nfunction *makeIterator(size, storage) {\n    for (let i = 0; i \u003c size; i++) {\n        yield i;\n\n        storage.push(i);\n    }\n}\n\nconst OBJ = createIteratorAndStorage(100);\n\nconst SEQ = Enumerable.from(OBJ.iterator);\nSEQ.consume();  // enumerates the 'iterator' in OBJ\n                // and fills the 'storage' in OBJ\n```\n\n#### defaultIfEmpty / defaultArrayIfEmpty [[\u0026uarr;](#more-)]\n\n```javascript\n// 0, 1, 2\nEnumerable.create(0, 1, 2)\n          .defaultIfEmpty('PZ', 'TM', 'MK');\n          \n// 'PZ', 'TM', 'MK'\nEnumerable.empty()\n          .defaultIfEmpty('PZ', 'TM', 'MK');\n\n// 0, 11, 22\nEnumerable.create(0, 11, 22)\n          .defaultArrayIfEmpty(['pz', 'tm', 'mk']);\n// alt: defaultSequenceIfEmpty()\n\n// 'pz', 'tm', 'mk'\nEnumerable.empty()\n          .defaultArrayIfEmpty(['pz', 'tm', 'mk']);\n```\n\n#### forAll [[\u0026uarr;](#more-)]\n\n```javascript\nlet arr = [];\n\ntry {\n    // alt: eachAll()\n    Enumerable.range(0, 5).forAll(x =\u003e {\n        if (x % 2 === 0) {\n            throw 'Error in value ' + x;\n        }\n\n        arr.push(x);\n    });\n}\ncatch (e) {\n    // access the list of errors by\n    // 'e.errors'\n\n    // e.errors[0] = 'Error in value 0';\n    // e.errors[1] = 'Error in value 2';\n    // e.errors[2] = 'Error in value 3';\n}\n\n// arr[0] === 1\n// arr[1] === 3\n// arr[2] === 5\n```\n\n#### intersperse / intersperseArray [[\u0026uarr;](#more-)]\n\n```javascript\n// 0, '-', 1, '-', 2\nEnumerable.range(0, 3)\n          .intersperse('-');\n\n// -- or --\nEnumerable.range(0, 3)\n          .intersperseArray( ['-'] );\n```\n\n#### pipe [[\u0026uarr;](#more-)]\n\n```javascript\nlet arr1 = [];\nlet arr2 = [];\n\nlet seq = Enumerable.create(1, 2, 3).pipe((x) =\u003e {\n    arr1.push(x * 10);\n});\nfor (let item of seq) {\n    arr2.push(item);\n}\n\n// arr1 = [10, 20, 30]\n// arr2 = [1, 2, 3]\n```\n\n#### popFrom / shiftFrom [[\u0026uarr;](#more-)]\n\n```javascript\nlet arr1 = [ 11, 22, 33 ];\nfor (let item of Enumerable.popFrom(arr1)) {\n    // [0] 33\n    // [1] 22\n    // [2] 11\n}\n// arr1 is empty now\n\nlet arr2 = [ 111, 222, 333 ];\nfor (let item of Enumerable.shiftFrom(arr2)) {\n    // [0] 111\n    // [1] 222\n    // [2] 333\n}\n// arr2 is empty now\n```\n\n#### prepend / prependArray [[\u0026uarr;](#more-)]\n\n```javascript\n// 'PZ', 'TM', 'MK', 0, 1, 2\nEnumerable.create(0, 1, 2)\n          .prepend(['PZ'], ['TM', 'MK']);\n\n// 'pz', 'tm', 'mk', 0, 111, 222\nEnumerable.create(0, 111, 222)\n          .prependArray([ [ 'pz', 'tm' ], [ 'mk' ] ]);\n```\n\n#### pushTo [[\u0026uarr;](#more-)]\n\n```javascript\nlet arr = [];\nEnumerable.create(0, 1, 2)\n          .pushTo(arr);\n\n// arr: [0, 1, 2]\n```\n\n#### random [[\u0026uarr;](#more-)]\n\n```javascript\nfor (let value of Enumerable.random(10)) {\n    // 10 random numbers\n    // between 0 and 1\n}\n\nfor (let value of Enumerable.random(23979,\n                                    v =\u003e v * 5979)) {\n    // 23979 random numbers\n    // between 0 and 5979\n}\n```\n\n#### reset [[\u0026uarr;](#more-)]\n\n```javascript\nlet seq = Enumerable.create(0, 1, 2);\n\nseq.each(x =\u003e {\n             console.log(x);\n         });\n\nseq.reset()\n   .each(x =\u003e {\n             console.log(x * 2);\n         });\n```\n\n#### trace [[\u0026uarr;](#more-)]\n\n```javascript\n// write items via 'console.trace()'\nEnumerable.create(0, 1, 2)\n          .trace();\n\n// with formatter\nEnumerable.create(1.2, 2.3, 3.45)\n          .trace(x =\u003e 'Item: ' + x);\n```\n\n## Documentation [[\u0026uarr;](#table-of-contents)]\n\nThe API documentation can be found [here](https://mkloubert.github.io/node-enumerable/interfaces/_index_.enumerable.ienumerable.html).\n\n## License [[\u0026uarr;](#table-of-contents)]\n\n[MIT license](https://raw.githubusercontent.com/mkloubert/node-enumerable/master/LICENSE)\n\n## Tests [[\u0026uarr;](#table-of-contents)]\n\nGo to the module folder and run\n\n```bash\ntsc\nnpm test\n```\n\nto start unit tests from `test/` subfolder.\n","funding_links":["https://paypal.me/MarcelKloubert","https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026hosted_button_id=9BX9ZJCAJHQ8U"],"categories":["TypeScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmkloubert%2Fnode-enumerable","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmkloubert%2Fnode-enumerable","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmkloubert%2Fnode-enumerable/lists"}