{"id":15379590,"url":"https://github.com/blond/ho-iter","last_synced_at":"2025-04-15T17:42:04.669Z","repository":{"id":57264718,"uuid":"60373014","full_name":"blond/ho-iter","owner":"blond","description":":paw_prints: Higher-Order Iterator","archived":false,"fork":false,"pushed_at":"2020-06-01T01:14:16.000Z","size":148,"stargazers_count":7,"open_issues_count":10,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-28T23:11:14.471Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","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/blond.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-06-03T19:36:03.000Z","updated_at":"2020-08-09T10:21:52.000Z","dependencies_parsed_at":"2022-08-25T02:52:16.384Z","dependency_job_id":null,"html_url":"https://github.com/blond/ho-iter","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blond%2Fho-iter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blond%2Fho-iter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blond%2Fho-iter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blond%2Fho-iter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/blond","download_url":"https://codeload.github.com/blond/ho-iter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249121464,"owners_count":21216128,"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":[],"created_at":"2024-10-01T14:19:25.493Z","updated_at":"2025-04-15T17:42:04.652Z","avatar_url":"https://github.com/blond.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"Higher-Order Iterator\n=====================\n\n[![NPM Status][npm-img]][npm]\n[![Travis Status][test-img]][travis]\n[![Coverage Status][coverage-img]][coveralls]\n[![Dependency Status][dependency-img]][david]\n\n[npm]:            https://www.npmjs.org/package/ho-iter\n[npm-img]:        https://img.shields.io/npm/v/ho-iter.svg\n\n[travis]:         https://travis-ci.org/blond/ho-iter\n[test-img]:       https://travis-ci.org/blond/ho-iter.svg?branch=master\n\n[coveralls]:      https://coveralls.io/r/blond/ho-iter\n[coverage-img]:   https://img.shields.io/coveralls/blond/ho-iter.svg\n\n[david]:          https://david-dm.org/blond/ho-iter\n[dependency-img]: http://img.shields.io/david/blond/ho-iter.svg\n\nThe iterator which takes iterators as arguments and returns an iterator.\n\n\u003e [Iterators and Generators Guide](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators)\n\nInstall\n-------\n\n```\n$ npm install --save ho-iter\n```\n\nUsage\n-----\n\n```js\nconst hoi = require('ho-iter');\n\nconst entries1 = hoi({ foo: 'bar' });\nconst entries2 = hoi({ baz: 42 });\n\nconst keys = [];\nconst values = [];\n\nfor (let [key, value] of hoi.series(entries1, entries2)) {\n    keys.push(key);\n    values.push(value);\n}\n\nconsole.log(`keys: ${keys}`);\nconsole.log(`values: ${values}`);\n\n// ➜ keys: [foo, baz]\n// ➜ values: [bar, 42]\n```\n\nAPI\n---\n\nCreate iterator:\n\n* [hoi(iterable)](#hoiiterable)\n* [hoi(iterator)](#hoiiterator)\n* [hoi(object)](#hoiobject)\n* [hoi(number|boolean|symbol|regexp|function)](#hoinumberbooleansymbolregexpfunction)\n\nHelpers:\n\n* [value(value)](#valuevalue)\n* [isIterable(iterable)](#isiterableiterable)\n* [isIterator(iterator)](#isiteratoriterator)\n* [series(...iterables)](#seriesiterators)\n* [evenly(...iterables)](#evenlyiterators)\n* [reverse(iterable)](#reverseiterable)\n\n### hoi(iterable)\n\nCreates iterator for iterable object.\n\nUses [Iterable protocol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols) to create iterator.\n\nIterable data structures:\n\n* [Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)\n* [TypedArray](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray)\n* [Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set), [WeakSet](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet)\n* [Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map), [WeakMap](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)\n* [String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)\n* [arguments](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments)\n\n**Example 1.** Create iterator with array items.\n\n```js\nconst hoi = require('ho-iter');\n\nconst iter = hoi([1, 2, 3, 4]);\n\nfor (let item of iter) {\n    console.log(item);\n}\n\n// ➜ 1\n// ➜ 2\n// ➜ 3\n// ➜ 4\n```\n\n**Example 2.** Create iterator with set values.\n\n```js\nconst hoi = require('ho-iter');\n\nconst set = new Set([1, 2, 3, 4]);\nconst iter = hoi(set);\n\nfor (let item of iter) {\n    console.log(item);\n}\n\n// ➜ 1\n// ➜ 2\n// ➜ 3\n// ➜ 4\n```\n\n**Example 3.** Create iterator with map entries.\n\n```js\nconst hoi = require('ho-iter');\n\nconst map = new Map();\n\nmap.set('key1', 'val1');\nmap.set('key2', 'val2');\n\nconst iter = hoi(map);\n\nfor (let [key, val] of iter) {\n    console.log(`key: ${key}, val: ${val}`);\n}\n\n// ➜ key: key1, val: val1\n// ➜ key: key2, val: val2\n```\n\n**Example 3.** Create iterator with string characters.\n\n```js\nconst hoi = require('ho-iter');\n\nconst iter = hoi('Iterate me!');\n\nfor (let char of iter) {\n    console.log(char);\n}\n\n// ➜ I\n// ➜ t\n// ➜ e\n// ➜ r\n// ➜ a\n// ➜ t\n// ➜ e\n// ➜\n// ➜ m\n// ➜ e\n// ➜ !\n```\n\n**Important:** If you want to create iterator with integral string use `hoi.value(string)` helper.\n\n```js\nconst hoi = require('ho-iter');\n\nconst iter = hoi.value(\"Don’t touch me!\");\n\nfor (let item of iter) {\n    console.log(item);\n}\n\n// ➜ Don’t touch me!\n```\n\n**Example 4.** Creates iterator with arguments.\n\n```js\nconst hoi = require('ho-iter');\n\nconst iter = hoi.value(\"Don't touch me!\");\n\nfunction foo(arg1, arg2) {\n    const iter = hoi(arguments);\n\n    for (let arg of iter) {\n        console.log(arg);\n    }\n}\n\nfoo('bar', 'baz');\n\n// ➜ bar\n// ➜ baz\n```\n\n**Example 5.** Create empty iterator.\n\nIf value is not specified, returns empty iterator.\n\nThe empty iterator just returns `done` for each call.\n\n```js\nconst hoi = require('ho-iter');\n\nconst iter = hoi();\n\niter.next();\n\n// ➜ { done: true, value: null }\n```\n\n### hoi(iterator)\n\nProvides specified iterator or creates iterator by [Iterable protocol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols).\n\n**Important:** If iterator does not support [Iterable protocol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols) then `hoi(iterator)` does not clone specified iterator.\n\n```js\nconst hoi = require('ho-iter');\n\nfunction makeIterator(array) {\n    let nextIndex = 0;\n\n    return {\n        next() {\n            return nextIndex \u003c array.length ?\n                { value: array[nextIndex++], done: false } :\n                { done: true };\n        }\n    }\n}\n\nconst iter = makeIterator([1, 2, 3]);\n\niter.next(); // { value: 1, done: false }\niter.next(); // { value: 1, done: false }\niter.next(); // { value: 1, done: false }\niter.next(); // { done: true }\n\nconst hoIter = hoi(iter); // iterator will not be clonned\n\n// ➜ { done: true }\n```\n\n### hoi(object)\n\nCreates an iterator whose elements are arrays corresponding to the enumerable property [key, value] pairs found directly upon object.\n\nThe ordering of the properties is the same as that given by looping over the property values of the object manually.\n\nThis is reminiscent of the [Object.entries](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries) method or [Map[iterator]](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/@@iterator).\n\n**Important:** [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) does not [Iterable protocol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols) in `ES2015`.\n\n```js\nconst hoi = require('ho-iter');\n\nconst iter = hoi({\n    foo: 'bar',\n    baz: 42\n});\n\nfor (let [key, val] of iter) {\n    console.log(`key: ${key}, val: ${val}`);\n}\n\n// ➜ key: foo, val: bar\n// ➜ key: baz, val: 42\n```\n\n**Important:** If you want to create iterator with integral object use [hoi.value(object)](#valuevalue) helper.\n\n```js\nconst hoi = require('ho-iter');\n\nconst iter = hoi.value({ foo: 'bar' });\n\nfor (let item of iter) {\n    console.log(item);\n}\n\n// ➜ { foo: 'bar' }\n```\n\n### hoi(number|boolean|symbol|regexp|function)\n\nIf value is not iterable then throws error:\n\n```\nIt is impossible to create iterator: `value` is not iterable object.\n```\n\nNot iterable data structures:\n\n* [Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)\n* [Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)\n* [Symbol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol)\n* [Function](https://developer.mozilla.org/en-US/docs/Glossary/Function)\n* [RegExp](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/RegExp)\n\n```js\nconst hoi = require('ho-iter');\n\nconst iter = hoi(null);\n\n// It is impossible to create iterator: `null` is not iterable object.\n```\n\nUse [hoi.value(value)](#valuevalue) to create iterator with one value.\n\n### Helpers\n\n* [value(value)](#valuevalue)\n* [isIterable(iterable)](#isiterableiterable)\n* [isIterator(iterator)](#isiteratoriterator)\n* [series(...iterables)](#seriesiterators)\n* [evenly(...iterables)](#evenlyiterators)\n* [reverse(iterable)](#reverseiterable)\n\n#### value(value)\n\nCreates iterator with specified `value`.\n\nIf value is not specified, returns empty iterator.\n\n**Example:**\n\n```js\nconst hoi = require('ho-iter');\n\nconst iter = hoi.value(123);\n\niter.next(); // { value: 123, done: false }\niter.next(); // { value: null, done: true }\n```\n\n#### isIterable(iterable)\n\nReturns `true` if the specified object implements the Iterator protocol via implementing a `Symbol.iterator`.\n\n**Example:**\n\n```js\nconst isIterable = require('ho-iter').isIterable;\n\nisIterable([1, 2, 3]); // true\nisIterable(123); // false\n```\n\n#### isIterator(iterator)\n\nReturns `true` if the specified object is iterator.\n\n```js\nconst isIterator = require('ho-iter').isIterator;\n\nconst generator = function *() {};\nconst iterator = generator();\n\nisIterator(generator) // false\nisIterator(iterator) // true\n```\n\n#### series(...iterables)\n\nReturns an Iterator, that traverses iterators in series.\n\nThis is reminiscent of the concatenation of arrays.\n\n**Example:**\n\n```js\nconst series = require('ho-iter').series;\n\nconst arr1 = [1, 2];\nconst arr2 = [3, 4];\n\nconst set1 = new Set([1, 2]);\nconst set2 = new Set([3, 4]);\n\n[].concat(arr1, arr2);\n\n// ➜ [1, 2, 3, 4]\n\nfor (let item of series(set1, set2)) {\n    console.log(item);\n}\n\n// ➜ 1 2 3 4\n```\n\n#### evenly(...iterables)\n\nReturns an Iterator, that traverses iterators evenly.\n\nThis is reminiscent of the traversing of several arrays.\n\n**Example:**\n\n```js\nconst evenly = require('ho-iter').evenly;\n\nconst arr1 = [1, 2];\nconst arr2 = [3, 4];\n\nconst set1 = new Set([1, 2]);\nconst set2 = new Set([3, 4]);\n\nfor (let i = 0; i \u003c arr1.length; i++) {\n    console.log(arr1[i]);\n    console.log(arr2[i]);\n}\n\n// ➜ 1 3 2 4\n\nfor (let item of evenly(set1, set2)) {\n    console.log(item);\n}\n\n// ➜ 1 3 2 4\n```\n\n### reverse(iterator)\n\nReturns an reversed Iterator.\n\n**Important:** incompatible with infinite iterator. Don't use infinite iterator, otherwise reverse method will fall into endless loop loop.\n\nThis is reminiscent of the reversing of an array.\n\n**Example:**\n\n```js\nconst reverse = require('ho-iter').reverse;\n\nconst arr = [1, 2, 3, 4];\nconst set = new Set([1, 2, 3, 4]);\n\nfor (let i = arr.length; i \u003e= 0; i--) {\n    console.log(arr[i]);\n}\n\n// ➜ 4 3 2 1\n\nfor (let item of reverse(set)) {\n    console.log(item);\n}\n\n// ➜ 4 3 2 1\n```\n\nLicense\n-------\n\nMIT © [Andrew Abramov](https://github.com/blond)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblond%2Fho-iter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblond%2Fho-iter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblond%2Fho-iter/lists"}