%PDF- %PDF-
| Direktori : /home/infra/fusioninventory/lib/lazy.js-0.5.1/site/source/javascripts/ |
| Current File : //home/infra/fusioninventory/lib/lazy.js-0.5.1/site/source/javascripts/comparisons.js |
describe("compared to Underscore, Lo-Dash, etc.", function() {
function inc(x) { return x + 1; }
function dec(x) { return x - 1; }
function square(x) { return x * x; }
function isEven(x) { return x % 2 === 0; }
function identity(x) { return x; }
function arr(from, to) {
return Lazy.range(from, to).toArray();
}
function dupes(min, max, count) {
var numbers = Lazy.generate(function() {
return Math.floor((Math.random() * (max - min)) + min);
});
return numbers.take(count).toArray();
}
function wuTake(arr, count) {
var i = -1;
if (arr instanceof Array) {
arr = wu(arr);
}
return arr.takeWhile(function() { return ++i < count; });
}
function wuDrop(arr, count) {
var i = -1;
if (arr instanceof Array) {
arr = wu(arr);
}
return arr.dropWhile(function() { return ++i < count; });
}
var jaggedArray = [
[1, 2, 3],
[
[4, 5, 6],
[7, 8, 9],
[
[10, 11],
12
],
13,
14,
[15, 16],
17
],
[
18,
19,
20,
[21, 22]
],
[23, 24, 25],
26,
27,
28,
[29, 30],
[
[31, 32, 33],
[34, 35]
],
36
];
// ---------- Common operations ---------- //
compareAlternatives("map", {
lazy: function(arr) { return Lazy(arr).map(square); },
underscore: function(arr) { return _(arr).map(square); },
lodash: function(arr) { return lodash.map(arr, square); },
wu: function(arr) { return wu(arr).map(square); },
sugar: function(arr) { return arr.map(square); },
from: function(arr) { return from(arr).select(square); },
ix: function(arr) { return Ix.Enumerable.fromArray(arr).select(square); },
boiler: function(arr) { return boiler.map(arr, square); },
sloth: function(arr) { return sloth.ify(arr).map(square); }
});
compareAlternatives("filter", {
lazy: function(arr) { return Lazy(arr).filter(isEven); },
underscore: function(arr) { return _(arr).filter(isEven); },
lodash: function(arr) { return lodash.filter(arr, isEven); },
wu: function(arr) { return wu(arr).filter(isEven); },
sugar: function(arr) { return arr.filter(isEven); },
from: function(arr) { return from(arr).where(isEven); },
ix: function(arr) { return Ix.Enumerable.fromArray(arr).where(isEven); },
boiler: function(arr) { return boiler.filter(arr, isEven); },
sloth: function(arr) { return sloth.ify(arr).filter(isEven); }
});
compareAlternatives("flatten", {
lazy: function(arr) { return Lazy(arr).flatten(); },
underscore: function(arr) { return _(arr).flatten(); },
lodash: function(arr) { return lodash.flattenDeep(arr); },
sugar: function(arr) { return arr.flatten(); },
boiler: function(arr) { return boiler.flatten(arr); },
inputs: [[jaggedArray]]
});
compareAlternatives("uniq (mostly duplicates)", {
lazy: function(arr) { return Lazy(arr).uniq(); },
underscore: function(arr) { return _(arr).uniq(); },
lodash: function(arr) { return lodash.uniq(arr); },
sugar: function(arr) { return arr.unique(); },
from: function(arr) { return from(arr).distinct(); },
ix: function(arr) { return Ix.Enumerable.fromArray(arr).distinct(); },
boiler: function(arr) { return boiler.uniq(arr); },
inputs: [[dupes(0, 2, 10)], [dupes(0, 10, 100)]]
});
compareAlternatives("uniq (about half dupes)", {
lazy: function(arr) { return Lazy(arr).uniq(); },
underscore: function(arr) { return _(arr).uniq(); },
lodash: function(arr) { return lodash.uniq(arr); },
sugar: function(arr) { return arr.unique(); },
from: function(arr) { return from(arr).distinct(); },
ix: function(arr) { return Ix.Enumerable.fromArray(arr).distinct(); },
boiler: function(arr) { return boiler.uniq(arr); },
inputs: [[dupes(0, 5, 10)], [dupes(0, 50, 100)]]
});
compareAlternatives("uniq (mostly uniques)", {
lazy: function(arr) { return Lazy(arr).uniq(); },
underscore: function(arr) { return _(arr).uniq(); },
lodash: function(arr) { return lodash.uniq(arr); },
sugar: function(arr) { return arr.unique(); },
from: function(arr) { return from(arr).distinct(); },
ix: function(arr) { return Ix.Enumerable.fromArray(arr).distinct(); },
boiler: function(arr) { return boiler.uniq(arr); },
inputs: [[dupes(0, 10, 10)], [dupes(0, 100, 100)]]
});
compareAlternatives("union", {
lazy: function(arr, other) { return Lazy(arr).union(other); },
underscore: function(arr, other) { return _.union(arr, other); },
lodash: function(arr, other) { return lodash.union(arr, other); },
sugar: function(arr, other) { return arr.union(other); },
from: function(arr, other) { return from(arr).union(other); },
ix: function(arr, other) { return Ix.Enumerable.fromArray(arr).union(Ix.Enumerable.fromArray(other)); },
boiler: function(arr, other) { return boiler.union(arr, other); },
sloth: function(arr, other) { return sloth.ify(arr).union(other); },
inputs: [[arr(0, 10), arr(5, 15)], [arr(0, 100), arr(50, 150)]]
});
compareAlternatives("intersection", {
lazy: function(arr, other) { return Lazy(arr).intersection(other); },
underscore: function(arr, other) { return _.intersection(arr, other); },
lodash: function(arr, other) { return lodash.intersection(arr, other); },
sugar: function(arr, other) { return arr.intersect(other); },
from: function(arr, other) { return from(arr).intersect(other); },
ix: function(arr, other) { return Ix.Enumerable.fromArray(arr).intersect(Ix.Enumerable.fromArray(other)); },
boiler: function(arr, other) { return boiler.intersection(arr, other); },
sloth: function(arr, other) { return sloth.ify(arr).intersect(other); },
inputs: [[arr(0, 10), arr(5, 15)], [arr(0, 100), arr(50, 150)]]
});
compareAlternatives("shuffle", {
lazy: function(arr) { return Lazy(arr).shuffle(); },
underscore: function(arr) { return _(arr).shuffle(); },
lodash: function(arr) { return lodash.shuffle(arr); },
sugar: function(arr) { return arr.randomize(); },
boiler: function(arr) { return boiler.shuffle(arr); },
shouldMatch: false
});
compareAlternatives("zip", {
lazy: function(arr, other) { return Lazy(arr).zip(other); },
underscore: function(arr, other) { return _(arr).zip(other); },
lodash: function(arr, other) { return lodash.zip(arr, other); },
sugar: function(arr, other) { return arr.zip(other); },
boiler: function(arr, other) { return boiler.zip(arr, other); },
inputs: [[arr(0, 10), arr(5, 15)], [arr(0, 100), arr(50, 150)]]
});
// ---------- Chained operations ----------//
compareAlternatives("map -> filter", {
lazy: function(arr) { return Lazy(arr).map(inc).filter(isEven); },
underscore: function(arr) { return _.chain(arr).map(inc).filter(isEven); },
lodash: function(arr) { return lodash(arr).map(inc).filter(isEven); },
wu: function(arr) { return wu(arr).map(inc).filter(isEven); },
sugar: function(arr) { return arr.map(inc).filter(isEven); },
from: function(arr) { return from(arr).select(inc).where(isEven); },
ix: function(arr) { return Ix.Enumerable.fromArray(arr).select(inc).where(isEven); },
boiler: function(arr) { return boiler.chain(arr).map(inc).filter(isEven).end(); },
sloth: function(arr) { return sloth.ify(arr).map(inc).filter(isEven); },
category: "chained",
});
compareAlternatives("flatten -> map", {
lazy: function(arr) { return Lazy(arr).flatten().map(inc); },
underscore: function(arr) { return _.chain(arr).flatten().map(inc); },
lodash: function(arr) { return lodash(arr).flattenDeep().map(inc); },
sugar: function(arr) { return arr.flatten().map(inc); },
boiler: function(arr) { return boiler.chain(arr).flatten().map(inc).end(); },
category: "chained",
inputs: [[jaggedArray]]
});
compareAlternatives("map -> uniq", {
lazy: function(arr) { return Lazy(arr).map(inc).uniq(); },
underscore: function(arr) { return _.chain(arr).map(inc).uniq(); },
lodash: function(arr) { return lodash(arr).map(inc).uniq(); },
sugar: function(arr) { return arr.map(inc).unique(); },
from: function(arr) { return from(arr).select(inc).distinct(); },
ix: function(arr) { return Ix.Enumerable.fromArray(arr).select(inc).distinct(); },
boiler: function(arr) { return boiler.chain(arr).map(inc).uniq().end(); },
category: "chained",
inputs: [[dupes(0, 5, 10)], [dupes(0, 50, 100)]]
});
compareAlternatives("map -> union", {
lazy: function(arr, other) { return Lazy(arr).map(inc).union(other); },
underscore: function(arr, other) { return _.chain(arr).map(inc).union(other); },
lodash: function(arr, other) { return lodash(arr).map(inc).union(other); },
sugar: function(arr, other) { return arr.map(inc).union(other); },
from: function(arr, other) { return from(arr).select(inc).union(other); },
ix: function(arr, other) { return Ix.Enumerable.fromArray(arr).select(inc).union(Ix.Enumerable.fromArray(other)); },
boiler: function(arr, other) { return boiler.chain(arr).map(inc).union(other).end(); },
sloth: function(arr, other) { return sloth.ify(arr).map(inc).union(other); },
category: "chained",
inputs: [[arr(0, 10), arr(5, 15)], [arr(0, 100), arr(50, 150)]]
});
compareAlternatives("map -> intersection", {
lazy: function(arr, other) { return Lazy(arr).map(inc).intersection(other); },
underscore: function(arr, other) { return _.chain(arr).map(inc).intersection(other); },
lodash: function(arr, other) { return lodash(arr).map(inc).intersection(other); },
sugar: function(arr, other) { return arr.map(inc).intersect(other); },
from: function(arr, other) { return from(arr).select(inc).intersect(other); },
ix: function(arr, other) { return Ix.Enumerable.fromArray(arr).select(inc).intersect(Ix.Enumerable.fromArray(other)); },
boiler: function(arr, other) { return boiler.chain(arr).map(inc).intersection(other); },
sloth: function(arr, other) { return sloth.ify(arr).map(inc).intersect(other); },
category: "chained",
inputs: [[arr(0, 10), arr(5, 15)], [arr(0, 100), arr(50, 150)]]
});
compareAlternatives("map -> shuffle", {
lazy: function(arr) { return Lazy(arr).map(inc).shuffle(); },
underscore: function(arr) { return _.chain(arr).map(inc).shuffle(); },
lodash: function(arr) { return lodash(arr).map(inc).shuffle(); },
sugar: function(arr) { return arr.map(inc).randomize(); },
boiler: function(arr) { return boiler.chain(arr).map(inc).shuffle(); },
category: "chained",
shouldMatch: false
});
compareAlternatives("map -> zip", {
lazy: function(arr, other) { return Lazy(arr).map(inc).zip(other); },
underscore: function(arr, other) { return _.chain(arr).map(inc).zip(other); },
lodash: function(arr, other) { return lodash(arr).map(inc).zip(other); },
sugar: function(arr, other) { return arr.map(inc).zip(other); },
boiler: function(arr, other) { return boiler.chain(arr).map(inc).zip(other); },
category: "chained",
inputs: [[arr(0, 10), arr(5, 15)], [arr(0, 100), arr(50, 150)]]
});
// ---------- Short-circuited operations ---------- //
compareAlternatives("map -> indexOf", {
lazy: function(arr, value) { return Lazy(arr).map(inc).indexOf(value); },
underscore: function(arr, value) { return _.chain(arr).map(inc).indexOf(value); },
lodash: function(arr, value) { return lodash(arr).map(inc).indexOf(value); },
sugar: function(arr, value) { return arr.map(inc).indexOf(value); },
boiler: function(arr, value) { return boiler.chain(arr).map(inc).indexOf(value); },
category: "shorted",
inputs: [[arr(0, 10), 4], [arr(0, 100), 35]],
valueOnly: true
});
compareAlternatives("map -> sortedIndex", {
lazy: function(arr) { return Lazy(arr).map(inc).sortedIndex(arr[arr.length / 2]); },
underscore: function(arr) { return _.chain(arr).map(inc).sortedIndex(arr[arr.length / 2]); },
lodash: function(arr) { return lodash(arr).map(inc).sortedIndex(arr[arr.length / 2]); },
category: "shorted",
inputs: [[arr(0, 10), 4], [arr(0, 100), 35]],
valueOnly: true
});
compareAlternatives("map -> take", {
lazy: function(arr) { return Lazy(arr).map(inc).take(5); },
underscore: function(arr) { return _.chain(arr).map(inc).take(5); },
lodash: function(arr) { return lodash(arr).map(inc).take(5); },
sugar: function(arr) { return arr.map(inc).first(5); },
from: function(arr) { return from(arr).select(inc).take(5); },
ix: function(arr) { return Ix.Enumerable.fromArray(arr).select(inc).take(5); },
boiler: function(arr) { return boiler.chain(arr).map(inc).first(5).end(); },
sloth: function(arr) { return sloth.ify(arr).map(inc).take(5); },
category: "shorted"
});
compareAlternatives("filter -> take", {
lazy: function(arr) { return Lazy(arr).filter(isEven).take(5); },
underscore: function(arr) { return _.chain(arr).filter(isEven).first(5); },
lodash: function(arr) { return lodash(arr).filter(isEven).take(5); },
sugar: function(arr) { return arr.filter(isEven).first(5); },
from: function(arr) { return from(arr).where(isEven).take(5); },
ix: function(arr) { return Ix.Enumerable.fromArray(arr).where(isEven).take(5); },
boiler: function(arr) { return boiler.chain(arr).filter(isEven).first(5).end(); },
sloth: function(arr) { return sloth.ify(arr).filter(isEven).take(5); },
category: "shorted",
});
compareAlternatives("map -> filter -> take", {
lazy: function(arr) { return Lazy(arr).map(inc).filter(isEven).take(5); },
underscore: function(arr) { return _.chain(arr).map(inc).filter(isEven).take(5); },
lodash: function(arr) { return lodash(arr).map(inc).filter(isEven).take(5); },
wu: function(arr) { return wuTake(wu(arr).map(inc).filter(isEven), 5); },
sugar: function(arr) { return arr.map(inc).filter(isEven).first(5); },
from: function(arr) { return from(arr).select(inc).where(isEven).take(5); },
ix: function(arr) { return Ix.Enumerable.fromArray(arr).select(inc).where(isEven).take(5); },
boiler: function(arr) { return boiler.chain(arr).map(inc).filter(isEven).first(5).end(); },
sloth: function(arr) { return sloth.ify(arr).map(inc).filter(isEven).take(5); },
category: "shorted",
});
compareAlternatives("map -> drop -> take", {
lazy: function(arr) { return Lazy(arr).map(inc).drop(5).take(5); },
underscore: function(arr) { return _.chain(arr).map(inc).rest(5).take(5); },
lodash: function(arr) { return lodash(arr).map(inc).drop(5).take(5); },
wu: function(arr) { return wuTake(wuDrop(wu(arr).map(inc), 5), 5); },
sugar: function(arr) { return arr.map(inc).last(arr.length - 5).first(5); },
from: function(arr) { return from(arr).select(inc).skip(5).take(5); },
ix: function(arr) { return Ix.Enumerable.fromArray(arr).select(inc).skip(5).take(5); },
boiler: function(arr) { return boiler.chain(arr).map(inc).rest(5).first(5).end(); },
sloth: function(arr) { return sloth.ify(arr).map(inc).drop(5).take(5); },
category: "shorted",
});
compareAlternatives("filter -> drop -> take", {
lazy: function(arr) { return Lazy(arr).filter(isEven).drop(5).take(5); },
underscore: function(arr) { return _.chain(arr).filter(isEven).rest(5).first(5); },
lodash: function(arr) { return lodash(arr).filter(isEven).drop(5).take(5); },
from: function(arr) { return from(arr).where(isEven).skip(5).take(5); },
ix: function(arr) { return Ix.Enumerable.fromArray(arr).where(isEven).skip(5).take(5); },
boiler: function(arr) { return boiler.chain(arr).filter(isEven).rest(5).first(5).end(); },
sloth: function(arr) { return sloth.ify(arr).filter(isEven).drop(5).take(5); },
category: "shorted",
});
compareAlternatives("flatten -> take", {
lazy: function(arr) { return Lazy(arr).flatten().take(5); },
underscore: function(arr) { return _.chain(arr).flatten().first(5); },
lodash: function(arr) { return lodash(arr).flattenDeep().take(5); },
sugar: function(arr) { return arr.flatten().first(5); },
boiler: function(arr) { return boiler.chain(arr).flatten().first(5).end(); },
category: "shorted",
inputs: [[jaggedArray]]
});
compareAlternatives("uniq -> take", {
lazy: function(arr) { return Lazy(arr).uniq().take(5); },
underscore: function(arr) { return _.chain(arr).uniq().first(5); },
lodash: function(arr) { return lodash(arr).uniq().take(5); },
sugar: function(arr) { return arr.unique().first(5); },
from: function(arr) { return from(arr).distinct().take(5); },
ix: function(arr) { return Ix.Enumerable.fromArray(arr).distinct().take(5); },
boiler: function(arr) { return boiler.chain(arr).uniq().first(5).end(); },
category: "shorted",
inputs: [[dupes(0, 5, 10)], [dupes(0, 10, 100)]]
});
compareAlternatives("union -> take", {
lazy: function(arr, other) { return Lazy(arr).union(other).take(5); },
underscore: function(arr, other) { return _.chain(arr).union(other).first(5); },
lodash: function(arr, other) { return lodash(arr).union(other).take(5); },
sugar: function(arr, other) { return arr.union(other).first(5); },
from: function(arr, other) { return from(arr).union(other).take(5); },
ix: function(arr, other) { return Ix.Enumerable.fromArray(arr).union(other).take(5); },
boiler: function(arr, other) { return boiler.chain(arr).union(other).first(5).end(); },
sloth: function(arr, other) { return sloth.ify(arr).union(other).take(5); },
category: "shorted",
inputs: [[arr(0, 10), arr(5, 15)], [arr(0, 100), arr(50, 150)]]
});
compareAlternatives("intersection -> take", {
lazy: function(arr, other) { return Lazy(arr).intersection(other).take(5); },
underscore: function(arr, other) { return _.chain(arr).intersection(other).first(5); },
lodash: function(arr, other) { return lodash(arr).intersection(other).take(5); },
sugar: function(arr, other) { return arr.intersect(other).first(5); },
from: function(arr, other) { return from(arr).intersect(other).take(5); },
ix: function(arr, other) { return Ix.Enumerable.fromArray(arr).intersect(Ix.Enumerable.fromArray(other)).take(5); },
boiler: function(arr, other) { return boiler.chain(arr).intersection(other).first(5).end(); },
sloth: function(arr, other) { return sloth.ify(arr).intersect(other).take(5); },
category: "shorted",
inputs: [[arr(0, 10), arr(5, 15)], [arr(0, 100), arr(50, 150)]]
});
compareAlternatives("without -> take", {
lazy: function(arr, other) { return Lazy(arr).without(other).take(5); },
underscore: function(arr, other) { return _.chain(arr).difference(other).first(5); },
lodash: function(arr, other) { return lodash(arr).difference(other).take(5); },
sugar: function(arr, other) { return arr.subtract(other).first(5); },
category: "shorted",
inputs: [[arr(0, 10), arr(3, 7)], [arr(0, 100), arr(25, 75)]]
});
compareAlternatives("shuffle -> take", {
lazy: function(arr) { return Lazy(arr).shuffle().take(5); },
underscore: function(arr) { return _.chain(arr).shuffle().first(5); },
lodash: function(arr) { return lodash(arr).shuffle().take(5); },
sugar: function(arr) { return arr.randomize().first(5); },
boiler: function(arr) { return boiler.chain(arr).shuffle().first(5).end(); },
category: "shorted",
shouldMatch: false
});
compareAlternatives("zip -> take", {
lazy: function(arr, other) { return Lazy(arr).zip(other).take(5); },
underscore: function(arr, other) { return _.chain(arr).zip(other).first(5); },
lodash: function(arr, other) { return lodash(arr).zip(other).take(5); },
sugar: function(arr, other) { return arr.zip(other).first(5); },
boiler: function(arr, other) { return boiler.chain(arr).zip(other).first(5).end(); },
category: "shorted",
inputs: [[arr(0, 10), arr(5, 15)], [arr(0, 100), arr(50, 150)]]
});
compareAlternatives("map -> any", {
lazy: function(arr) { return Lazy(arr).map(inc).any(isEven); },
underscore: function(arr) { return _.chain(arr).map(inc).any(isEven); },
lodash: function(arr) { return lodash(arr).map(inc).some(isEven); },
sugar: function(arr) { return arr.map(inc).any(isEven); },
from: function(arr) { return from(arr).select(inc).any(isEven); },
ix: function(arr) { return Ix.Enumerable.fromArray(arr).select(inc).any(isEven); },
boiler: function(arr) { return boiler.chain(arr).map(inc).any(isEven); },
sloth: function(arr, other) { return sloth.ify(arr).map(inc).any(isEven); },
category: "shorted",
valueOnly: true
});
compareAlternatives("map -> all", {
lazy: function(arr) { return Lazy(arr).map(inc).all(isEven); },
underscore: function(arr) { return _.chain(arr).map(inc).every(isEven); },
lodash: function(arr) { return lodash(arr).map(inc).every(isEven); },
sugar: function(arr) { return arr.map(inc).all(isEven); },
from: function(arr) { return from(arr).select(inc).all(isEven); },
ix: function(arr) { return Ix.Enumerable.fromArray(arr).select(inc).all(isEven); },
boiler: function(arr) { return boiler.chain(arr).map(inc).all(isEven); },
sloth: function(arr, other) { return sloth.ify(arr).map(inc).all(isEven); },
category: "shorted",
valueOnly: true
});
// These aren't really comparisons to Underscore or Lo-Dash; rather, they're
// comparisons to the native Array.join, String.split, and String.match
// methods. But designating them as such at the UI level will require some
// refactoring. For now, I think it's fine to put them here.
compareAlternatives("map -> join", {
lazy: function(arr) { return Lazy(arr).map(inc).join(", "); },
underscore: function(arr) { return _(arr).map(inc).join(", "); },
category: "other",
valueOnly: true
});
compareAlternatives("split(string) -> take", {
lazy: function(str, delimiter) { return Lazy(str).split(delimiter).take(5); },
underscore: function(str, delimiter) { return _(str.split(delimiter)).take(5); },
category: "other",
inputs: [[Lazy.range(100).join(", "), ", "]]
});
compareAlternatives("split(regex) -> take", {
lazy: function(str, delimiter) { return Lazy(str).split(delimiter).take(5); },
underscore: function(str, delimiter) { return _(str.split(delimiter)).take(5); },
category: "other",
inputs: [[Lazy.range(100).join(", "), /,\s*/]]
});
compareAlternatives("match(regex) -> take", {
lazy: function(str, pattern) { return Lazy(str).match(pattern).take(5); },
underscore: function(str, pattern) { return _(str.match(pattern)).take(5); },
category: "other",
inputs: [[Lazy.range(100).join(" "), /\d+/g]]
});
});