summaryrefslogtreecommitdiff
path: root/node_modules/thenby/thenBy.module.js
diff options
context:
space:
mode:
authorPhilipp Tanlak <philipp.tanlak@gmail.com>2025-11-24 20:54:57 +0100
committerPhilipp Tanlak <philipp.tanlak@gmail.com>2025-11-24 20:57:48 +0100
commitb1e2c8fd5cb5dfa46bc440a12eafaf56cd844b1c (patch)
tree49d360fd6cbc6a2754efe93524ac47ff0fbe0f7d /node_modules/thenby/thenBy.module.js
Docs
Diffstat (limited to 'node_modules/thenby/thenBy.module.js')
-rw-r--r--node_modules/thenby/thenBy.module.js60
1 files changed, 60 insertions, 0 deletions
diff --git a/node_modules/thenby/thenBy.module.js b/node_modules/thenby/thenBy.module.js
new file mode 100644
index 0000000..bd1dccb
--- /dev/null
+++ b/node_modules/thenby/thenBy.module.js
@@ -0,0 +1,60 @@
+/***
+ Copyright 2013 Teun Duynstee
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+module.exports = (function() {
+
+ function identity(v){return v;}
+
+ function ignoreCase(v){return typeof(v)==="string" ? v.toLowerCase() : v;}
+
+ function makeCompareFunction(f, opt){
+ opt = typeof(opt)==="object" ? opt : {direction:opt};
+
+ if(typeof(f)!="function"){
+ var prop = f;
+ // make unary function
+ f = function(v1){return !!v1[prop] ? v1[prop] : "";}
+ }
+ if(f.length === 1) {
+ // f is a unary function mapping a single item to its sort score
+ var uf = f;
+ var preprocess = opt.ignoreCase?ignoreCase:identity;
+ var cmp = opt.cmp || function(v1,v2) {return v1 < v2 ? -1 : v1 > v2 ? 1 : 0;}
+ f = function(v1,v2) {return cmp(preprocess(uf(v1)), preprocess(uf(v2)));}
+ }
+ const descTokens = {"-1":'', desc:''};
+ if(opt.direction in descTokens) return function(v1,v2){return -f(v1,v2)};
+ return f;
+ }
+
+ /* adds a secondary compare function to the target function (`this` context)
+ which is applied in case the first one returns 0 (equal)
+ returns a new compare function, which has a `thenBy` method as well */
+ function tb(func, opt) {
+ /* should get value false for the first call. This can be done by calling the
+ exported function, or the firstBy property on it (for es6 module compatibility)
+ */
+ var x = (typeof(this) == "function" && !this.firstBy) ? this : false;
+ var y = makeCompareFunction(func, opt);
+ var f = x ? function(a, b) {
+ return x(a,b) || y(a,b);
+ }
+ : y;
+ f.thenBy = tb;
+ return f;
+ }
+ tb.firstBy = tb;
+ return tb;
+})();