Skip to content

Instantly share code, notes, and snippets.

@jhusain
Created November 20, 2014 23:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jhusain/635312d21cb8faff082d to your computer and use it in GitHub Desktop.
Save jhusain/635312d21cb8faff082d to your computer and use it in GitHub Desktop.
Iterable and Observable are dual
interface Iterable {
Generator @@iterator(Generator);
}
interface Observable {
Generator observer(Generator);
}
Array.prototype[@@observer] = function(generator) {
var decoratedGenerator = Object.create(generator),
done = false;
["throw","return"].forEach(method => {
decoratedGenerator[method] = v => {
var superMethod = generator[method];
done = true;
if (superMethod) {
return superMethod.call(generator, v);
}
}
});
for(let x of this) {
decoratedGenerator.next(x)
if (done) {
break;
}
}
if (!done) {
decoratedGenerator.return();
}
return decoratedGenerator;
}
[1,2,3][@@observer]({
next: function(value) {
console.log(value);
if (value ===2 ) {
this.return();
}
}
})
for(let x of [1,2,3]) {
console.log(value);
if (x == 2) {
break;
}
}
async function test() {
for(let x on [1,2,3]) {
console.log(value);
if (x === 2) {
break;
}
}
}
document.addEventListener("mousemove", function next(e) {
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment