From 780fa978642bf7004023e5a558744fa610f5bc32 Mon Sep 17 00:00:00 2001 From: Bernhard Posselt Date: Thu, 22 May 2014 01:26:06 +0200 Subject: add docs on iterators --- js/README.md | 21 ++++- js/build/app.js | 149 ++++++++++++++++++++++++++++------ js/service/FeedResource.js | 2 +- js/service/FolderResource.js | 2 +- js/service/ItemResource.js | 2 +- js/service/Resource.js | 16 ++-- js/tests/unit/service/ResourceSpec.js | 2 +- js/utility/iterators.js | 21 ++++- 8 files changed, 175 insertions(+), 40 deletions(-) diff --git a/js/README.md b/js/README.md index 8a46f598b..8e2a373da 100644 --- a/js/README.md +++ b/js/README.md @@ -9,8 +9,25 @@ then run: The news app uses [Traceur](https://github.com/google/traceur-compiler) to transpile ES6 into ES5. If you want to take a look at the features see [the language features reference](https://github.com/google/traceur-compiler/wiki/LanguageFeatures#language-features). -* Modules can not be used since the code is inlined -* The following iterators are available: **items** +### Iterator +The following iterators are defined and availabe: + +* **items**: + + ```js + // iterate over object key and value + for (let [key, value] of items(obj)) { + console.log(`object key: ${key}, object value: ${value}`) + } + ``` +* **enumerate**: + + ```js + // iterate over object key and value + for (let [index, value] of enumerate(list)) { + console.log(`at position: ${index}, value is: ${value}`) + } + ``` ## Building Watch mode: diff --git a/js/build/app.js b/js/build/app.js index 4a3eed819..8f09b44d1 100644 --- a/js/build/app.js +++ b/js/build/app.js @@ -206,8 +206,8 @@ var $__build_47_app__ = function () { 'use strict'; var FeedResource = function FeedResource($http) { $traceurRuntime.superCall(this, $FeedResource.prototype, 'constructor', [ - 'url', - $http + $http, + 'url' ]); }; var $FeedResource = FeedResource; @@ -222,8 +222,8 @@ var $__build_47_app__ = function () { 'use strict'; var FolderResource = function FolderResource($http) { $traceurRuntime.superCall(this, $FolderResource.prototype, 'constructor', [ - 'name', - $http + $http, + 'name' ]); }; var $FolderResource = FolderResource; @@ -237,10 +237,7 @@ var $__build_47_app__ = function () { function (Resource, $http) { 'use strict'; var ItemResource = function ItemResource($http) { - $traceurRuntime.superCall(this, $ItemResource.prototype, 'constructor', [ - 'id', - $http - ]); + $traceurRuntime.superCall(this, $ItemResource.prototype, 'constructor', [$http]); }; var $ItemResource = ItemResource; $traceurRuntime.createClass(ItemResource, { @@ -345,18 +342,25 @@ var $__build_47_app__ = function () { }); app.factory('Resource', function () { 'use strict'; - var Resource = function Resource(id, http) { + var Resource = function Resource(http) { + var id = arguments[1] !== void 0 ? arguments[1] : 'id'; this.id = id; this.values = []; this.hashMap = {}; this.http = http; }; $traceurRuntime.createClass(Resource, { - receive: function (values) { - var $__0 = this; - values.forEach(function (value) { - $__0.add(value); - }); + receive: function (objs) { + for (var $__3 = objs[$traceurRuntime.toProperty(Symbol.iterator)](), $__4; !($__4 = $__3.next()).done;) { + try { + throw undefined; + } catch (obj) { + obj = $__4.value; + { + this.add(obj); + } + } + } }, add: function (obj) { var existing = this.hashMap[$traceurRuntime.toProperty(obj[$traceurRuntime.toProperty(this.id)])]; @@ -396,23 +400,26 @@ var $__build_47_app__ = function () { }, delete: function (id) { var deleteAtIndex; - { + for (var $__3 = enumerate(this.values)[$traceurRuntime.toProperty(Symbol.iterator)](), $__4; !($__4 = $__3.next()).done;) { try { throw undefined; - } catch ($i) { - $i = 0; - for (; $i < this.values.length; $i += 1) { + } catch (value) { + try { + throw undefined; + } catch (index) { try { throw undefined; - } catch (i) { - i = $i; - try { - if (this.values[$traceurRuntime.toProperty(i)][$traceurRuntime.toProperty(this.id)] === id) { - deleteAtIndex = i; + } catch ($__8) { + { + $__8 = $traceurRuntime.assertObject($__4.value); + index = $__8[0]; + value = $__8[1]; + } + { + if (value[$traceurRuntime.toProperty(this.id)] === id) { + deleteAtIndex = index; break; } - } finally { - $i = i; } } } @@ -685,6 +692,98 @@ var $__build_47_app__ = function () { writable: true }), $__2; }; + window.enumerate = function (list) { + 'use strict'; + var $__2; + return $__2 = {}, Object.defineProperty($__2, Symbol.iterator, { + value: function () { + return $traceurRuntime.initGeneratorFunction(function $__9() { + var counter, $counter; + return $traceurRuntime.createGeneratorInstance(function ($ctx) { + while (true) + switch ($ctx.state) { + case 0: + $ctx.pushTry(28, null); + $ctx.state = 31; + break; + case 31: + throw undefined; + $ctx.state = 33; + break; + case 33: + $ctx.popTry(); + $ctx.state = -2; + break; + case 28: + $ctx.popTry(); + $counter = $ctx.storedException; + $ctx.state = 26; + break; + case 26: + $counter = 0; + $ctx.state = 27; + break; + case 27: + $ctx.state = $counter < list.length ? 17 : -2; + break; + case 22: + $counter += 1; + $ctx.state = 27; + break; + case 17: + $ctx.pushTry(15, null); + $ctx.state = 18; + break; + case 18: + throw undefined; + $ctx.state = 20; + break; + case 20: + $ctx.popTry(); + $ctx.state = 22; + break; + case 15: + $ctx.popTry(); + counter = $ctx.storedException; + $ctx.state = 13; + break; + case 13: + counter = $counter; + $ctx.state = 14; + break; + case 14: + $ctx.pushTry(null, 6); + $ctx.state = 8; + break; + case 8: + $ctx.state = 2; + return [ + counter, + list[$traceurRuntime.toProperty(counter)] + ]; + case 2: + $ctx.maybeThrow(); + $ctx.state = 22; + break; + case 6: + $ctx.popTry(); + $ctx.state = 12; + break; + case 12: + $counter = counter; + $ctx.state = 10; + break; + default: + return $ctx.end(); + } + }, $__9, this); + })(); + }, + configurable: true, + enumerable: true, + writable: true + }), $__2; + }; }(window, document, angular, jQuery, OC, oc_requesttoken)); return {}; }(); \ No newline at end of file diff --git a/js/service/FeedResource.js b/js/service/FeedResource.js index 903a58241..579396b9d 100644 --- a/js/service/FeedResource.js +++ b/js/service/FeedResource.js @@ -12,7 +12,7 @@ app.factory('FeedResource', (Resource, $http) => { class FeedResource extends Resource { constructor ($http) { - super('url', $http); + super($http, 'url'); } } diff --git a/js/service/FolderResource.js b/js/service/FolderResource.js index b1c0271dd..314900e37 100644 --- a/js/service/FolderResource.js +++ b/js/service/FolderResource.js @@ -12,7 +12,7 @@ app.factory('FolderResource', (Resource, $http) => { class FolderResource extends Resource { constructor ($http) { - super('name', $http); + super($http, 'name'); } } diff --git a/js/service/ItemResource.js b/js/service/ItemResource.js index 8cb47d527..5750f2c6b 100644 --- a/js/service/ItemResource.js +++ b/js/service/ItemResource.js @@ -13,7 +13,7 @@ app.factory('ItemResource', (Resource, $http) => { class ItemResource extends Resource { constructor ($http) { - super('id', $http); + super($http); } receive (value, channel) { diff --git a/js/service/Resource.js b/js/service/Resource.js index 832b9d791..44a7277b6 100644 --- a/js/service/Resource.js +++ b/js/service/Resource.js @@ -12,17 +12,17 @@ app.factory('Resource', () => { class Resource { - constructor (id, http) { + constructor (http, id='id') { this.id = id; this.values = []; this.hashMap = {}; this.http = http; } - receive (values) { - values.forEach((value) => { - this.add(value); - }); + receive (objs) { + for (let obj of objs) { + this.add(obj); + } } add (obj) { @@ -51,9 +51,9 @@ app.factory('Resource', () => { // find index of object that should be deleted let deleteAtIndex; - for (let i = 0; i < this.values.length; i += 1) { - if (this.values[i][this.id] === id) { - deleteAtIndex = i; + for (let [index, value] of enumerate(this.values)) { + if (value[this.id] === id) { + deleteAtIndex = index; break; } } diff --git a/js/tests/unit/service/ResourceSpec.js b/js/tests/unit/service/ResourceSpec.js index ec0b95ed9..2fead3479 100644 --- a/js/tests/unit/service/ResourceSpec.js +++ b/js/tests/unit/service/ResourceSpec.js @@ -17,7 +17,7 @@ describe('Resource', () => { beforeEach(inject((Resource, $http) => { class ChildResource extends Resource { constructor ($http) { - super('id', $http); + super($http); } } diff --git a/js/utility/iterators.js b/js/utility/iterators.js index e40a07110..b83e5de82 100644 --- a/js/utility/iterators.js +++ b/js/utility/iterators.js @@ -28,4 +28,23 @@ window.items = function (obj) { })(); } }; -} \ No newline at end of file +}; + +/** + * Iterates over a list and returns the item and index + * like: (let [index, value] of list) + * Similar to Pythons enumerate() iterator function + */ +window.enumerate = function (list) { + 'use strict'; + + return { + [Symbol.iterator]: function () { + return (function*() { + for (let counter = 0; counter < list.length; counter += 1) { + yield [counter, list[counter]]; + } + })(); + } + }; +}; \ No newline at end of file -- cgit v1.2.3