/**
 * ComparisonSelector — validated comparison selector hierarchy and
 * frontier normalization utilities.
 *
 * Each selector subclass implements `resolve()` with the resolution
 * logic for its kind (live, coordinate, strand, strand_base),
 * eliminating dispatch switches.
 *
 * @module domain/services/controllers/ComparisonSelector
 */
import type { VisibleStateScope, CoordinateComparisonSelectorInput } from '../../types/CoordinateComparison.ts';
import type { ComparisonCoordinateSideReadPort } from './ComparisonCoordinateSideReadPort.ts';
import type ComparisonSideFinalizer from './ComparisonSideFinalizerPort.ts';
import { type ComparisonHost, type ResolvedComparisonSide } from './ComparisonSelectorSupport.ts';
export { compareStrings, normalizeLamportCeiling, normalizeOptionalString, normalizeRequiredString, normalizeFrontierRecord, frontierRecordToMap, optionalCeiling, combineCeilings, buildCoordinateRequest, patchFrontierFromEntries, lamportFrontierFromEntries, uniqueSortedPatchShas, collectPatchEntriesForFrontier, buildStrandMetadata, computeStateHashForGraph, ResolvedComparisonSide, finalizeSide, } from './ComparisonSelectorSupport.ts';
export type { PatchEntry, MaterializeCoordinateOptions, ComparisonDigestHost, ComparisonPatchEntrySource, ComparisonCoordinateSideReadSource, ComparisonHost, ComparisonRequestedSide, StrandComparisonMetadata, ComparisonResolvedSide, } from './ComparisonSelectorSupport.ts';
export type ComparisonSelectorContext = {
    readonly coordinateReader: ComparisonCoordinateSideReadPort;
    readonly sideFinalizer: ComparisonSideFinalizer;
    readonly strandGraph: ComparisonHost;
};
export declare abstract class NormalizedSelector {
    readonly kind: 'live' | 'coordinate' | 'strand' | 'strand_base';
    readonly ceiling: number | null;
    constructor(kind: 'live' | 'coordinate' | 'strand' | 'strand_base', ceiling: number | null);
    abstract resolve(context: ComparisonSelectorContext, scope: VisibleStateScope | null, liveFrontier: Map<string, string> | null): Promise<ResolvedComparisonSide>;
}
export declare class LiveComparisonSelector extends NormalizedSelector {
    constructor(ceiling: number | null);
    resolve(context: ComparisonSelectorContext, scope: VisibleStateScope | null, liveFrontier: Map<string, string> | null): Promise<ResolvedComparisonSide>;
}
export declare class CoordinateComparisonSelector extends NormalizedSelector {
    readonly frontier: Record<string, string>;
    constructor(frontier: Record<string, string>, ceiling: number | null);
    resolve(context: ComparisonSelectorContext, scope: VisibleStateScope | null): Promise<ResolvedComparisonSide>;
}
export declare class StrandComparisonSelector extends NormalizedSelector {
    readonly strandId: string;
    constructor(strandId: string, ceiling: number | null);
    resolve(context: ComparisonSelectorContext, scope: VisibleStateScope | null): Promise<ResolvedComparisonSide>;
}
export declare class StrandBaseComparisonSelector extends NormalizedSelector {
    readonly strandId: string;
    constructor(strandId: string, ceiling: number | null);
    resolve(context: ComparisonSelectorContext, scope: VisibleStateScope | null): Promise<ResolvedComparisonSide>;
}
export declare function normalizeSelector(selector: CoordinateComparisonSelectorInput, field: string): NormalizedSelector;
