2018-08-14 17:18:22 +08:00
|
|
|
/*
|
|
|
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
|
|
Author Tobias Koppers @sokra
|
|
|
|
*/
|
|
|
|
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
/** @typedef {import("../Chunk")} Chunk */
|
|
|
|
/** @typedef {import("../Module")} Module */
|
2018-08-16 22:11:20 +08:00
|
|
|
/** @typedef {import("../ModuleGraph")} ModuleGraph */
|
|
|
|
|
|
|
|
/** @template T @typedef {function(T, T): -1|0|1} Comparator */
|
|
|
|
/** @template TArg @template T @typedef {function(TArg, T, T): -1|0|1} RawParamizedComparator */
|
|
|
|
/** @template TArg @template T @typedef {function(TArg): Comparator<T>} ParamizedComparator */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @template T
|
|
|
|
* @param {RawParamizedComparator<any, T>} fn comparator with argument
|
|
|
|
* @returns {ParamizedComparator<any, T>} comparator
|
|
|
|
*/
|
|
|
|
const createCachedParamizedComparator = fn => {
|
|
|
|
/** @type {WeakMap<object, Comparator<T>>} */
|
|
|
|
const map = new WeakMap();
|
|
|
|
return arg => {
|
|
|
|
const cachedResult = map.get(arg);
|
|
|
|
if (cachedResult !== undefined) return cachedResult;
|
|
|
|
/**
|
|
|
|
* @param {T} a first item
|
|
|
|
* @param {T} b second item
|
|
|
|
* @returns {-1|0|1} compare result
|
|
|
|
*/
|
|
|
|
const result = (a, b) => {
|
|
|
|
return fn(arg, a, b);
|
|
|
|
};
|
|
|
|
map.set(arg, result);
|
|
|
|
return result;
|
|
|
|
};
|
|
|
|
};
|
2018-08-14 17:18:22 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {Chunk} a chunk
|
|
|
|
* @param {Chunk} b chunk
|
|
|
|
* @returns {-1|0|1} compare result
|
|
|
|
*/
|
|
|
|
exports.compareChunksById = (a, b) => {
|
|
|
|
return compareIds(a.id, b.id);
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2018-08-16 22:11:20 +08:00
|
|
|
* @param {ModuleGraph} moduleGraph the module graph
|
2018-08-14 17:18:22 +08:00
|
|
|
* @param {Module} a module
|
|
|
|
* @param {Module} b module
|
|
|
|
* @returns {-1|0|1} compare result
|
|
|
|
*/
|
2018-08-16 22:11:20 +08:00
|
|
|
const compareModulesById = (moduleGraph, a, b) => {
|
2018-08-14 17:18:22 +08:00
|
|
|
return compareIds(a.id, b.id);
|
|
|
|
};
|
2018-08-16 22:11:20 +08:00
|
|
|
/** @type {ParamizedComparator<ModuleGraph, Module>} */
|
|
|
|
exports.compareModulesById = createCachedParamizedComparator(
|
|
|
|
compareModulesById
|
|
|
|
);
|
2018-08-14 17:18:22 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {number} a number
|
|
|
|
* @param {number} b number
|
|
|
|
* @returns {-1|0|1} compare result
|
|
|
|
*/
|
|
|
|
const compareNumbers = (a, b) => {
|
|
|
|
if (typeof a !== typeof b) {
|
|
|
|
return typeof a < typeof b ? -1 : 1;
|
|
|
|
}
|
|
|
|
if (a < b) return -1;
|
|
|
|
if (a > b) return 1;
|
|
|
|
return 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2018-08-16 22:11:20 +08:00
|
|
|
* @param {ModuleGraph} moduleGraph the module graph
|
2018-08-14 17:18:22 +08:00
|
|
|
* @param {Module} a module
|
|
|
|
* @param {Module} b module
|
|
|
|
* @returns {-1|0|1} compare result
|
|
|
|
*/
|
2018-08-16 22:11:20 +08:00
|
|
|
const compareModulesByIndex = (moduleGraph, a, b) => {
|
2018-08-21 22:12:00 +08:00
|
|
|
return compareNumbers(
|
|
|
|
moduleGraph.getPreOrderIndex(a),
|
|
|
|
moduleGraph.getPreOrderIndex(b)
|
|
|
|
);
|
2018-08-14 17:18:22 +08:00
|
|
|
};
|
2018-08-16 22:11:20 +08:00
|
|
|
/** @type {ParamizedComparator<ModuleGraph, Module>} */
|
|
|
|
exports.compareModulesByIndex = createCachedParamizedComparator(
|
|
|
|
compareModulesByIndex
|
|
|
|
);
|
2018-08-14 17:18:22 +08:00
|
|
|
|
|
|
|
/**
|
2018-08-16 22:11:20 +08:00
|
|
|
* @param {ModuleGraph} moduleGraph the module graph
|
2018-08-14 17:18:22 +08:00
|
|
|
* @param {Module} a module
|
|
|
|
* @param {Module} b module
|
|
|
|
* @returns {-1|0|1} compare result
|
|
|
|
*/
|
2018-08-16 22:11:20 +08:00
|
|
|
const compareModulesByIndex2 = (moduleGraph, a, b) => {
|
2018-08-21 22:12:00 +08:00
|
|
|
return compareNumbers(
|
|
|
|
moduleGraph.getPostOrderIndex(a),
|
|
|
|
moduleGraph.getPostOrderIndex(b)
|
|
|
|
);
|
2018-08-14 17:18:22 +08:00
|
|
|
};
|
2018-08-16 22:11:20 +08:00
|
|
|
/** @type {ParamizedComparator<ModuleGraph, Module>} */
|
|
|
|
exports.compareModulesByIndex2 = createCachedParamizedComparator(
|
|
|
|
compareModulesByIndex2
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {ModuleGraph} moduleGraph the module graph
|
|
|
|
* @param {Module} a module
|
|
|
|
* @param {Module} b module
|
|
|
|
* @returns {-1|0|1} compare result
|
|
|
|
*/
|
|
|
|
const compareModulesByIndexOrIdentifier = (moduleGraph, a, b) => {
|
2018-08-21 22:12:00 +08:00
|
|
|
const cmp1 = compareNumbers(
|
|
|
|
moduleGraph.getPreOrderIndex(a),
|
|
|
|
moduleGraph.getPreOrderIndex(b)
|
|
|
|
);
|
|
|
|
if (cmp1 !== 0) return cmp1;
|
|
|
|
const cmp2 = compareIds(a.identifier(), b.identifier());
|
|
|
|
return cmp2;
|
2018-08-16 22:11:20 +08:00
|
|
|
};
|
|
|
|
/** @type {ParamizedComparator<ModuleGraph, Module>} */
|
|
|
|
exports.compareModulesByIndexOrIdentifier = createCachedParamizedComparator(
|
|
|
|
compareModulesByIndexOrIdentifier
|
|
|
|
);
|
2018-08-14 17:18:22 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {string|number} a first id
|
|
|
|
* @param {string|number} b second id
|
|
|
|
* @returns {-1|0|1} compare result
|
|
|
|
*/
|
|
|
|
const compareIds = (a, b) => {
|
|
|
|
if (typeof a !== typeof b) {
|
|
|
|
return typeof a < typeof b ? -1 : 1;
|
|
|
|
}
|
|
|
|
if (a < b) return -1;
|
|
|
|
if (a > b) return 1;
|
|
|
|
return 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
exports.compareIds = compareIds;
|