import { ChanceRatioMap, WeightMapType } from '../../../shared/types/roulette/chance-ratio-map.type';
type CalcItemWeightArgsType = {
    currentItemAmount: number;
    desirePercent: number;
    totalItems: number;
};
export type ItemKeyExtractorType<S, M> = (item: S) => M;
type CountArgsType<S, M> = {
    selection: S[];
    chanceRatioMap: ChanceRatioMap<M>;
    itemKeyExtractor: ItemKeyExtractorType<S, M>;
};
/**
 * @name WeightCalculator
 * @param S тип для selection
 * @param M тип для ChanceRatioMap
 *
 * */
export declare class WeightCalculator {
    /**
     * count
     * @param args
     * @arg args.selection элементы
     * @arg args.chanceRatioMap шансы на выпадение элемента в selection в процентах
     * @arg args.itemKeyExtractor callback для опредления ключа для weightMap
     */
    count<S, M>(args: CountArgsType<S, M>): WeightMapType<M>;
    protected calcWeights<M>(groupItemCounted: Map<M, number>, chanceRatioMap: WeightMapType<M>): WeightMapType<M>;
    protected calcItemWeight(args: CalcItemWeightArgsType): number;
    protected calcDesireItemAmount(totalItems: number, desirePercent: number): number;
    protected calcWeight(currentItemAmount: number, desireItemAmount: number): number;
    protected groupAndCountItems<S, M>(selection: S[], keyExtractor: (item: S) => M): Map<M, number>;
}
export {};
