util.js

- 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");
      }