Source: https://www.promisejs.org/generators/
// Example usage var login = async(function* (username, password, session) { var user = yield getUser(username); var hash = yield crypto.hashAsync(password + user.salt); if (user.hash !== hash) { throw new Error('Incorrect password'); } session.setUser(user); }); // async implementation function async(makeGenerator){ return function () { var generator = makeGenerator.apply(this, arguments); function handle(result){ // result => { done: [Boolean], value: [Object] } if (result.done) return Promise.resolve(result.value); return Promise.resolve(result.value).then(function (res){ return handle(generator.next(res)); }, function (err){ return handle(generator.throw(err)); }); } try { return handle(generator.next()); } catch (ex) { return Promise.reject(ex); } } }
// Convert array to generator function* iterator(iterable) { for(const item of iterable) yield item; } // Convert generator (iterator) to array Array.from(iterator([1,2,3]));
Lazy evaluation
Source: https://codepen.io/jasonmcaffee/pen/ZEpeQBq?editors=0010
(_ => { async function main(){ const l = lazy([1, 2, 3, 5, 6, 7, 8]) .filter(x => x % 2 === 0) .map(x => x * x) .filter(x => x === 4) .map(x => x + 1) .take(1); for(let x of l){ console.log(`x: `, x); } } function* take(iter, count){ for (const x of iter){ if(count-- <= 0){ return; } yield x; } } function* map(iter, func){ for (const x of iter){ console.log(`map called`); yield func(x); } } function* filter(iter, filterFunc){ for (const x of iter){ if(filterFunc(x)){ console.log(`filter called`); yield x; } } } function* allOf(iter){ for(let x of iter){ yield x; } } function lazy(arr){ const api = { previousGenerator: allOf(arr), map(mapFunc){ this.previousGenerator = map(this.previousGenerator, mapFunc); return this; }, filter(filterFunc){ this.previousGenerator = filter(this.previousGenerator, filterFunc); return this; }, take(count){ this.previousGenerator = take(this.previousGenerator, count); return this; }, collect(){ return [...this.previousGenerator]; }, [Symbol.iterator]() { return this.previousGenerator; }, }; return api; } main(); })();
163100cookie-checkES6 async/generators