import { Law } from '#law';
import type { Equivalence } from 'effect/Equivalence';
import fc from 'fast-check';
/**
 * Test that a binary operation is associative.
 * @category algebraic laws
 */
export declare const associativity: <A>({ f, a, equals, }: {
    f: (a: A, b: A) => A;
    a: fc.Arbitrary<A>;
    equals: Equivalence<A>;
}, note?: string, name?: string) => Law<[A, A, A]>;
/**
 * Test the composition of two operations cancels each other.
 * @category algebraic laws
 */
export declare const inverse: <A, B>({ f, g, a, equals, }: {
    f: (a: A) => B;
    g: (b: B) => A;
    a: fc.Arbitrary<A>;
    equals: Equivalence<A>;
}, note?: string, name?: string) => Law<[A]>;
/**
 * Test that a binary operation is symmetric.
 * @category algebraic laws
 */
export declare const symmetry: <A, B>({ f, a, equals, }: {
    f: (left: A, right: A) => B;
    a: fc.Arbitrary<A>;
    equals: Equivalence<B>;
}, note?: string, name?: string) => Law<[A, A]>;
//# sourceMappingURL=algebra.d.ts.map