{"id":17444668,"url":"https://github.com/kleinfreund/reverse-iterable-set","last_synced_at":"2025-10-16T16:40:59.718Z","repository":{"id":32847520,"uuid":"144321678","full_name":"kleinfreund/reverse-iterable-set","owner":"kleinfreund","description":"A reverse-iterable set implementation based on the built-in Set object. ","archived":false,"fork":false,"pushed_at":"2024-10-20T18:58:20.000Z","size":707,"stargazers_count":3,"open_issues_count":2,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-26T00:05:39.473Z","etag":null,"topics":["iterable","iterator","reverse-iterable","set"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/reverse-iterable-set","language":"JavaScript","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/kleinfreund.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-08-10T18:49:26.000Z","updated_at":"2024-10-20T18:58:24.000Z","dependencies_parsed_at":"2024-10-25T18:42:27.450Z","dependency_job_id":"7c335434-e351-4cbc-b887-78ce4e826a32","html_url":"https://github.com/kleinfreund/reverse-iterable-set","commit_stats":{"total_commits":49,"total_committers":3,"mean_commits":"16.333333333333332","dds":"0.18367346938775508","last_synced_commit":"7b8832da2fc12fd89ce9f372c6dfbb48c20bb635"},"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kleinfreund%2Freverse-iterable-set","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kleinfreund%2Freverse-iterable-set/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kleinfreund%2Freverse-iterable-set/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kleinfreund%2Freverse-iterable-set/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kleinfreund","download_url":"https://codeload.github.com/kleinfreund/reverse-iterable-set/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253854134,"owners_count":21974229,"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":["iterable","iterator","reverse-iterable","set"],"created_at":"2024-10-17T17:53:09.434Z","updated_at":"2025-10-16T16:40:54.683Z","avatar_url":"https://github.com/kleinfreund.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# reverse-iterable-set\n\nThe `ReverseIterableSet` object is a reverse-iterable set implementation based on the built-in [Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) object.\n\nLinks:\n\n- [**npmjs.com**/package/reverse-iterable-set](https://www.npmjs.com/package/reverse-iterable-set)\n- [**github.com**/kleinfreund/reverse-iterable-set](https://github.com/kleinfreund/reverse-iterable-set)\n\nSee also:\n\n\n- `ReverseIterableMap`: [reverse-iterable-map](https://www.npmjs.com/package/reverse-iterable-map)\n- `ReverseIterableArray`: [reverse-iterable-array](https://www.npmjs.com/package/reverse-iterable-array)\n\n## Table of Contents\n\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Examples](#examples)\n- [Tests](#tests)\n- [Documentation](#documentation)\n\t- [Constructor](#constructor)\n\t- [`size`](#size)\n\t- [`[Symbol.toStringTag]`](#symboltostringtag)\n\t- [`add()`](#add)\n\t- [`addFirst()`](#addFirst)\n\t- [`clear()`](#clear)\n\t- [`delete()`](#delete)\n\t- [`entries()`](#entries)\n\t- [`forEach()`](#foreach)\n\t- [`forEachReverse()`](#foreachreverse)\n\t- [`has()`](#has)\n\t- [`iteratorFor()`](#iteratorfor)\n\t- [`reverseIterator()`](#reverseiterator)\n\t- [`values()`](#values)\n\t- [`[Symbol.iterator]()`](#symboliterator)\n\n## Installation\n\n```sh\nnpm install reverse-iterable-set\n```\n\n## Usage\n\n```js\nimport ReverseIterableSet from 'reverse-iterable-set';\n\nconst set = new ReverseIterableSet();\n```\n\n## Examples\n\nFor some live usage examples, clone the repository and run the following:\n\n```sh\nnpm install\nnpm start\n```\n\nThen, open [localhost:8080/examples](http://127.0.0.1:8080/examples) in a browser.\n\n## Tests\n\nIn order to run the tests, clone the repository and run the following:\n\n```sh\nnpm install\nnpm test\n```\n\n## Documentation\n\nA `ReverseIterableSet` object iterates its elements in insertion or reverse-insertion order — a [`for...of`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of) loop returns the values for each iteration.\n\n### Constructor\n\n#### Syntax\n\n```\nnew ReverseIterableSet([iterable])\n```\n\n**Parameters**:\n\n- `iterable`: An [iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#The_iterable_protocol) object.\n\n#### Usage\n\n```js\nconst set = new ReverseIterableSet([1, 2, 3]);\n\nfor (const value of set.reverseIterator()) {\n\tconsole.log(value);\n}\n\n[...set.reverseIterator()]\n```\n\n### `size`\n\nThe `size` accessor property returns the number of values in a `ReverseIterableSet` object.\n\n#### Syntax\n\n```\nset.size\n```\n\n#### Usage\n\n```js\nconst set = new ReverseIterableSet(['a', 'b', 'c']);\n\nset.size\n//\u003e 3\n```\n\n### `[Symbol.toStringTag]`\n\nThe `ReverseIterableSet[@@toStringTag]` property has an initial value of “ReverseIterableSet”.\n\n### `add()`\n\n#### Syntax\n\n```\nset.add(value);\n```\n\n**Parameters**:\n\n- **value**: Required. The value to add to the `ReverseIterableSet` object.\n\n**Return value**:\n\n- The `ReverseIterableSet` object.\n\n#### Usage\n\n```js\nconst set = new ReverseIterableSet();\n\nset.add('hey');\n//\u003e ReverseIterableSet [ \"hey\" ]\n\nset.add('beauty');\n//\u003e ReverseIterableSet [ \"hey\", \"beauty\" ]\n\nset.add('hey');\n//\u003e ReverseIterableSet [ \"hey\", \"beauty\" ]\n```\n\nThe `add()` method returns a reference to the set object. This makes the `add()` operation chainable.\n\n```js\nconst set = new ReverseIterableSet()\n\t.add('key … is spelled like tea')\n\t.add('hey … somehow ney');\n//\u003e ReverseIterableSet [ \"key … is spelled like tea\", \"hey … somehow ney\" ]\n```\n\n### `clear()`\n\n#### Syntax\n\n```\nset.clear();\n```\n\n**Return value**:\n\n[`undefined`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined).\n\n#### Usage\n\n```js\n// Clears the underlying map object (yes, this is correct)\n// Sets the first and last node references to null\nset.clear();\n//\u003e undefined\n```\n\n### `delete()`\n\n#### Syntax\n\n```\nset.delete(value);\n```\n\n**Parameters**:\n\n- **value**: Required. The value to remove from the `ReverseIterableSet` object.\n\n**Return value**:\n\n- **Boolean**: Returns `true` if the value existed in the `ReverseIterableSet` object and has been removed, or `false` if the value did not exist.\n\n#### Usage\n\n```js\nconst set = new ReverseIterableSet(['1', '2']);\n\nset.delete('1');\n//\u003e true\n\nset.delete('2');\n//\u003e true\n\nset.delete('2');\n//\u003e false\n```\n\n### `entries()`\n\nReturns an iterator containing the `[value, value]` pairs for each value in the `ReverseIterableSet` object in insertion order.\n\nAn iterator containing the same pairs in reverse-insertion order can be obtained with `entries().reverseIterator()`.\n\n#### Syntax\n\n```\nset.entries();\n```\n\n**Return value**:\n\nA new `ReverseIterableSet` iterator object.\n\n#### Usage\n\n```js\nconst set = new ReverseIterableSet([1, 2, 4]);\n\nconst iterator = set.entries();\n\niterator.next().value;\n//\u003e [1, 1]\n\niterator.next().value;\n//\u003e [2, 2]\n\niterator.next().value;\n//\u003e [4, 4]\n\niterator.next().value;\n//\u003e undefined\n```\n\n### `forEach()`\n\nThe `forEach()` method executes a provided function once for each value in the `ReverseIterableSet` object, in insertion order.\n\n#### Syntax\n\n```\nset.forEach(callback[, thisArg]);\n```\n\n**Parameters**:\n\n- **callback**: Function to execute for each element.\n- **thisArg**: Value to use as `this` when executing `callback`.\n\n**Return value**:\n\n[`undefined`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined).\n\n#### Usage\n\n```js\nconst set = new ReverseIterableSet(['a', 'b', 'c']);\n\nset.forEach(value =\u003e {\n\tconsole.log(value);\n});\n//\u003e a\n//\u003e b\n//\u003e c\n\nset.forEach(function (value1, value2, setReference) {\n\tconsole.log(value1, value2, setReference.size);\n});\n//\u003e a a 3\n//\u003e b b 3\n//\u003e c c 3\n```\n\n### `forEachReverse()`\n\nThe `forEachReverse()` method executes a provided function for each value in the `ReverseIterableSet` object, in reverse-insertion order.\n\n#### Syntax\n\n```\nset.forEachReverse(callback[, thisArg]);\n```\n\n**Parameters**:\n\n- **callback**: Function to execute for each element.\n- **thisArg**: Value to use as `this` when executing `callback`.\n\n**Return value**:\n\n[`undefined`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined).\n\n#### Usage\n\n```js\nconst set = new ReverseIterableSet(['a', 'b', 'c']);\n\nset.forEachReverse(value =\u003e {\n\tconsole.log(value);\n});\n//\u003e c\n//\u003e b\n//\u003e a\n\nset.forEachReverse(function (value1, value2, setReference) {\n\tconsole.log(value1, value2, setReference.size);\n});\n//\u003e c c 3\n//\u003e b b 3\n//\u003e a a 3\n```\n\n### `has()`\n\n#### Syntax\n\n```\nset.has(value);\n```\n\n**Parameters**:\n\n- **value**: Required. The value to test for presence in the `ReverseIterableSet` object.\n\n**Return value**:\n\n- **Boolean**: Returns `true` if the value exists in the `ReverseIterableSet` object; otherwise `false`.\n\n#### Usage\n\n```js\nconst set = new ReverseIterableSet(['hey', 'beauty']);\n\nset.has('hey');\n//\u003e true\n\nset.has('beauty');\n//\u003e true\n\nset.has('beast');\n//\u003e false\n```\n\n### `iteratorFor()`\n\nReturns an iterator containing the values in the `ReverseIterableSet` object in insertion order **starting with the value specified by the `value` parameter**.\n\nThis allows starting iteration at a specific value in the `ReverseIterableSet` object.\n\nAn iterator containing the same values in reverse-insertion order can be obtained with `iteratorFor().reverseIterator()`.\n\n#### Syntax\n\n```\nset.iteratorFor(value);\n```\n\n**Parameters**:\n\n- **value**: Required. The value to start iterating from.\n\n**Return value**:\n\nA new `ReverseIterableSet` iterator object.\n\n#### Usage\n\n```js\nconst set = new ReverseIterableSet([1, 2, 4]);\n\n// Iterator, starting at the element with key 1.\nconst iterator = set.iteratorFor(2);\n\niterator.next().value;\n//\u003e 2\n\niterator.next().value;\n//\u003e 4\n\niterator.next().value;\n//\u003e undefined\n\n// Reverse-iterator, starting at the element with key 1.\nconst reverseIterator = set.iteratorFor(2).reverseIterator();\n\nreverseIterator.next().value;\n//\u003e 2\n\nreverseIterator.next().value;\n//\u003e 1\n\nreverseIterator.next().value;\n//\u003e undefined\n```\n\n### `reverseIterator()`\n\nIn theory, following the semantics of `[Symbol.iterator]()`, this should be `[Symbol.reverseIterator]()`. However, as a developer, I cannot define a well-known symbol myself and make use of it. For the time being, the `reverseIterator()` function serves the same purpose.\n\n#### Syntax\n\n```\nset.reverseIterator();\n```\n\n**Return value**:\n\nThe set **reverse-iterator** function, which is the `values().reverseIterator()` function by default.\n\n#### Usage\n\n```js\nconst set = new ReverseIterableSet([1, 2, 4]);\n\nconst iterator = set.reverseIterator();\n\niterator.next().value;\n//\u003e 4\n\niterator.next().value;\n//\u003e 2\n\niterator.next().value;\n//\u003e 1\n\niterator.next().value;\n//\u003e undefined\n```\n\n### `values()`\n\nReturns an iterator containing the values in the `ReverseIterableSet` object in insertion order.\n\nAn iterator containing the same values in reverse-insertion order can be obtained with `values().reverseIterator()`.\n\n#### Syntax\n\n```\nset.values();\n```\n\n**Return value**:\n\nA new `ReverseIterableSet` iterator object.\n\n#### Usage\n\n```js\nconst set = new ReverseIterableSet([1, 2, 4]);\n\nconst iterator = set.values();\n\niterator.next().value;\n//\u003e 1\n\niterator.next().value;\n//\u003e 2\n\niterator.next().value;\n//\u003e 4\n\niterator.next().value;\n//\u003e undefined\n```\n\n### `[Symbol.iterator]()`\n\nReturns the set iterator function. By default, this is the `values()` function.\n\n#### Syntax\n\n```\nset[Symbol.iterator]();\n```\n\n**Return value**:\n\nThe set **iterator** function, which is the `values()` function by default.\n\n#### Usage\n\n```js\nconst set = new ReverseIterableSet([1, 2, 4]);\n\nconst iterator = set[Symbol.iterator]();\n\niterator.next().value;\n//\u003e 1\n\niterator.next().value;\n//\u003e 2\n\niterator.next().value;\n//\u003e 4\n\niterator.next().value;\n//\u003e undefined\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkleinfreund%2Freverse-iterable-set","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkleinfreund%2Freverse-iterable-set","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkleinfreund%2Freverse-iterable-set/lists"}