import { ChainedLensMaker, ChainedLensMakerAlias, LensMaker, LensMakerAlias } from "./lensMaker";
export declare abstract class Lens<T, TField> {
    set<Tx extends T = T>(obj: Tx, val: TField): Tx;
    castIf<TField1 extends TField>(predicate: (o: TField) => o is TField1): Lens<T, TField1>;
    chain<TField1, TFieldComp extends TField = TField>(lens1: Lens<TFieldComp, TField1>): Lens<T, TField1>;
    get then(): ChainedLensMaker<T, TField> & ChainedLensMakerAlias<T, TField>;
    abstract view(obj: T): TField;
    abstract over<Tx extends T = T>(obj: Tx, func: (val: TField) => TField): Tx;
}
export declare class SimpleLens<T, TField> extends Lens<T, TField> {
    private fields;
    constructor(fields: string[]);
    view(obj: T): TField;
    set<Tx extends T = T>(obj: Tx, val: TField): Tx;
    over<Tx extends T = T>(obj: Tx, func: (val: TField) => TField): Tx;
}
export declare class CastLens<T, TField, TField1 extends TField> extends Lens<T, TField1> {
    private inner;
    private predicate;
    constructor(inner: Lens<T, TField>, predicate: (o: TField) => o is TField1);
    view(obj: T): TField1;
    set<Tx extends T = T>(obj: Tx, val: TField1): Tx;
    over<Tx extends T = T>(obj: Tx, func: (val: TField1) => TField1): Tx;
}
export declare function castIf<T, TField, TField1 extends TField>(lens: Lens<T, TField>, predicate: (o: TField) => o is TField1): Lens<T, TField1>;
export declare class ChainedLens<TRoot, TField, TField1, TFieldComp extends TField = TField> extends Lens<TRoot, TField1> {
    private inner1;
    private inner2;
    constructor(inner1: Lens<TRoot, TField>, inner2: Lens<TFieldComp, TField1>);
    view(obj: TRoot): TField1;
    set<Tx extends TRoot = TRoot>(obj: Tx, val: TField1): Tx;
    over<Tx extends TRoot = TRoot>(obj: Tx, func: (val: TField1) => TField1): Tx;
}
export declare function chain<T, TField, TField1, TFieldComp extends TField = TField>(lens1: Lens<T, TField>, lens2: Lens<TFieldComp, TField1>): ChainedLens<T, TField, TField1, TFieldComp>;
export declare function lensFor<T>(): LensMaker<T>;
export declare function lensFrom<T>(): LensMakerAlias<T>;
export declare function L<T>(): LensMakerAlias<T>;
