docs: function show(x) {
      if (seen.indexOf (x) >= 0) return '<Circular>';
  
      switch (Object.prototype.toString.call (x)) {
  
        case '[object Boolean]':
          return typeof x === 'object' ?
            'new Boolean (' + show (x.valueOf ()) + ')' :
            x.toString ();
  
        case '[object Number]':
          return typeof x === 'object' ?
            'new Number (' + show (x.valueOf ()) + ')' :
            1 / x === -Infinity ? '-0' : x.toString (10);
  
        case '[object String]':
          return typeof x === 'object' ?
            'new String (' + show (x.valueOf ()) + ')' :
            JSON.stringify (x);
  
        case '[object Date]':
          return 'new Date (' +
                 show (isNaN (x.valueOf ()) ? NaN : x.toISOString ()) +
                 ')';
  
        case '[object Error]':
          return 'new ' + x.name + ' (' + show (x.message) + ')';
  
        case '[object Arguments]':
          return 'function () { return arguments; } (' +
                 (Array.prototype.map.call (x, show)).join (', ') +
                 ')';
  
        case '[object Array]':
          seen.push (x);
          try {
            return '[' + ((x.map (show)).concat (
              sortedKeys (x)
              .filter (function(k) { return !(/^\d+$/.test (k)); })
              .map (entry (x))
            )).join (', ') + ']';
          } finally {
            seen.pop ();
          }
  
        case '[object Object]':
          seen.push (x);
          try {
            return (
              $$show in x &&
              (x.constructor == null || x.constructor.prototype !== x) ?
                x[$$show] () :
                '{' + ((sortedKeys (x)).map (entry (x))).join (', ') + '}'
            );
          } finally {
            seen.pop ();
          }
  
        default:
          return String (x);
  
      }
    }