michael@0: // The iteratee of yield* can be a proxy. michael@0: michael@0: function results(results) { michael@0: var i = 0; michael@0: function iterator() { michael@0: return this; michael@0: } michael@0: function next() { michael@0: return results[i++]; michael@0: } michael@0: var ret = { next: next } michael@0: ret[std_iterator] = iterator; michael@0: return ret; michael@0: } michael@0: michael@0: function* yield_results(expected) { michael@0: return yield* Proxy(results(expected), {}); michael@0: } michael@0: michael@0: function collect_results(iter) { michael@0: var ret = []; michael@0: var result; michael@0: do { michael@0: result = iter.next(); michael@0: ret.push(result); michael@0: } while (!result.done); michael@0: return ret; michael@0: } michael@0: michael@0: // We have to put a full result for the end, because the return will re-box. michael@0: var expected = [{value: 1}, 13, "foo", {value: 34, done: true}]; michael@0: michael@0: // Sanity check. michael@0: assertDeepEq(expected, collect_results(results(expected))); michael@0: assertDeepEq(expected, collect_results(yield_results(expected))); michael@0: michael@0: if (typeof reportCompare == "function") michael@0: reportCompare(true, true);