import { Counter } from "@gouvernathor/python/collections";
import { type Collection } from "@gouvernathor/python/collections/abc";
import { type Voting } from "./election/voting";
import { type Attribution } from "./election/attribution";
import { type RandomObjParam } from "./utils";
/**
 * A function to go from a set of opinionated voters
 * to the elected representatives, the number of seats for each candidate.
 *
 * @param voters A pool of voters such as taken by the Voting functions.
 * @returns A multi-set (a Counter) of elected representatives as returned by an Attribution.
 */
export interface Election<Voter, Party> {
    (voters: Collection<Voter>, candidates: Collection<Party>): Counter<Party, number>;
}
/**
 * Implements the most basic elections : combining a voting method and an attribution method.
 */
export declare function standardElection<Voter, Party, Tally>({ votingMethod, attributionMethod }: {
    votingMethod: Voting<Voter, Party, Tally>;
    attributionMethod: Attribution<Party, Tally>;
}): Election<Voter, Party>;
/**
 * Implements a selection by lottery, directly among the population.
 * Adds the supplementary constraint that the voter type and the candidate type must be the same.
 *
 * The pool of candidates and the pool of citizens must be the same.
 * (Implementation detail : this is not enforced, and the pool of candidates is ignored.)
 * Returns elements from the pool picked without replacement,
 * so the pool must be at least nSeats in size.
 */
export declare function sortition<Citizen>({ nSeats, ...randomParam }: {
    nSeats: number;
} & RandomObjParam): Election<Citizen, Citizen>;
