Created
December 24, 2014 12:19
-
-
Save nbdd0121/11158010032648c32e6f to your computer and use it in GitHub Desktop.
Stream (like that of Java 8) for ES.next
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Stream { | |
constructor(content) { | |
this._content = content; | |
} | |
static from(arr) { | |
if (!arr[Symbol.iterator]) { | |
arr = Array.from(arr); | |
} | |
return new ArrayStream(arr); | |
} | |
filter(callback) { | |
return new FilterStream(this, callback); | |
} | |
map(callback) { | |
return new MapStream(this, callback); | |
} | |
flatMap(callback) { | |
return new FlatMapStream(this, callback); | |
} | |
forEach(callback) { | |
for (var item of this) { | |
callback(item); | |
} | |
} | |
toArray() { | |
return Array.from(this); | |
} | |
} | |
class ArrayStream extends Stream { | |
constructor(content) { | |
super(content); | |
} | |
*[Symbol.iterator]() { | |
yield * this._content; | |
} | |
} | |
class FilterStream extends Stream { | |
constructor(stream, callback) { | |
super(stream); | |
this._callback = callback; | |
} | |
*[Symbol.iterator]() { | |
for (var entry of this._content) { | |
if (this._callback(entry)) { | |
yield entry; | |
} | |
} | |
} | |
} | |
class MapStream extends Stream { | |
constructor(stream, callback) { | |
super(stream); | |
this._callback = callback; | |
} | |
*[Symbol.iterator]() { | |
for (var entry of this._content) { | |
yield this._callback(entry); | |
} | |
} | |
} | |
class FlatMapStream extends Stream { | |
constructor(stream, callback) { | |
super(stream); | |
this._callback = callback; | |
} | |
*[Symbol.iterator]() { | |
for (var entry of this._content) { | |
yield * this._callback(entry); | |
} | |
} | |
} | |
Object.defineProperty(Array.prototype, "stream", { | |
value: function() { | |
return Stream.from(this); | |
} | |
}); | |
export default Stream; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment