UNPKG

@mic-rexjs/usecases

Version:
21 lines (20 loc) 2.49 kB
import { EntityStore } from '../../classes/EntityStore'; import { AsyncEntityGenerator, EntityGenerator, EntityGeneratorValues, EntityReducer, EntityReducerMap, InferableEntityUseCase, ReducerKeys } from '../../types'; export interface CreateEntityReducersOwnOptions<T> { onYield?(newEntity: T, oldEntity?: T): T; onReturn?(result: unknown, entity: T): unknown; onGenerate?(entity: T, result: unknown): unknown; } export type CreateEntityReducersOptions<T, TOptions extends object> = TOptions & CreateEntityReducersOwnOptions<T>; export type SmoothedEntityReducer<T, TReducer extends EntityReducer<T>> = TReducer extends (entity: infer TEntity, ...args: infer TArgs) => infer TReturn ? TReturn extends AsyncEntityGenerator<TEntity, infer TResult> ? (entity: TEntity, ...args: TArgs) => Promise<EntityGeneratorValues<TEntity, TResult>> : TReturn extends EntityGenerator<TEntity, infer TResult> ? (entity: TEntity, ...args: TArgs) => EntityGeneratorValues<TEntity, TResult> : TReducer : never; export type SmoothedEntityReducers<T, TEntityReducers extends EntityReducerMap<T>> = { [K in ReducerKeys<TEntityReducers>]: SmoothedEntityReducer<T, TEntityReducers[K]>; }; export type ScopedEntityReducer<T, TReducer extends EntityReducer<T>> = TReducer extends (entity: infer TEntity, ...args: infer TArgs) => infer TReturn ? TReturn extends AsyncEntityGenerator<TEntity, infer TResult> ? (...args: TArgs) => Promise<EntityGeneratorValues<TEntity, TResult>> : TReturn extends EntityGenerator<TEntity, infer TResult> ? (...args: TArgs) => EntityGeneratorValues<TEntity, TResult> : (...args: TArgs) => TReturn : never; export type ScopedEntityReducers<T, TEntityReducers extends EntityReducerMap<T>> = { [K in ReducerKeys<TEntityReducers>]: ScopedEntityReducer<T, TEntityReducers[K]>; }; export interface EntityReducersCreator { <T, TEntityReducers extends EntityReducerMap<T>, TUseCaseOptions extends object = object, TReturnedReducers = SmoothedEntityReducers<T, TEntityReducers>>(usecase: InferableEntityUseCase<T, TEntityReducers, TUseCaseOptions>, options?: CreateEntityReducersOptions<T, TUseCaseOptions>): TReturnedReducers; <T, TEntityReducers extends EntityReducerMap<T>, TUseCaseOptions extends object = object, TReturnedReducers = ScopedEntityReducers<T, TEntityReducers>>(initailEntity: T | EntityStore<T>, usecase: InferableEntityUseCase<T, TEntityReducers, TUseCaseOptions>, options?: CreateEntityReducersOptions<T, TUseCaseOptions>): TReturnedReducers; }