/**
 * @since 0.2.0
 */
import { Field } from 'fp-ts/es6/Field';
import { Predicate } from 'fp-ts/es6/function';
import { Monoid } from 'fp-ts/es6/Monoid';
import { Ord } from 'fp-ts/es6/Ord';
import { Ring } from 'fp-ts/es6/Ring';
import { Semigroup } from 'fp-ts/es6/Semigroup';
import { Semiring } from 'fp-ts/es6/Semiring';
import { Eq } from 'fp-ts/es6/Eq';
import { Iso, Prism } from 'monocle-ts';
/**
 * @since 0.2.0
 */
export interface Newtype<URI, A> {
    readonly _URI: URI;
    readonly _A: A;
}
/**
 * @since 0.2.0
 */
export declare type AnyNewtype = Newtype<any, any>;
/**
 * @since 0.2.0
 */
export declare type URIOf<N extends AnyNewtype> = N['_URI'];
/**
 * @since 0.2.0
 */
export declare type CarrierOf<N extends AnyNewtype> = N['_A'];
/**
 * @since 0.3.0
 */
export declare const getEq: <S extends Newtype<any, any>>(S: Eq<S["_A"]>) => Eq<S>;
/**
 * @since 0.2.0
 */
export declare const getOrd: <S extends Newtype<any, any>>(O: Ord<S["_A"]>) => Ord<S>;
/**
 * @since 0.2.0
 */
export declare const getSemigroup: <S extends Newtype<any, any>>(S: Semigroup<S["_A"]>) => Semigroup<S>;
/**
 * @since 0.2.0
 */
export declare const getMonoid: <S extends Newtype<any, any>>(M: Monoid<S["_A"]>) => Monoid<S>;
/**
 * @since 0.2.0
 */
export declare const getSemiring: <S extends Newtype<any, any>>(S: Semiring<S["_A"]>) => Semiring<S>;
/**
 * @since 0.2.0
 */
export declare const getRing: <S extends Newtype<any, any>>(R: Ring<S["_A"]>) => Ring<S>;
/**
 * @since 0.2.0
 */
export declare const getField: <S extends Newtype<any, any>>(F: Field<S["_A"]>) => Field<S>;
/**
 * @since 0.2.0
 */
export declare function iso<S extends AnyNewtype>(): Iso<S, CarrierOf<S>>;
/**
 * @since 0.2.0
 */
export interface Concat<N1 extends Newtype<object, any>, N2 extends Newtype<object, CarrierOf<N1>>> extends Newtype<URIOf<N1> & URIOf<N2>, CarrierOf<N1>> {
}
/**
 * @since 0.2.0
 */
export interface Extends<N extends AnyNewtype, Tags extends object> extends Newtype<Tags & URIOf<N>, CarrierOf<N>> {
}
/**
 * @since 0.2.0
 */
export declare function prism<S extends AnyNewtype>(predicate: Predicate<CarrierOf<S>>): Prism<CarrierOf<S>, S>;
