• Jump To … +
    Either.js List.js Maybe.js Set.js Stream.js Thunk.js Tuple.js boolean.js char.js base.js extra.js fold.js map.js zipWith.js collection.js control.js curried.js eq.js floating.js fractional.js function.js integral.js match.js num.js numeric.js object.js ord.js realfrac.js register.js string.js type.js nodash.js
  • ord.js

  • ¶
    /* vim: set et sw=2 ts=2: */
    'use strict';
    
    module.exports = function () {
    
      var Nodash = this;
      
      function compare(a, b) {
        switch (typeof a) {
        case 'string':
          return a.localeCompare(b);
        case 'object':
          if (Nodash.isFunction(a.compareTo)) {
            return a.compareTo(b);
          } else if (Nodash.isArray(a)) {
            for (var i = 0; i < Math.min(a.length, b.length); i++) {
              var r = Nodash.compare(a[i], b[i]);
              if (r !== 0) {
                  return r;
              }
            }
            return 0;
          }
          return a.toString().localeCompare(b.toString());
        case 'number':
          return Nodash.signum(a - b);
        }
        return undefined;
      }
    
      return {
        
        compare: compare,
    
        '< lt LT': function (a, b) {
          return compare(a, b) < 0;
        },
        
        '> gt GT': function (a, b) {
          return compare(a, b) > 0;
        },
    
        '<= lte LTE': function (a, b) {
          return compare(a, b) <= 0;
        },
    
        '>= gte GTE': function (a, b) {
          return compare(a, b) >= 0;
        },
    
        max: function (a, b) {
          return compare(a, b) > 0 ? a : b;
        },
    
        min: function (a, b) {
          return compare(a, b) < 0 ? a : b;
        },
    
        comparing: function (f, a, b) {
          return compare(f(a), f(b));
        }
      };
    };