52 lines
1.3 KiB
TypeScript
52 lines
1.3 KiB
TypeScript
import { PropertyTypes } from "../../../../core/types";
|
|
import { CollapsedDelta } from "../../../../views/lossless";
|
|
import { ResolverPlugin } from "../plugin";
|
|
|
|
type MajorityVoteState = {
|
|
votes: Map<PropertyTypes, number>;
|
|
};
|
|
|
|
/**
|
|
* Majority vote plugin
|
|
*
|
|
* Returns the value that appears most frequently
|
|
*/
|
|
export class MajorityVotePlugin implements ResolverPlugin<MajorityVoteState> {
|
|
readonly name = 'majority-vote';
|
|
readonly dependencies = [] as const;
|
|
|
|
initialize(): MajorityVoteState {
|
|
return { votes: new Map<PropertyTypes, number>() };
|
|
}
|
|
|
|
update(
|
|
currentState: MajorityVoteState,
|
|
newValue: PropertyTypes,
|
|
_delta: CollapsedDelta,
|
|
_dependencies: Record<string, never> = {}
|
|
): MajorityVoteState {
|
|
const currentCount = currentState.votes.get(newValue) || 0;
|
|
// Create a new Map to ensure immutability
|
|
const newVotes = new Map(currentState.votes);
|
|
newVotes.set(newValue, currentCount + 1);
|
|
return { votes: newVotes };
|
|
}
|
|
|
|
resolve(
|
|
state: MajorityVoteState,
|
|
_dependencies: Record<string, never> = {}
|
|
): PropertyTypes | undefined {
|
|
let maxCount = 0;
|
|
let result: PropertyTypes | undefined;
|
|
|
|
state.votes.forEach((count, value) => {
|
|
if (count > maxCount) {
|
|
maxCount = count;
|
|
result = value;
|
|
}
|
|
});
|
|
|
|
return result;
|
|
}
|
|
}
|