@remotion/studio
Version:
APIs for interacting with the Remotion Studio
74 lines (73 loc) • 2.76 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.sortItemsByNonceHistory = exports.compareNonceHistories = void 0;
const getSharedEpochOrder = (a, b) => {
const aMap = new Map(a);
const bMap = new Map(b);
const allEpochs = [...new Set([...aMap.keys(), ...bMap.keys()])].sort((x, y) => y - x);
for (const epoch of allEpochs) {
const aNonce = aMap.get(epoch);
const bNonce = bMap.get(epoch);
if (aNonce !== undefined && bNonce !== undefined) {
return aNonce - bNonce;
}
}
return null;
};
const compareNonceHistories = (a, b) => {
const shared = getSharedEpochOrder(a, b);
if (shared !== null) {
return shared;
}
// No shared epoch — items from a lower latest epoch come first
const aLatestEpoch = a[a.length - 1][0];
const bLatestEpoch = b[b.length - 1][0];
return aLatestEpoch - bLatestEpoch;
};
exports.compareNonceHistories = compareNonceHistories;
const sortItemsByNonceHistory = (items) => {
const n = items.length;
if (n <= 1) {
return items.slice();
}
// Build a pairwise ordering matrix from shared epochs.
// order[i][j] < 0 means i before j, > 0 means j before i, null means no direct relationship.
const order = Array.from({ length: n }, () => Array(n).fill(null));
for (let i = 0; i < n; i++) {
for (let j = i + 1; j < n; j++) {
const cmp = getSharedEpochOrder(items[i].nonce, items[j].nonce);
order[i][j] = cmp;
order[j][i] = cmp !== null ? -cmp : null;
}
}
// Compute transitive closure: if i < j and j < k, then i < k.
for (let k = 0; k < n; k++) {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (order[i][j] === null &&
order[i][k] !== null &&
order[k][j] !== null &&
order[i][k] < 0 &&
order[k][j] < 0) {
order[i][j] = -1;
order[j][i] = 1;
}
}
}
}
// Sort using transitive order, falling back to lower latest epoch first.
const indexMap = new Map(items.map((item, i) => [item, i]));
const result = items.slice();
result.sort((a, b) => {
const ai = indexMap.get(a);
const bi = indexMap.get(b);
const transitiveOrder = order[ai][bi];
if (transitiveOrder !== null) {
return transitiveOrder;
}
// No transitive relationship — lower latest epoch first
return a.nonce[a.nonce.length - 1][0] - b.nonce[b.nonce.length - 1][0];
});
return result;
};
exports.sortItemsByNonceHistory = sortItemsByNonceHistory;