import { type Semiring } from "./Semiring.js";
/**
 * @remarks
 * Added in 1.0.0
 * @remarks
 * Category: Model
 * @remarks
 * Original License: MIT – Copyright (c) 2017-present Giulio Canti
 * @public
 */
export interface Ring<A> extends Semiring<A> {
    readonly sub: (x: A, y: A) => A;
}
/**
 * Given a tuple of `Ring`s returns a `Ring` for the tuple
 *
 * @remarks
 * Added in 1.0.0
 * @remarks
 * Original License: MIT – Copyright (c) 2017-present Giulio Canti
 * @example
 *
 * ```typescript
 * import { tuple } from '@fp-tx/core/Ring'
 * import * as N from '@fp-tx/core/number'
 *
 * const R = tuple(N.Field, N.Field, N.Field)
 * assert.deepStrictEqual(R.add([1, 2, 3], [4, 5, 6]), [5, 7, 9])
 * assert.deepStrictEqual(R.mul([1, 2, 3], [4, 5, 6]), [4, 10, 18])
 * assert.deepStrictEqual(R.one, [1, 1, 1])
 * assert.deepStrictEqual(R.sub([1, 2, 3], [4, 5, 6]), [-3, -3, -3])
 * assert.deepStrictEqual(R.zero, [0, 0, 0])
 * ```
 *
 * @public
 */
export declare const tuple: <A extends readonly unknown[]>(...rings: { [K in keyof A]: Ring<A[K]>; }) => Ring<Readonly<A>>;
/**
 * `negate x` can be used as a shorthand for `zero - x`
 *
 * @remarks
 * Added in 1.0.0
 * @remarks
 * Original License: MIT – Copyright (c) 2017-present Giulio Canti
 * @public
 */
export declare const negate: <A>(R: Ring<A>) => (a: A) => A;
/**
 * Use [`tuple`](#tuple) instead.
 *
 * @remarks
 * Added in 1.0.0
 * @remarks
 * Original License: MIT – Copyright (c) 2017-present Giulio Canti
 * @deprecated Zone of Death
 * @public
 */
export declare const getTupleRing: <T extends ReadonlyArray<Ring<any>>>(...rings: T) => Ring<{
    [K in keyof T]: T[K] extends Ring<infer A> ? A : never;
}>;
/**
 * Use [`getRing`](./function.ts.html#getring) instead.
 *
 * @remarks
 * Added in 1.0.0
 * @remarks
 * Original License: MIT – Copyright (c) 2017-present Giulio Canti
 * @deprecated Zone of Death
 * @public
 */
export declare const getFunctionRing: <A, B>(R: Ring<B>) => Ring<(a: A) => B>;
//# sourceMappingURL=Ring.d.ts.map