/*!
 * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
 * Licensed under the MIT License.
 */
import { ChangeRebaser } from ".";
export type Failure<TCase> = Violation<TCase> | Exception<TCase>;
export interface Violation<TCase> {
    type: "Violation";
    case: TCase;
}
export interface Exception<TCase> {
    type: "Error";
    case: TCase;
    error: unknown;
}
export interface OutputType<TChange> {
    /**
     * "Passed" iff `(A ○ B) ○ C = A (B ○ C) = A ○ B ○ C`,
     * otherwise a triple that violates the axiom.
     */
    composeAssociativity: Failure<[TChange, TChange, TChange]>[];
    /**
     * "Passed" iff `A ↷ (B ○ C) = (A ↷ B) ↷ C`,
     * otherwise a triple that violates the axiom.
     */
    rebaseLeftDistributivity: Failure<[TChange, TChange, TChange]>[];
    /**
     * "Passed" iff `(A ○ B) ↷ C = (A ↷ C) ○ (B ↷ (A⁻¹ ○ C ○ (A ↷ C)) ↷ C)`,
     * otherwise a triple that violates the axiom.
     */
    rebaseRightDistributivity: Failure<[TChange, TChange, TChange]>[];
    /**
     * "Passed" iff `(A ↷ B) ↷ B⁻¹ = A`,
     * otherwise a pair that violates the axiom.
     */
    rebaseOverDoUndoPairIsNoOp: Failure<[TChange, TChange]>[];
    /**
     * "Passed" iff `((A ↷ B) ↷ B⁻¹) ↷ B = A ↷ B`,
     * otherwise a pair that violates the axiom.
     */
    rebaseOverUndoRedoPairIsNoOp: Failure<[TChange, TChange]>[];
    /**
     * "Passed" iff `A ○ A⁻¹ = ε` where `ε` is the empty change,
     * otherwise a change that violates the axiom.
     */
    composeWithInverseIsNoOp: Failure<TChange>[];
    /**
     * "Passed" iff `A ○ ε` is equal to `ε ○ A` which equals to `A` where `ε` is the empty change,
     * otherwise a change that violates the axiom.
     */
    composeWithEmptyIsNoOp: Failure<TChange>[];
    /**
     * "Passed" iff `(A ↷ ε) = A`,
     * otherwise a change that violates the axiom.
     */
    rebaseOverEmptyIsNoOp: Failure<TChange>[];
    /**
     * "Passed" iff `(ε ↷ A) = ε`,
     * otherwise a change that violates the axiom.
     */
    rebaseEmptyIsEmpty: Failure<TChange>[];
    /**
     * "Passed" iff `ε⁻¹ = ε`,
     * otherwise a change that violates the axiom.
     */
    emptyInverseIsEmpty: Failure<TChange>[];
}
export declare const noFailure: OutputType<unknown>;
/**
 * Verifies the axioms of `ChangeRebaser` are met by the given `rebaser`.
 * @param rebaser - The rebaser to test.
 * @param changes - The set of changes to use for testing the `rebaser`.
 * @param isEquivalent - Used to compare whether two changes are equivalent for the purposes of this axioms.
 */
export declare function verifyChangeRebaser<TChange>(rebaser: ChangeRebaser<TChange>, changes: ReadonlySet<TChange>, isEquivalent: (a: TChange, b: TChange) => boolean): OutputType<TChange>;
//# sourceMappingURL=verifyChangeRebaser.d.ts.map