UNPKG

ecclesia

Version:

Framework for political and electoral simulations

51 lines (48 loc) 2.15 kB
import { Counter } from '@gouvernathor/python/collections'; import { Ballots } from '../ballots.cjs'; /** * To be thrown when an attribution fails to attribute seats, * but only in a case where it's an expected limitation of the attribution method. * The typical example being the Condorcet standoff, or a majority threshold, * but a tie could be another example (though they are usually not checked in provided implementations). * * Other errors may and will be raised by the attribution methods for other reasons, * such as invalid input data, division by zero... */ declare class AttributionFailure extends Error { } /** * A function to manage how the results from the ballots * translate into an allocation of seats. * * If the attribution method is expected, by design, to fail under expected conditions, * such as a majority threshold not being reached, * this method should raise an AttributionFailure error. * * @param votes The ballots. * @param rest This parameter, ignored in most cases, * forces the attributions taking more required or optional parameters * to take them as an options object. * Attribution transforms (functions that take an attribution method and return another one) * should generally let that parameter pass through * so as to avoid breaking features in the wrapped attributions. * Attributions should avoid taking other parameters, for the same reason. * * @returns The attribution of seats to the parties based upon the votes. * It is a Counter mapping each party to the number of seats it won. * The return value's total() should be equal to the nSeats attributes - if any. */ interface Attribution<Party, B extends Ballots<Party>> { (votes: B, rest?: Record<string, any>): Counter<Party>; } /** * Most attributions should generally implement this interface, * which reflects that the number of seats they allocate is always the same. * * However, some attributions may yield variable numbers of seats, * for instance the pre-2024 federal German system. */ interface HasNSeats { readonly nSeats: number; } export { type Attribution, AttributionFailure, type HasNSeats };