export const removeItemsById = ( items: T[], ids: Iterable, ): T[] => { const idSet = new Set(ids); return items.filter((item) => !idSet.has(item.id)); }; export const replaceItemById = ( items: T[], nextItem: T, ): T[] => { return items.map((item) => (item.id === nextItem.id ? nextItem : item)); }; export const upsertItemById = ( items: T[], nextItem: T, options?: { prepend?: boolean }, ): T[] => { const existingIndex = items.findIndex((item) => item.id === nextItem.id); if (existingIndex >= 0) { return replaceItemById(items, nextItem); } if (options?.prepend) { return [nextItem, ...items]; } return [...items, nextItem]; };