{"action":"created","comment":{"url":"https://api.github.com/repos/denysdovhan/understandinges6ua/pulls/comments/72912463","id":72912463,"diff_hunk":"@@ -0,0 +1,1051 @@\n+# Ітератори та генератори\n+\n+Багато мов програмування відмовились від ітерування по даних з допомогою циклу `for`, який потребує ініціалізації змінної для відслідковуватись позиції у колекції, на користь об’єктів–ітераторів, котрі програмно повертають наступний елемент у колекції. Ітератори роблять роботу з колекціями даних легшою, а ECMAScript 6 додає ітератори у JavaScript. Разом з новими методами масивів та новими типами колекцій (як от множини та мапи), ітератори є ключем до ефективної обробки даних і саме тому ви знайдете їх у багатьох частинах мови. Новий цикл `for-of` працює з ітераторами, оператор розкладу (`...`) використовує ітератори, ітератори навіть роблять асинхронне програмування простішим.\n+\n+Ця глава розповідає про способи використання ітераторів, але, для початку, дуже важливо зрозуміти історію того, чому ітератори були додані у JavaScript.\n+\n+## Проблема з циклами\n+\n+Якщо ви до цього програмували на JavaScript, ви напевно писали колись такий код:\n+\n+```js\n+var colors = [\"red\", \"green\", \"blue\"];\n+\n+for (var i = 0, len = colors.length; i < len; i++) {\n+    console.log(colors[i]);\n+}\n+```\n+\n+Тут стандартний цикл `for` відслідковує індекс у масиві `colors` через змінну `i`. Значення `i` збільшується щоразу, коли виконується ітерація, якщо значення `i` є меншим за довжину масиву (що зберігається у `len`).\n+\n+Цей цикл виглядає доволі просто, але якщо ви захочете використовувати кілька змінних, вам доведеться вкладати цикл один в один, а складність при цьому буде збільшуватись. Додаткова складність є джерелом помилок, а шаблонна природа циклу `for` призводить до ще більшої кількості помилок, ніж схожий код, що написаний у кількох місцях. Ітератори мають вирішити цю проблему.\n+\n+## Що таке ітератори?\n+\n+Ітератори є простими об’єктами з певним інтерфейсом для ітерування. Всі об’єкти–ітератори мають метод `next()`, що повертає об’єкт–результат. Об’єкт–результат має дві властивості: `value`, яка є наступним значенням, та `done`, яка є булевим значенням, котре рівне `true`, якщо більше не залишилось значень, які потрібно повернути. Ітератор зберігає внутрішній вказівник на розташування у колекції і з кожним викликом методу `next()` він повертає потрібне значення.\n+\n+Якщо ви викличете `next()` після останнього значення, що було повернуте, метод поверне `done` рівне `true` та `value`, що містить *повернене значення (return value)* для ітератора. Це повернене значення не є частиною множини даних, але є останньою частинкою цих даних або `undefined`, якщо даних немає. повернене Значення в ітераторів дуже схоже на повернене значення у функцій у тому, що це остання можливість передати інформацію у місце, звідки їх викликали.\n+\n+Знаючи це, створити генератор з використанням ECMAScript 5 дуже просто:\n+\n+```js\n+function createIterator(items) {\n+\n+    var i = 0;\n+\n+    return {\n+        next: function() {\n+\n+            var done = (i >= items.length);\n+            var value = !done ? items[i++] : undefined;\n+\n+            return {\n+                done: done,\n+                value: value\n+            };\n+\n+        }\n+    };\n+}\n+\n+var iterator = createIterator([1, 2, 3]);\n+\n+console.log(iterator.next());           // \"{ value: 1, done: false }\"\n+console.log(iterator.next());           // \"{ value: 2, done: false }\"\n+console.log(iterator.next());           // \"{ value: 3, done: false }\"\n+console.log(iterator.next());           // \"{ value: undefined, done: true }\"\n+\n+// для всіх наступних викликів\n+console.log(iterator.next());           // \"{ value: undefined, done: true }\"\n+```\n+\n+Функція `createIterator()` повертає об’єкт з методом `next()`. Щоразу, коли метод викликається, в якості `value` повертається наступне значення з масиву `items`. Коли `i` дорівнює 3, `done` стає `true` а тернарний оператор, що встановлює `value` обчислюється в `undefined`. Ці два результати відповідають за останній випадок для ітераторів у ECMAScript 6, коли `next()` викликається для ітератора після того, як було використано останню частину даних.\n+\n+Як показує приклад, написання ітераторів, що поводяться відповідно до правил, які покладені в ECMAScript 6 є дещо складним.\n+\n+На щастя, ECMAScript 6 також надає нам генератори, які роблять створення об’єктів–ітераторів набагато простішим.\n+\n+## Що таке генератори?\n+\n+*Генератор* — це функція, що повертає ітератор. Функція–генератори позначаються символом зірочки (`*`) після ключового слова `function` та використовує ключове слово `yield`. Неважливо чи зірочка стоїть відразу після `function` чи між ним та символом `*` є пробіли, ось приклад:\n+\n+```js\n+// генератор\n+function *createIterator() {\n+    yield 1;\n+    yield 2;\n+    yield 3;\n+}\n+\n+// генератори викликаються як звичайні функції, але повертають ітератор\n+let iterator = createIterator();\n+\n+console.log(iterator.next().value);     // 1\n+console.log(iterator.next().value);     // 2\n+console.log(iterator.next().value);     // 3\n+```\n+\n+Символ `*` перед `createIterator()` робить цю функцію генератором. Ключове слово `yield` є також новим у ECMAScript 6 і визначає значення, які кінцевому ітератору слід буде повертати при виклику `next()` у тому порядку, в якому вони мають повертатись. Ітератор, що був згенерований у цьому прикладі, має три різних значення, що повертаються при послідовних викликах методу `next()`: перше `1`, друге `2` та третє `3`. Генератор викликається як і будь–яка інша функція, що і показано при створенні `iterator`.\n+\n+Можливо найцікавішим аспектом функцій–генераторів є те, що вони зупиняють виконання після кожного оператора `yield`. Наприклад, після виконання `yield 1` у цьому коді, функція не виконує нічого іншого доки не буде викликано метод `next()`. Лише тоді виконається `yield 2`. Така можливість зупинки виконання всередині функції є надзвичайно потужною і має декілька цікавих застосувань у функціях–генераторах (про це піде мова у розділі «Розширена функціональність ітераторів»).\n+\n+Ключове слово `yield` можна використовувати з будь–яким значення або виразом, тому ви можете написати функцію–генератор, що додає елементи у ітератор без відслідковування елементів один за одним. Наприклад, ось один зі способів використання `yield` всередині циклу `for`:\n+\n+```js\n+function *createIterator(items) {\n+    for (let i = 0; i < items.length; i++) {\n+        yield items[i];\n+    }\n+}\n+\n+let iterator = createIterator([1, 2, 3]);\n+\n+console.log(iterator.next());           // \"{ value: 1, done: false }\"\n+console.log(iterator.next());           // \"{ value: 2, done: false }\"\n+console.log(iterator.next());           // \"{ value: 3, done: false }\"\n+console.log(iterator.next());           // \"{ value: undefined, done: true }\"\n+\n+// для всіх наступних викликів\n+console.log(iterator.next());           // \"{ value: undefined, done: true }\"\n+```\n+\n+Цей приклад у функцію–генератор `createIterator()` передається масив `items`. Всередині функції, цикл `for` віддає елементи з масиву в ітератор по мірі виконання циклу. Щоразу, коли зустрічається `yield`, цикл зупиняється, і щоразу, коли для `iterator` викликається `next()`, цикл продовжується до наступного оператора `yield`.\n+\n+Функції–генератори є важливим нововведенням ECMAScript 6 і оскільки це всього лише функції, вони можуть використовуватись у тому ж місці, де і функції. Решта цього розділу фокусується на інших способах написання генераторів.\n+\n+W> Ключове слово `yield` може використовуватись лише всередині генераторів. Використання `yield` будь–де, включаючи функції всередині генераторів, призведе до синтаксичної помилки:\n+\n+```js\n+function *createIterator(items) {\n+\n+    items.forEach(function(item) {\n+\n+        // синтаксична помилка\n+        yield item + 1;\n+    });\n+}\n+```\n+\n+W> Навіть хоча й `yield` технічно в середині `createIterator()`, цей код матиме синтаксичну помилку тому, що `yield` не може перетинати функціональні межі. У цьому випадку, `yield` схожий на `return` у тому, що вкладена функція не може повернути значення з функції у якій вона міститься.\n+\n+### Вираз функції–генератора\n+\n+Ви можете використовувати функціональний вираз для створення генераторів просто додавши символ зірочки (`*`) між ключовим слово `function` та відкриваючою круглою дужкою. Наприклад:\n+\n+```js\n+let createIterator = function *(items) {\n+    for (let i = 0; i < items.length; i++) {\n+        yield items[i];\n+    }\n+};\n+\n+let iterator = createIterator([1, 2, 3]);\n+\n+console.log(iterator.next());           // \"{ value: 1, done: false }\"\n+console.log(iterator.next());           // \"{ value: 2, done: false }\"\n+console.log(iterator.next());           // \"{ value: 3, done: false }\"\n+console.log(iterator.next());           // \"{ value: undefined, done: true }\"\n+\n+// для всіх наступних викликів\n+console.log(iterator.next());           // \"{ value: undefined, done: true }\"\n+```\n+\n+У цьому коді, `createIterator()` є виразом функції–генератора замість оголошення функції. Зірочка розташована між ключовим словом `function` та відкриваючою круглою дужкою, тому що функціональний вираз є анонімним. Все інше у цьому прикладі є таким же, як і в попередній версії функції `createIterator()`, яка використовує цикл `for`.\n+\n+I> Створити arrow–функцію яка буде генератором неможливо.\n+\n+### Методи–генератори в об’єктах\n+\n+Оскільки генератори є простими функціями, їх також можна додавати в об’єкти. Наприклад, ви можете зробити генератор у об’єктному літералі в стилі ECMAScript 5 через функціональний вираз:\n+\n+```js\n+var o = {\n+\n+    createIterator: function *(items) {\n+        for (let i = 0; i < items.length; i++) {\n+            yield items[i];\n+        }\n+    }\n+};\n+\n+let iterator = o.createIterator([1, 2, 3]);\n+```\n+\n+Ви можете також використати лаконічні методи з ECMAScript 6 додавши перед ім’ям методу зірочку (`*`):\n+\n+```js\n+var o = {\n+\n+    *createIterator(items) {\n+        for (let i = 0; i < items.length; i++) {\n+            yield items[i];\n+        }\n+    }\n+};\n+\n+let iterator = o.createIterator([1, 2, 3]);\n+```\n+\n+Ці приклади функціонально еквіваленті до прикладу у розділі «Вираз функції–генератора», вони просто використовують різний синтаксис. У прикладі з лаконічним методом, оскільки метод `createIterator()` заданий без ключового слова `function`, зірочка розташована відразу перед ім’ям методу, але ви можете залишити пробіл між ними.\n+\n+## Ітерабельні об’єкти та for-of\n+\n+Дуже близькими до ітераторів є *ітерабельні об’єкти (iterable)* — це об’єкти з властивістю `Symbol.iterator`. Добревідомий символ `Symbol.iterator` задає функцію, що повертає ітератор для даного об’єкту. Всі об’єкти колекцій (масиви, множини та мапи) та рядки є ітерательними в ECMAScript 6, тобто вони мають визначений за замовчуванням ітератор. Ітерабельні об’єкти спроектовані для використання з новим доповненням у ECMAScript: циклом `for-of`.\n+\n+I> Всі ітератори, які створені з допомогою генераторів, також є ітерабельними, бо генератори за замовчуванням присвоюють властивість `Symbol.iterator`.\n+\n+На початку цієї глави я згадав про проблему відслідковування індексу всередині циклу `for`. Ітератори є першою частиною вирішення цієї проблеми. Цикл `for-of` є іншою частиною: з ним не потрібно слідкувати за індексом всередині колекції і це дозволяє вам сконцентруватись на роботі з її вмістом.\n+\n+Цикл `for-of` викликає `next()` в ітерабельного об’єкта під час кожного виконання циклу та зберігає `value` з отриманого об’єкта у змінну. Цикл продовжує виконання допоки властивість `done` у об’єкта, що повертається не буде дорівнювати `true`. Ось приклад:\n+\n+```js\n+let values = [1, 2, 3];\n+\n+for (let num of values) {\n+    console.log(num);\n+}\n+```\n+\n+Цей код виводить наступне:\n+\n+```\n+1\n+2\n+3\n+```\n+\n+Цей цикл `for-of` спершу викликає метод `Symbol.iterator` для масиву `values`, що отримати ітератор. (Виклик `Symbol.iterator` відбувається за кулісами всередині самого рушія JavaScript.) Тоді викликається `iterator.next()`, а властивість `value` об’єкті, який повертається з ітератора читається в `num`. Змінна `num` приймає значення 1, потім 2 і нарешті 3. Коли `done` в об’єкті, що повертається, буде `true`, цикл закінчує виконання, тому `num` ніколи не присвоюється значення `undefined`.\n+\n+Якщо ви просто ітеруєтесь по значеннях у масиві, або колекції, тоді використання циклу `for-of` замість циклу `for` буде хорошою ідеєю. Цикл `for-of` спричиняє загалом менше помилок завдяки тому, що вам потрібно слідкувати за меншою кількістю умов. Залиште традиційний цикл `for` для більш складних керуючих умов.\n+\n+W> Оператор `for-of` кине помилку при спробі використати його з неітерабельним об’єктом, `null` або `undefined`.\n+\n+### Доступ до ітератора за замовчуванням\n+\n+Ви можете скористатись `Symbol.iterator` для доступу до ітератора об’єкта за замовчуванням, ось так:\n+\n+```js\n+let values = [1, 2, 3];\n+let iterator = values[Symbol.iterator]();\n+\n+console.log(iterator.next());           // \"{ value: 1, done: false }\"\n+console.log(iterator.next());           // \"{ value: 2, done: false }\"\n+console.log(iterator.next());           // \"{ value: 3, done: false }\"\n+console.log(iterator.next());           // \"{ value: undefined, done: true }\"\n+```\n+\n+Цей код повертає ітератор за замовчування для `values` та використовує його для ітерації по елементах масиву. Це той же процес, що відбувається за кулісами при використанні циклу `for-of`.\n+\n+Оскільки `Symbol.iterator` задає ітератор за замовчуванням, ви можете використовувати його щоб визначати чи об’єкт є ітерабельним:\n+\n+```js\n+function isIterable(object) {\n+    return typeof object[Symbol.iterator] === \"function\";\n+}\n+\n+console.log(isIterable([1, 2, 3]));     // true\n+console.log(isIterable(\"Hello\"));       // true\n+console.log(isIterable(new Map()));     // true\n+console.log(isIterable(new Set()));     // true\n+console.log(isIterable(new WeakMap())); // false\n+console.log(isIterable(new WeakSet())); // false\n+```\n+\n+Функцію `isIterable()` просто перевіряє чи ітератор за замовчуванням існує і є функцією. Цикл `for-of` робить таку ж перевірку перед виконанням.\n+\n+Раніше у цьому розділі було показано способи використання `Symbol.iterator` з вбудованими ітерабельними типами, проте ви також можете використовувати властивість `Symbol.iterator` для створення власних ітерабельних об’єктів.\n+\n+### Створення ітерабельних об’єктів\n+\n+Об’єкти, що були задані розробниками, є не є ітерабельними за замовчуванням, але ви можете зробити їх такими через створення властивості `Symbol.iterator`, що містить генератор. Наприклад:\n+\n+```js\n+let collection = {\n+    items: [],\n+    *[Symbol.iterator]() {\n+        for (let item of this.items) {\n+            yield item;\n+        }\n+    }\n+\n+};\n+\n+collection.items.push(1);\n+collection.items.push(2);\n+collection.items.push(3);\n+\n+for (let x of collection) {\n+    console.log(x);\n+}\n+```\n+\n+Цей код виводить наступне:\n+\n+```\n+1\n+2\n+3\n+```\n+\n+Спочатку приклад визначає ітератор за замовчуванням для об’єкта `collection`. Ітератор за замовчуванням створюється через метод `Symbol.iterator`, який є генератором (зверніть увагу, що перед ім’ям стоїть зірочка). Генератор використовує цикл `for-of` для ітерації по значеннях та `yield` для повернення кожного. Замість простого ітерування для визначення значень, які ітератор за замовчуванням для `collection` має повернути, об’єкт `collection` покладається на ітератор за замовчуванням в `this.items`, що виконає цю роботу.\n+\n+I> Далі у цій главі розділ «Делегування генераторів» описує різні підходи використання ітераторів інших об’єктів.\n+\n+Тепер ви побачили декілька способів використання ітератора за замовчуванням для масивів, але є набагато більше вбудованих у ECMAScript 6 ітераторів, щоб зробити роботу з колекціями даних простішою.\n+\n+## Вбудовані ітератори\n+\n+Ітератори є важливою частиною ECMAScript 6, і, як слід здогадатись, немає потреби створювати власні ітератори для більшості вбудованих типів, мова включає їх за замовчуванням. Вам може знадобитись створення власних ітераторів лише тоді, коли вбудовані ітератори не відповідатимуть вашим потребам, що найчастіше стається тоді, коли ви визначаєте власні об’єкти або класи. В іншому випадку, у виконанні своєї роботи ви можете покластись на вбудовані ітератори. Можливо найбільш поширеними є ітератори для роботи з колекціями.\n+\n+### Ітератори колекцій\n+\n+ECMAScript 6 має три типи об’єктів–колекцій: масиви, мапи та множини. Для роботи з їхнім вмістом всі три мають такі вбудовані ітератори:\n+\n+* `entries()` - повертає ітератор, значеннями якого будуть пари “ключ–значення”;\n+* `values()` - повертає ітератор, значення якого будуть значеннями колекції;\n+* `keys()` - повертає ітератор, значення якого будуть ключами, що містяться у колекції;\n+\n+Ви можете отримати ітератор для колекції через виклик одного з цих трьох методів.\n+\n+#### Ітератор entries()\n+\n+Ітератор `entries()` при кожному виклику `next()` повертає двохелементний масив. Двоелементний масив відображає ключ та значення кожного елементу колекції. Для масивів першим елементом буде числовий індекс; для множин першим елементом також буде значення (оскільки у множинах значення дублюють ключі); для мап, перший елемент буде ключем.\n+\n+Ось кілька прикладів використання цього ітератора:\n+\n+```js\n+let colors = [ \"red\", \"green\", \"blue\" ];\n+let tracking = new Set([1234, 5678, 9012]);\n+let data = new Map();\n+\n+data.set(\"title\", \"Understanding ECMAScript 6\");\n+data.set(\"format\", \"ebook\");\n+\n+for (let entry of colors.entries()) {\n+    console.log(entry);\n+}\n+\n+for (let entry of tracking.entries()) {\n+    console.log(entry);\n+}\n+\n+for (let entry of data.entries()) {\n+    console.log(entry);\n+}\n+```\n+\n+Виклики `console.log()` дають такий вивід:\n+\n+```\n+[0, \"red\"]\n+[1, \"green\"]\n+[2, \"blue\"]\n+[1234, 1234]\n+[5678, 5678]\n+[9012, 9012]\n+[\"title\", \"Understanding ECMAScript 6\"]\n+[\"format\", \"ebook\"]\n+```\n+\n+Цей код отримує ітератор кожного типу колекцій з допомогою метода `entries()` та використовує цикл `for-of` для ітерації по елементах. Вивід у консоль демонструє які пари ключів та значень повертаються для кожного об’єкта.\n+\n+#### Ітератор values()\n+\n+Ітератор `values()` просто повертає значення так, як вони були збережені у колекцію. Наприклад:\n+\n+```js\n+let colors = [ \"red\", \"green\", \"blue\" ];\n+let tracking = new Set([1234, 5678, 9012]);\n+let data = new Map();\n+\n+data.set(\"title\", \"Understanding ECMAScript 6\");\n+data.set(\"format\", \"ebook\");\n+\n+for (let value of colors.values()) {\n+    console.log(value);\n+}\n+\n+for (let value of tracking.values()) {\n+    console.log(value);\n+}\n+\n+for (let value of data.values()) {\n+    console.log(value);\n+}\n+```\n+\n+Цей код виведе таке:\n+\n+```\n+\"red\"\n+\"green\"\n+\"blue\"\n+1234\n+5678\n+9012\n+\"Understanding ECMAScript 6\"\n+\"ebook\"\n+```\n+\n+Виклик ітератора `values()`, як у цьому прикладі, повертає повертає саме ті дані, що містяться у кожній з колекцій, без будь–якої інформації про те, де ці дані знаходяться у колекції.","path":"manuscript/08-Iterators-And-Generators.md","position":390,"original_position":390,"commit_id":"9b3b1fc938f6d1d198c2920a835b605c5e30c1ca","original_commit_id":"9b3b1fc938f6d1d198c2920a835b605c5e30c1ca","user":{"login":"closedalexandr","id":17600166,"avatar_url":"https://avatars.githubusercontent.com/u/17600166?v=3","gravatar_id":"","url":"https://api.github.com/users/closedalexandr","html_url":"https://github.com/closedalexandr","followers_url":"https://api.github.com/users/closedalexandr/followers","following_url":"https://api.github.com/users/closedalexandr/following{/other_user}","gists_url":"https://api.github.com/users/closedalexandr/gists{/gist_id}","starred_url":"https://api.github.com/users/closedalexandr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/closedalexandr/subscriptions","organizations_url":"https://api.github.com/users/closedalexandr/orgs","repos_url":"https://api.github.com/users/closedalexandr/repos","events_url":"https://api.github.com/users/closedalexandr/events{/privacy}","received_events_url":"https://api.github.com/users/closedalexandr/received_events","type":"User","site_admin":false},"body":"повертає саме ті дані, що містяться у кожній з колекцій без будь–якої інформації про те, де ці дані знаходяться у колекції.","created_at":"2016-07-31T22:36:40Z","updated_at":"2016-07-31T22:36:41Z","html_url":"https://github.com/denysdovhan/understandinges6ua/pull/9#discussion_r72912463","pull_request_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/pulls/9","_links":{"self":{"href":"https://api.github.com/repos/denysdovhan/understandinges6ua/pulls/comments/72912463"},"html":{"href":"https://github.com/denysdovhan/understandinges6ua/pull/9#discussion_r72912463"},"pull_request":{"href":"https://api.github.com/repos/denysdovhan/understandinges6ua/pulls/9"}}},"pull_request":{"url":"https://api.github.com/repos/denysdovhan/understandinges6ua/pulls/9","id":77717230,"html_url":"https://github.com/denysdovhan/understandinges6ua/pull/9","diff_url":"https://github.com/denysdovhan/understandinges6ua/pull/9.diff","patch_url":"https://github.com/denysdovhan/understandinges6ua/pull/9.patch","issue_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/issues/9","number":9,"state":"open","locked":false,"title":"Translate “08 Iterators And Generators”","user":{"login":"denysdovhan","id":3459374,"avatar_url":"https://avatars.githubusercontent.com/u/3459374?v=3","gravatar_id":"","url":"https://api.github.com/users/denysdovhan","html_url":"https://github.com/denysdovhan","followers_url":"https://api.github.com/users/denysdovhan/followers","following_url":"https://api.github.com/users/denysdovhan/following{/other_user}","gists_url":"https://api.github.com/users/denysdovhan/gists{/gist_id}","starred_url":"https://api.github.com/users/denysdovhan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/denysdovhan/subscriptions","organizations_url":"https://api.github.com/users/denysdovhan/orgs","repos_url":"https://api.github.com/users/denysdovhan/repos","events_url":"https://api.github.com/users/denysdovhan/events{/privacy}","received_events_url":"https://api.github.com/users/denysdovhan/received_events","type":"User","site_admin":false},"body":"Translate [`08-Iterators-And-Generators.md`](https://github.com/nzakas/understandinges6/blob/master/manuscript/08-Iterators-And-Generators.md).","created_at":"2016-07-16T19:15:05Z","updated_at":"2016-07-31T22:36:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"83fd3050d85fb69d6db89aa3c99710a542c0e2bf","assignee":{"login":"denysdovhan","id":3459374,"avatar_url":"https://avatars.githubusercontent.com/u/3459374?v=3","gravatar_id":"","url":"https://api.github.com/users/denysdovhan","html_url":"https://github.com/denysdovhan","followers_url":"https://api.github.com/users/denysdovhan/followers","following_url":"https://api.github.com/users/denysdovhan/following{/other_user}","gists_url":"https://api.github.com/users/denysdovhan/gists{/gist_id}","starred_url":"https://api.github.com/users/denysdovhan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/denysdovhan/subscriptions","organizations_url":"https://api.github.com/users/denysdovhan/orgs","repos_url":"https://api.github.com/users/denysdovhan/repos","events_url":"https://api.github.com/users/denysdovhan/events{/privacy}","received_events_url":"https://api.github.com/users/denysdovhan/received_events","type":"User","site_admin":false},"assignees":[{"login":"denysdovhan","id":3459374,"avatar_url":"https://avatars.githubusercontent.com/u/3459374?v=3","gravatar_id":"","url":"https://api.github.com/users/denysdovhan","html_url":"https://github.com/denysdovhan","followers_url":"https://api.github.com/users/denysdovhan/followers","following_url":"https://api.github.com/users/denysdovhan/following{/other_user}","gists_url":"https://api.github.com/users/denysdovhan/gists{/gist_id}","starred_url":"https://api.github.com/users/denysdovhan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/denysdovhan/subscriptions","organizations_url":"https://api.github.com/users/denysdovhan/orgs","repos_url":"https://api.github.com/users/denysdovhan/repos","events_url":"https://api.github.com/users/denysdovhan/events{/privacy}","received_events_url":"https://api.github.com/users/denysdovhan/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/pulls/9/commits","review_comments_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/pulls/9/comments","review_comment_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/pulls/comments{/number}","comments_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/issues/9/comments","statuses_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/statuses/9b3b1fc938f6d1d198c2920a835b605c5e30c1ca","head":{"label":"denysdovhan:08-iterators-and-generators","ref":"08-iterators-and-generators","sha":"9b3b1fc938f6d1d198c2920a835b605c5e30c1ca","user":{"login":"denysdovhan","id":3459374,"avatar_url":"https://avatars.githubusercontent.com/u/3459374?v=3","gravatar_id":"","url":"https://api.github.com/users/denysdovhan","html_url":"https://github.com/denysdovhan","followers_url":"https://api.github.com/users/denysdovhan/followers","following_url":"https://api.github.com/users/denysdovhan/following{/other_user}","gists_url":"https://api.github.com/users/denysdovhan/gists{/gist_id}","starred_url":"https://api.github.com/users/denysdovhan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/denysdovhan/subscriptions","organizations_url":"https://api.github.com/users/denysdovhan/orgs","repos_url":"https://api.github.com/users/denysdovhan/repos","events_url":"https://api.github.com/users/denysdovhan/events{/privacy}","received_events_url":"https://api.github.com/users/denysdovhan/received_events","type":"User","site_admin":false},"repo":{"id":49322520,"name":"understandinges6ua","full_name":"denysdovhan/understandinges6ua","owner":{"login":"denysdovhan","id":3459374,"avatar_url":"https://avatars.githubusercontent.com/u/3459374?v=3","gravatar_id":"","url":"https://api.github.com/users/denysdovhan","html_url":"https://github.com/denysdovhan","followers_url":"https://api.github.com/users/denysdovhan/followers","following_url":"https://api.github.com/users/denysdovhan/following{/other_user}","gists_url":"https://api.github.com/users/denysdovhan/gists{/gist_id}","starred_url":"https://api.github.com/users/denysdovhan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/denysdovhan/subscriptions","organizations_url":"https://api.github.com/users/denysdovhan/orgs","repos_url":"https://api.github.com/users/denysdovhan/repos","events_url":"https://api.github.com/users/denysdovhan/events{/privacy}","received_events_url":"https://api.github.com/users/denysdovhan/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/denysdovhan/understandinges6ua","description":"Ukrainian translation of “Understanding ES6” by @nzakas","fork":false,"url":"https://api.github.com/repos/denysdovhan/understandinges6ua","forks_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/forks","keys_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/keys{/key_id}","collaborators_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/teams","hooks_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/hooks","issue_events_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/issues/events{/number}","events_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/events","assignees_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/assignees{/user}","branches_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/branches{/branch}","tags_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/tags","blobs_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/git/refs{/sha}","trees_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/git/trees{/sha}","statuses_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/statuses/{sha}","languages_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/languages","stargazers_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/stargazers","contributors_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/contributors","subscribers_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/subscribers","subscription_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/subscription","commits_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/commits{/sha}","git_commits_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/git/commits{/sha}","comments_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/comments{/number}","issue_comment_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/issues/comments{/number}","contents_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/contents/{+path}","compare_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/compare/{base}...{head}","merges_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/merges","archive_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/downloads","issues_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/issues{/number}","pulls_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/pulls{/number}","milestones_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/milestones{/number}","notifications_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/labels{/name}","releases_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/releases{/id}","deployments_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/deployments","created_at":"2016-01-09T11:57:24Z","updated_at":"2016-05-04T15:52:42Z","pushed_at":"2016-07-28T09:03:56Z","git_url":"git://github.com/denysdovhan/understandinges6ua.git","ssh_url":"git@github.com:denysdovhan/understandinges6ua.git","clone_url":"https://github.com/denysdovhan/understandinges6ua.git","svn_url":"https://github.com/denysdovhan/understandinges6ua","homepage":"http://understandinges6.denysdovhan.com","size":2577,"stargazers_count":22,"watchers_count":22,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":8,"mirror_url":null,"open_issues_count":11,"forks":8,"open_issues":11,"watchers":22,"default_branch":"master"}},"base":{"label":"denysdovhan:master","ref":"master","sha":"82375b6668fa089e2b78966d46a7cdb0e64d47a7","user":{"login":"denysdovhan","id":3459374,"avatar_url":"https://avatars.githubusercontent.com/u/3459374?v=3","gravatar_id":"","url":"https://api.github.com/users/denysdovhan","html_url":"https://github.com/denysdovhan","followers_url":"https://api.github.com/users/denysdovhan/followers","following_url":"https://api.github.com/users/denysdovhan/following{/other_user}","gists_url":"https://api.github.com/users/denysdovhan/gists{/gist_id}","starred_url":"https://api.github.com/users/denysdovhan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/denysdovhan/subscriptions","organizations_url":"https://api.github.com/users/denysdovhan/orgs","repos_url":"https://api.github.com/users/denysdovhan/repos","events_url":"https://api.github.com/users/denysdovhan/events{/privacy}","received_events_url":"https://api.github.com/users/denysdovhan/received_events","type":"User","site_admin":false},"repo":{"id":49322520,"name":"understandinges6ua","full_name":"denysdovhan/understandinges6ua","owner":{"login":"denysdovhan","id":3459374,"avatar_url":"https://avatars.githubusercontent.com/u/3459374?v=3","gravatar_id":"","url":"https://api.github.com/users/denysdovhan","html_url":"https://github.com/denysdovhan","followers_url":"https://api.github.com/users/denysdovhan/followers","following_url":"https://api.github.com/users/denysdovhan/following{/other_user}","gists_url":"https://api.github.com/users/denysdovhan/gists{/gist_id}","starred_url":"https://api.github.com/users/denysdovhan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/denysdovhan/subscriptions","organizations_url":"https://api.github.com/users/denysdovhan/orgs","repos_url":"https://api.github.com/users/denysdovhan/repos","events_url":"https://api.github.com/users/denysdovhan/events{/privacy}","received_events_url":"https://api.github.com/users/denysdovhan/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/denysdovhan/understandinges6ua","description":"Ukrainian translation of “Understanding ES6” by @nzakas","fork":false,"url":"https://api.github.com/repos/denysdovhan/understandinges6ua","forks_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/forks","keys_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/keys{/key_id}","collaborators_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/teams","hooks_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/hooks","issue_events_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/issues/events{/number}","events_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/events","assignees_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/assignees{/user}","branches_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/branches{/branch}","tags_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/tags","blobs_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/git/refs{/sha}","trees_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/git/trees{/sha}","statuses_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/statuses/{sha}","languages_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/languages","stargazers_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/stargazers","contributors_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/contributors","subscribers_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/subscribers","subscription_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/subscription","commits_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/commits{/sha}","git_commits_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/git/commits{/sha}","comments_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/comments{/number}","issue_comment_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/issues/comments{/number}","contents_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/contents/{+path}","compare_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/compare/{base}...{head}","merges_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/merges","archive_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/downloads","issues_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/issues{/number}","pulls_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/pulls{/number}","milestones_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/milestones{/number}","notifications_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/labels{/name}","releases_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/releases{/id}","deployments_url":"https://api.github.com/repos/denysdovhan/understandinges6ua/deployments","created_at":"2016-01-09T11:57:24Z","updated_at":"2016-05-04T15:52:42Z","pushed_at":"2016-07-28T09:03:56Z","git_url":"git://github.com/denysdovhan/understandinges6ua.git","ssh_url":"git@github.com:denysdovhan/understandinges6ua.git","clone_url":"https://github.com/denysdovhan/understandinges6ua.git","svn_url":"https://github.com/denysdovhan/understandinges6ua","homepage":"http://understandinges6.denysdovhan.com","size":2577,"stargazers_count":22,"watchers_count":22,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":8,"mirror_url":null,"open_issues_count":11,"forks":8,"open_issues":11,"watchers":22,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/denysdovhan/understandinges6ua/pulls/9"},"html":{"href":"https://github.com/denysdovhan/understandinges6ua/pull/9"},"issue":{"href":"https://api.github.com/repos/denysdovhan/understandinges6ua/issues/9"},"comments":{"href":"https://api.github.com/repos/denysdovhan/understandinges6ua/issues/9/comments"},"review_comments":{"href":"https://api.github.com/repos/denysdovhan/understandinges6ua/pulls/9/comments"},"review_comment":{"href":"https://api.github.com/repos/denysdovhan/understandinges6ua/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/denysdovhan/understandinges6ua/pulls/9/commits"},"statuses":{"href":"https://api.github.com/repos/denysdovhan/understandinges6ua/statuses/9b3b1fc938f6d1d198c2920a835b605c5e30c1ca"}}}}
{"actor":{"display_login":"closedalexandr"}}