import type { TimelineElement } from "../store/playerStore"; type UpdateElement = (key: string, updates: Partial) => void; const revisionsByUpdater = new WeakMap>(); export function beginTimelineOptimisticGesture( updateElement: UpdateElement, keys: readonly string[], ): Map { let revisions = revisionsByUpdater.get(updateElement); if (!revisions) { revisions = new Map(); revisionsByUpdater.set(updateElement, revisions); } const gesture = new Map(); for (const key of keys) { const revision = (revisions.get(key) ?? 0) + 1; revisions.set(key, revision); gesture.set(key, revision); } return gesture; } export function isLatestTimelineOptimisticGesture( updateElement: UpdateElement, gesture: ReadonlyMap, key: string, ): boolean { return revisionsByUpdater.get(updateElement)?.get(key) === gesture.get(key); } export function rollbackLatestTimelineOptimisticGesture( updateElement: UpdateElement, gesture: ReadonlyMap, rollbacks: ReadonlyArray<{ key: string; updates: Partial }>, ): void { for (const rollback of rollbacks) { if (isLatestTimelineOptimisticGesture(updateElement, gesture, rollback.key)) { updateElement(rollback.key, rollback.updates); } } }