import type { EntityState, IdSelector, Update, EntityId } from './models' export function selectIdValue(entity: T, selectId: IdSelector) { const key = selectId(entity) if (process.env.NODE_ENV !== 'production' && key === undefined) { console.warn( 'The entity passed to the `selectId` implementation returned undefined.', 'You should probably provide your own `selectId` implementation.', 'The entity that was passed:', entity, 'The `selectId` implementation:', selectId.toString() ) } return key } export function ensureEntitiesArray( entities: readonly T[] | Record ): readonly T[] { if (!Array.isArray(entities)) { entities = Object.values(entities) } return entities } export function splitAddedUpdatedEntities( newEntities: readonly T[] | Record, selectId: IdSelector, state: EntityState ): [T[], Update[]] { newEntities = ensureEntitiesArray(newEntities) const added: T[] = [] const updated: Update[] = [] for (const entity of newEntities) { const id = selectIdValue(entity, selectId) if (id in state.entities) { updated.push({ id, changes: entity }) } else { added.push(entity) } } return [added, updated] }