Skip to content

Instantly share code, notes, and snippets.

@gitgrimbo
Last active August 29, 2015 14:26
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 gitgrimbo/03d02a094f5b7cc4f594 to your computer and use it in GitHub Desktop.
Save gitgrimbo/03d02a094f5b7cc4f594 to your computer and use it in GitHub Desktop.
JS streams
function intStream(from, to) {
var i = from;
var unbounded = ("number" !== typeof to);
return {
hasNext: function() { return unbounded ? true : (i < to); },
next: function() { if (!this.hasNext()) throw "Stream Finished"; return i++; },
toString: function() {
return "Int Stream: from " + from + ", " + (unbounded ? "unbounded" : "to " + to);
}
};
}
function mapStream(stream, mapper, mapperDesc) {
return {
hasNext: function() { return stream.hasNext(); },
next: function() { return mapper(stream.next()); },
toString: function() {
return "Mapped Stream: from <" + stream + "> using " + (mapperDesc ? mapperDesc : "unknown");
}
};
}
function addStreams() {
var streams = Array.prototype.slice.apply(arguments);
var i = 0;
return {
hasNext: function() {
if (!streams) return false;
var s = streams[i];
var hasNext = s.hasNext();
if (hasNext) return true;
while (++i < streams.length) {
s = streams[i];
if (s.hasNext()) return true;
}
streams = null;
return false;
},
next: function() {
if (!this.hasNext()) throw "Stream Finished";
return streams[i].next();
},
toString: function() {
function mapStreamToStr(s, i) {
return "[" + i + ":" + s + "]";
}
var streamsStr = streams ? streams.map(mapStreamToStr).join(", ") : "unknown streams";
return "Composite Stream: " + streamsStr;
}
};
}
function streamToArray(stream, limit) {
var arr = [];
if ("number" === typeof limit) {
var i = 0;
while ((i < limit) && stream.hasNext()) {
arr.push(stream.next());
i++;
}
} else {
while (stream.hasNext()) {
arr.push(stream.next());
}
}
return arr;
}
function arrayStream(arr) {
var i = 0;
var len = arr ? arr.length : 0;
return {
hasNext: function() {
if (!arr) return false;
var hasNext = (i < arr.length);
if (hasNext) return true;
arr = null;
return false;
},
next: function() {
if (!this.hasNext()) throw "Stream Finished";
var _i = i;
i++;
return arr[_i];
},
toString: function() {
return "Array Stream: length " + len;
}
};
}
var lower = mapStream(intStream(65, 65+26), String.fromCharCode, "fromCharCode");
var upper = mapStream(intStream(97, 97+26), String.fromCharCode, "fromCharCode");
var symbols = arrayStream(['!', '"', '£', '$', '%', '^', '&', '*', '(', ')', '-', '=']);
var stream = addStreams(lower, upper, symbols);
stream = mapStream(stream, function(it) { return "(" + it + ")"; }, "Surround with parens");
console.log(stream);
console.log("stream.toString()", ""+stream);
console.log(streamToArray(stream).join(" - "));
console.log(streamToArray(intStream(0), 100).join(" - "));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment