core/schedulers/base.scheduler.ts

core/schedulers/base.scheduler.ts is a file in GovLab Docs. 28 lines of code and 9 definitions.

import type { WeightedUnit } from "#types/index.types";

const MIN_BUCKETS = 1;

const leastLoadedIndex = function leastLoadedIndex(loads: readonly number[]): number {
    let best = 0;
    for (let at = 1; at < loads.length; at += 1) {
        if ((loads[at] ?? 0) < (loads[best] ?? 0)) {
            best = at;
        }
    }
    return best;
};

export const longestProcessingTimeBuckets = function longestProcessingTimeBuckets(
    units: readonly WeightedUnit[],
    bucketCount: number,
): string[][] {
    if (units.length === 0) {
        return [];
    }
    const count = Math.max(MIN_BUCKETS, Math.min(bucketCount, units.length));
    const buckets: string[][] = Array.from({ length: count }, () => []);
    const loads: number[] = Array.from({ length: count }, () => 0);
    for (const unit of units.toSorted((left, right) => right.cost - left.cost)) {
        const target = leastLoadedIndex(loads);
        buckets[target]?.push(unit.id);
        loads[target] = (loads[target] ?? 0) + unit.cost;
    }
    return buckets.filter((bucket) => bucket.length > 0);
};