export type OptimisticTimelineEntryLike = { id: string; startDate: Date | string; endDate: Date | string; }; export type OptimisticTimelineOverrideLike = { startDate: Date; endDate: Date; }; export function reconcileOptimisticEntries( optimisticAllocations: ReadonlyMap, entries: readonly OptimisticTimelineEntryLike[], pendingOptimisticAllocationId: string | null, ): { optimisticAllocations: Map; pendingOptimisticAllocationId: string | null; changed: boolean; } { if (optimisticAllocations.size === 0) { return { optimisticAllocations: new Map(optimisticAllocations), pendingOptimisticAllocationId, changed: false, }; } const next = new Map(optimisticAllocations); let nextPendingId = pendingOptimisticAllocationId; for (const entry of entries) { const override = next.get(entry.id); if (!override) continue; const startTime = new Date(entry.startDate).getTime(); const endTime = new Date(entry.endDate).getTime(); if (startTime === override.startDate.getTime() && endTime === override.endDate.getTime()) { next.delete(entry.id); if (nextPendingId === entry.id) { nextPendingId = null; } } } return { optimisticAllocations: next, pendingOptimisticAllocationId: nextPendingId, changed: next.size !== optimisticAllocations.size || nextPendingId !== pendingOptimisticAllocationId, }; }