art-standard-lib
Version:
The Standard Library for JavaScript that aught to be.
299 lines (254 loc) • 8.92 kB
JavaScript
// Generated by CoffeeScript 1.12.7
(function() {
"use strict";
var ArrayCompactFlatten, isArray,
slice = [].slice;
isArray = require('./Types').isArray;
module.exports = ArrayCompactFlatten = (function() {
var compact, compactFlattenIfNeeded, compactFlattenIfNeededFast, compactFlattenIfNeededFastCustom, deepArrayEach, deepArrayEachFast, doFlattenInternal, doFlattenInternalFast, doFlattenInternalFastCustom, flatten, isArrayOrArguments, keepAll, keepUnlessNullOrUndefined, needsFlatteningOrCompacting, needsFlatteningOrCompactingFast, needsFlatteningOrCompactingFastCustom;
function ArrayCompactFlatten() {}
ArrayCompactFlatten.isArrayOrArguments = isArrayOrArguments = function(o) {
return isArray(o) || (typeof (o != null ? o.length : void 0) === "number" && o.toString() === '[object Arguments]' ? (console.error("DEPRICATED compactFlatten* no longer supports Arguments objects"), true) : false);
};
ArrayCompactFlatten.needsFlatteningOrCompacting = function(array, keepTester) {
console.warn("DEPRICATED - needsFlatteningOrCompacting");
return needsFlatteningOrCompacting(array, keepTester);
};
ArrayCompactFlatten.keepUnlessNullOrUndefined = function(a) {
console.warn("DEPRICATED: keepUnlessNullOrUndefined");
return a != null;
};
needsFlatteningOrCompacting = function(array, keepTester) {
var a, i, len;
for (i = 0, len = array.length; i < len; i++) {
a = array[i];
if (isArrayOrArguments(a) || !keepTester(a)) {
return true;
}
}
return false;
};
keepAll = function() {
return true;
};
keepUnlessNullOrUndefined = function(a) {
return a != null;
};
/*
IN:
array: array or arguments-object
keepTester: (value) -> true/false
OUT: return true if that element should be in the output
OUT: array where all elements test true to keepTester
NOTE: NOT recursive - just does a shallow pass
*/
ArrayCompactFlatten.compact = compact = function(array, keepTester) {
var a, i, j, len, len1;
if (keepTester) {
for (i = 0, len = array.length; i < len; i++) {
a = array[i];
if (!keepTester(a)) {
return (function() {
var j, len1, results;
results = [];
for (j = 0, len1 = array.length; j < len1; j++) {
a = array[j];
if (keepTester(a)) {
results.push(a);
}
}
return results;
})();
}
}
} else {
for (j = 0, len1 = array.length; j < len1; j++) {
a = array[j];
if (a == null) {
return (function() {
var k, len2, results;
results = [];
for (k = 0, len2 = array.length; k < len2; k++) {
a = array[k];
if (a != null) {
results.push(a);
}
}
return results;
})();
}
}
}
return array;
};
/*
IN: accepts any number of arguments
NOTE: RECURSIVE: recurses into all arry or arguments-objects and adds their contents
to the top level (flatten)
*/
ArrayCompactFlatten.flatten = flatten = function() {
var args;
args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
return compactFlattenIfNeeded(args.length === 1 ? args[0] : args, keepAll);
};
/*
IN:
array: array or arguments-object
keepTester: (value) -> true/false
OUT: return true if that element should be in the output
OUT: array where all elements test true to keepTester
NOTE: RECURSIVE: recurses into all arry or arguments-objects and adds their contents
to the top level (flatten)
*/
ArrayCompactFlatten.compactFlatten = function(array, keepTester) {
if (keepTester) {
throw new Error("DEPRICATED ArtStandardLib.ArrayCompactFlatten.compactFlatten: keepTester param; use customCompactFlatten");
}
return compactFlattenIfNeeded(array, keepUnlessNullOrUndefined);
};
ArrayCompactFlatten.customCompactFlatten = function(array, customKeepTester) {
return compactFlattenIfNeeded(array, customKeepTester);
};
ArrayCompactFlatten.compactFlattenAll = function() {
var all;
all = 1 <= arguments.length ? slice.call(arguments, 0) : [];
return compactFlattenIfNeededFast(all);
};
ArrayCompactFlatten.compactFlattenFast = function(array) {
return compactFlattenIfNeededFast(array);
};
ArrayCompactFlatten.compactFlattenIntoFast = function(into, array) {
return doFlattenInternalFast(array, into);
};
ArrayCompactFlatten.customCompactFlattenFast = function(array, customKeepTester) {
return compactFlattenIfNeededFastCustom(array, customKeepTester);
};
ArrayCompactFlatten.customCompactFlattenIntoFast = function(into, array, customKeepTester) {
return doFlattenInternalFastCustom(array, into, customKeepTester);
};
ArrayCompactFlatten.compactFlattenAllFast = function() {
var all;
all = 1 <= arguments.length ? slice.call(arguments, 0) : [];
return compactFlattenIfNeededFast(all);
};
ArrayCompactFlatten.deepArrayEachFast = deepArrayEachFast = function(array, f) {
var el, i, len;
for (i = 0, len = array.length; i < len; i++) {
el = array[i];
if (isArray(el)) {
deepArrayEachFast(el, f);
} else {
f(el);
}
}
return array;
};
/*
IN: array: any object that has a length
EFFECT:
itterates over array and recurse over any element which isArrayOrArguments
invokes f on every element that is not isArrayOrArguments
OUT: array (same as passed in)
*/
ArrayCompactFlatten.deepArrayEach = deepArrayEach = function(array, f) {
var el, i, len;
for (i = 0, len = array.length; i < len; i++) {
el = array[i];
if (isArrayOrArguments(el)) {
deepArrayEach(el, f);
} else {
f(el);
}
}
return array;
};
doFlattenInternal = function(array, output, keepTester) {
var el, i, len;
for (i = 0, len = array.length; i < len; i++) {
el = array[i];
if (isArrayOrArguments(el)) {
doFlattenInternal(el, output, keepTester);
} else {
if (keepTester(el)) {
output.push(el);
}
}
}
return output;
};
compactFlattenIfNeeded = function(array, keepTester) {
switch (false) {
case !(array == null):
return array;
case !!isArrayOrArguments(array):
return [array];
case !(needsFlatteningOrCompacting(array, keepTester) || !isArray(array)):
return doFlattenInternal(array, [], keepTester);
default:
return array;
}
};
doFlattenInternalFast = function(array, output) {
var el, i, len;
for (i = 0, len = array.length; i < len; i++) {
el = array[i];
if (isArray(el)) {
doFlattenInternalFast(el, output);
} else if (el != null) {
output.push(el);
}
}
return output;
};
needsFlatteningOrCompactingFast = function(array) {
var el, i, len;
for (i = 0, len = array.length; i < len; i++) {
el = array[i];
if ((el == null) || isArray(el)) {
return true;
}
}
return false;
};
compactFlattenIfNeededFast = function(array) {
if (needsFlatteningOrCompactingFast(array)) {
return doFlattenInternalFast(array, []);
} else {
return array;
}
};
doFlattenInternalFastCustom = function(array, output, keepTester) {
var el, i, len;
for (i = 0, len = array.length; i < len; i++) {
el = array[i];
if (isArray(el)) {
doFlattenInternalFastCustom(el, output, keepTester);
} else {
if (keepTester(el)) {
output.push(el);
}
}
}
return output;
};
needsFlatteningOrCompactingFastCustom = function(array, keepTester) {
var a, i, len;
for (i = 0, len = array.length; i < len; i++) {
a = array[i];
if (isArray(a) || !keepTester(a)) {
return true;
}
}
return false;
};
compactFlattenIfNeededFastCustom = function(array, keepTester) {
if (needsFlatteningOrCompactingFastCustom(array, keepTester)) {
return doFlattenInternalFastCustom(array, [], keepTester);
} else {
return array;
}
};
return ArrayCompactFlatten;
})();
}).call(this);
//# sourceMappingURL=ArrayCompactFlatten.js.map