• Jump To … +
    src/tuple.js src/universal-weak-map.js src/util.js
  • util.js

  • ¶

    Although Symbol is widely supported these days, we can safely fall back to using a non-enumerable string property without violating any assumptions elsewhere in the implementation.

    const useSymbol = typeof Symbol === "function";
  • ¶

    Used to mark tuple.prototype so that all objects that inherit from any tuple.prototype object (there could be more than one) will test positive according to tuple.isTuple.

    export const brand = useSymbol
      ? Symbol.for("immutable-tuple")
      : "@@__IMMUTABLE_TUPLE__@@";
  • ¶

    Used to save a reference to the globally shared UniversalWeakMap that stores all known tuple objects.

    export const globalKey = useSymbol
      ? Symbol.for("immutable-tuple-root")
      : "@@__IMMUTABLE_TUPLE_ROOT__@@";
  • ¶

    The mustConvertThisToArray value is true when the corresponding Array method does not attempt to modify this, which means we can pass a tuple object as this without first converting it to an Array.

    export function forEachArrayMethod(fn) {
      function call(name, mustConvertThisToArray) {
        const desc = Object.getOwnPropertyDescriptor(Array.prototype, name);
        fn(name, desc, !! mustConvertThisToArray);
      }
    
      call("every");
      call("filter");
      call("find");
      call("findIndex");
      call("forEach");
      call("includes");
      call("indexOf");
      call("join");
      call("lastIndexOf");
      call("map");
      call("reduce");
      call("reduceRight");
      call("slice");
      call("some");
      call("toLocaleString");
      call("toString");
  • ¶

    The reverse and sort methods are usually destructive, but for tuple objects they return a new tuple object that has been appropriately reversed/sorted.

      call("reverse", true);
      call("sort", true);
  • ¶

    Make [...someTuple] work.

      call(useSymbol && Symbol.iterator || "@@iterator");
    }