This commit is contained in:
+12
-9
@@ -1,21 +1,24 @@
|
||||
import type { ParticipantId } from '../types'
|
||||
import type { ParticipantId } from '../types';
|
||||
|
||||
/**
|
||||
* Splits amountCents equally among participantIds. Any remainder cents (from
|
||||
* integer division) go one-each to the first participants in the given
|
||||
* order, so the shares always sum exactly back to amountCents.
|
||||
*/
|
||||
export function computeSplit(amountCents: number, participantIds: ParticipantId[]): Record<ParticipantId, number> {
|
||||
export function computeSplit(
|
||||
amountCents: number,
|
||||
participantIds: ParticipantId[],
|
||||
): Record<ParticipantId, number> {
|
||||
if (participantIds.length === 0) {
|
||||
throw new Error('computeSplit requires at least one participant')
|
||||
throw new Error('computeSplit requires at least one participant');
|
||||
}
|
||||
|
||||
const base = Math.floor(amountCents / participantIds.length)
|
||||
const remainder = amountCents - base * participantIds.length
|
||||
const base = Math.floor(amountCents / participantIds.length);
|
||||
const remainder = amountCents - base * participantIds.length;
|
||||
|
||||
const shares: Record<ParticipantId, number> = {}
|
||||
const shares: Record<ParticipantId, number> = {};
|
||||
participantIds.forEach((id, index) => {
|
||||
shares[id] = base + (index < remainder ? 1 : 0)
|
||||
})
|
||||
return shares
|
||||
shares[id] = base + (index < remainder ? 1 : 0);
|
||||
});
|
||||
return shares;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user