Typescript timeline problem

Date: 2024-02-29
interface ITimeDetail {
    key: string;
    time: Date;
}

const details: ITimeDetail[] = [
    { key: "A", time: new Date("2024-02-29T08:00:00") },
    { key: "B", time: new Date("2024-02-29T09:00:00") },
    { key: "A", time: new Date("2024-02-29T09:30:00") },
    { key: "C", time: new Date("2024-02-29T10:00:00") },
    { key: "E", time: new Date("2024-02-29T09:45:00") },
    { key: "B", time: new Date("2024-02-29T10:01:00") },
    { key: "D", time: new Date("2024-02-29T10:15:00") },
    { key: "E", time: new Date("2024-02-29T10:30:00") },
    { key: "D", time: new Date("2024-02-29T10:45:00") },
    { key: "C", time: new Date("2024-02-29T11:30:00") }
];

function getLaneManager() {
    const allLanes = new Set<number>();
    const laneQueue: number[] = [];
    const keyToLaneMap = new Map<string, number>();
    const laneToKeyMap = new Map<number, string>();
    let i = 0;
    
    function take(key: string) {
        if (keyToLaneMap.has(key)) return;
        let lane = laneQueue.pop();
        if (lane === undefined) {
            lane = i;
            allLanes.add(i);
            i += 1;
        }
        keyToLaneMap.set(key, lane);
        laneToKeyMap.set(lane, key);
    }
    function release(key: string) {
        const lane = keyToLaneMap.get(key);
        if (lane !== undefined && allLanes.has(lane)) {
            laneQueue.push(lane);
            keyToLaneMap.delete(key);
            laneToKeyMap.delete(lane);
        }
    }
    const has = (key: string) => keyToLaneMap.has(key);
    const getLanes = () => Array.from(allLanes).map(x => laneToKeyMap.get(x));
    return { take, has, release, getLanes };
}

function getDateTimeStr(date: Date) {
    return new Date(date).toISOString().slice(0, 16).split('T').join(" ");
}

const laneManager = getLaneManager();
const rows = [];
details.sort((a, b) => a.time.getTime() - b.time.getTime());
for (const d of details) {
    const key = d.key;

    const wasActive = laneManager.has(key);
    if (!wasActive)
        laneManager.take(key);

    const desc = laneManager.getLanes().map(x => {
        if (x === key)
            return wasActive ?  "x" :  "o";
        return !x ? " " : "|";
    }).join(" ");

    const desc2 = laneManager.getLanes().map(x => x === undefined ? " " : `${x}`.padStart(1, " ")).join(" ");

    rows.push([key, getDateTimeStr(d.time), desc, desc2]);

    if (wasActive)
        laneManager.release(key)
}

for (const row of rows) 
    console.log(row.join("\t"))

Output

A       2024-02-29 07:00        o       A
B       2024-02-29 08:00        | o     A B
A       2024-02-29 08:30        x |     A B
E       2024-02-29 08:45        o |     E B
C       2024-02-29 09:00        | | o   E B C
B       2024-02-29 09:01        | x |   E B C
D       2024-02-29 09:15        | o |   E D C
E       2024-02-29 09:30        x | |   E D C
D       2024-02-29 09:45          x |     D C
C       2024-02-29 10:30            x       C
83210cookie-checkTypescript timeline problem