# core/schedulers/base.scheduler.ts

> 28 lines of code and 9 definitions.

Tree: GovLab Docs
Language: typescript
Layer: runtime
Canonical: https://banes-lab.com/anatomy/docs#file-docs-core-schedulers-base-scheduler-ts
Source text: https://banes-lab.com/source/docs/core/schedulers/base.scheduler.ts.txt

Listed in [core/schedulers](https://banes-lab.com/api/source/docs/core/schedulers.md).

## Definitions

- `MIN_BUCKETS` (lexical_declaration, line 3)
- `leastLoadedIndex` (lexical_declaration, line 5)
- `best` (lexical_declaration, line 6)
- `at` (lexical_declaration, line 7)
- `longestProcessingTimeBuckets` (lexical_declaration, line 15, exported)
- `count` (lexical_declaration, line 22, exported)
- `buckets` (lexical_declaration, line 23, exported)
- `loads` (lexical_declaration, line 24, exported)
- `target` (lexical_declaration, line 26, exported)

## Contained in

- [core/schedulers](https://banes-lab.com/anatomy/docs/folder-docs-core-schedulers.md)

## Source

```typescript
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);
};
```
