/** * Item-equality helpers. 1:1 port of Base UI React's * `packages/react/src/internals/itemEquality.ts` — no framework-specific * pieces. */ export type ItemEqualityComparer = ( itemValue: Item, selectedValue: Value, ) => boolean; export const defaultItemEquality: ItemEqualityComparer = ( itemValue, selectedValue, ) => Object.is(itemValue, selectedValue); export function compareItemEquality( itemValue: Item, selectedValue: Value, comparer: ItemEqualityComparer, ): boolean { if (itemValue == null || selectedValue == null) { return Object.is(itemValue, selectedValue); } return comparer(itemValue, selectedValue); } export function selectedValueIncludes( selectedValues: readonly Item[] | undefined | null, itemValue: Value, comparer: ItemEqualityComparer, ): boolean { if (!selectedValues || selectedValues.length === 0) { return false; } return selectedValues.some((selectedValue) => { if (selectedValue === undefined) return false; return compareItemEquality(itemValue, selectedValue, comparer); }); } export function findItemIndex( itemValues: readonly Item[] | undefined | null, selectedValue: Value, comparer: ItemEqualityComparer, ): number { if (!itemValues || itemValues.length === 0) { return -1; } return itemValues.findIndex((itemValue) => { if (itemValue === undefined) return false; return compareItemEquality(itemValue, selectedValue, comparer); }); } export function removeItem( selectedValues: readonly Item[], itemValue: Value, comparer: ItemEqualityComparer, ): Item[] { return selectedValues.filter( (selectedValue) => !compareItemEquality(itemValue, selectedValue, comparer), ); }