/** * WordPress dependencies */ import { createSelector } from '@safe-wordpress/data'; /** * External dependencies. */ import { values } from 'lodash'; import type { Alternative, AlternativeId, Dict, Maybe } from '@nab/types'; /** * Internal dependencies. */ import type { State } from '../types'; import { isDefined } from '@nab/utils'; type GetAlternative = typeof _getAlternative & { CurriedSignature: typeof __getAlternative; }; export const getAlternative = _getAlternative as GetAlternative; function _getAlternative< A extends Dict = Dict >( state: State, id: AlternativeId ): Maybe< Alternative< A > > { return state.experiment.alternatives.byId[ id ] as Alternative< A >; } /* eslint-disable @typescript-eslint/no-unused-vars */ function __getAlternative< A extends Dict = Dict >( id: 'control' ): Alternative< A >; function __getAlternative< A extends Dict = Dict >( id: AlternativeId ): Maybe< Alternative< A > >; function __getAlternative< A extends Dict = Dict >( _: AlternativeId ): Maybe< Alternative< A > > { return undefined; } /* eslint-enable @typescript-eslint/no-unused-vars */ export const getAlternatives = createSelector( ( state: State ): ReadonlyArray< Alternative > => values( state.experiment.alternatives.byId ).filter( isDefined ), ( state: State ) => [ state.experiment.alternatives.byId ] ); export const getAlternativeIds = ( state: State ): ReadonlyArray< AlternativeId > => state.experiment.alternatives.allIds;