import { IInterceptor, IServiceContainer, Newable, Stack } from '@aesop-fables/containr'; import { Observable } from 'rxjs'; import { PredicateIdentifier } from './Metadata'; import { DataStore } from './DataStore'; /** * Subjects are essentially factories for observables. */ export interface ISubject { createObservable(): Observable; } export interface ISubjectResolver { resolveSubject(constructor: Newable>): Observable; resolveSubjectByKey(key: string): Observable; } export type PredicateResolutionContext = { container: IServiceContainer; dataStore: DataStore; predicateKeys: PredicateIdentifier[]; resolver: ISubjectResolver; }; export declare function resolvePredicate(context: PredicateResolutionContext): Observable | undefined; export declare class SubjectResolver implements ISubjectResolver { private readonly container; private readonly dataStore; constructor(container: IServiceContainer, dataStore: DataStore); resolveSubject(clazz: Newable>): Observable; resolveSubjectByKey(key: string): Observable; } export declare class SubjectResolutionInterceptor implements IInterceptor> { private readonly key; constructor(key: string); resolve(currentValue: Observable | undefined, container: IServiceContainer, errors: Stack): Observable; } export declare function injectSubject(key: string): (constructor: Object, propertyKey: string | symbol | undefined, parameterIndex: number) => void;