import { ShippingBranch, BranchName, BranchNodes, MergeUnion, NodeAmount } from "./branch";
export declare type ZoneName<T extends ShippingZone<any, any>> = T extends ShippingZone<infer N, any> ? N : never;
export declare type ZoneBranches<T extends ShippingZone<any, any>> = T extends ShippingZone<infer Z, infer B> ? MergeUnion<Z, B> : never;
export declare type ZoneResolverCallback = (toBranch: number, branchToBranch: number, fromBranch: number) => (number | undefined)[];
export declare type GetIndex<A extends any[], T> = {
    [K in keyof A]: A[K] extends T ? K : never;
}[number];
export declare class ShippingZone<N extends string, T extends ShippingBranch<any, any>> {
    protected name: N;
    protected branches: T[];
    protected Branches: {
        [key: string]: ShippingBranch<any, any>;
    };
    protected Amounts: {
        [key: string]: {
            [key: string]: number;
        };
    };
    protected ResolverCallback?: ZoneResolverCallback;
    constructor(name: N, branches: T[]);
    has: (branchName: string) => boolean;
    getName: () => N;
    getBranch: <B extends BranchName<T>>(name: B) => ShippingBranch<B, Record<BranchNodes<T>, NodeAmount>>;
    getBranches: () => T[];
    setAmount: (from: BranchName<T>, to: BranchName<T>, amount: number, recursive?: boolean) => this;
    branchOf: (node: BranchNodes<T>) => T;
    setResolver: (callback: ZoneResolverCallback) => this;
    getPayments: (from: BranchNodes<T>, to: BranchNodes<T>) => {
        toBranch: any;
        branchToBranch: number;
        fromBranch: any;
    };
}
