import { createDraftSafeSelector } from '../createDraftSafeSelector' import type { EntityState, EntitySelectors, Dictionary, EntityId, } from './models' export function createSelectorsFactory() { function getSelectors(): EntitySelectors> function getSelectors( selectState: (state: V) => EntityState ): EntitySelectors function getSelectors( selectState?: (state: any) => EntityState ): EntitySelectors { const selectIds = (state: any) => state.ids const selectEntities = (state: EntityState) => state.entities const selectAll = createDraftSafeSelector( selectIds, selectEntities, (ids: readonly T[], entities: Dictionary): any => ids.map((id: any) => (entities as any)[id]) ) const selectId = (_: any, id: EntityId) => id const selectById = (entities: Dictionary, id: EntityId) => entities[id] const selectTotal = createDraftSafeSelector(selectIds, (ids) => ids.length) if (!selectState) { return { selectIds, selectEntities, selectAll, selectTotal, selectById: createDraftSafeSelector( selectEntities, selectId, selectById ), } } const selectGlobalizedEntities = createDraftSafeSelector( selectState, selectEntities ) return { selectIds: createDraftSafeSelector(selectState, selectIds), selectEntities: selectGlobalizedEntities, selectAll: createDraftSafeSelector(selectState, selectAll), selectTotal: createDraftSafeSelector(selectState, selectTotal), selectById: createDraftSafeSelector( selectGlobalizedEntities, selectId, selectById ), } } return { getSelectors } }