/** * 项目禁用原生 Set(小游戏运行时对部分 Set 用法不稳定)。 * 用 Map 表示成员集合;迭代时 yield key(与 Set 一致,而非 Map 的 [key, value])。 */ export type MembershipSet = Map; export type ReadonlyMembershipSet = ReadonlyMap; function bindMembershipIterator(set: Map): MembershipSet { // Map 默认 for-of 迭代 [key,value];覆盖为仅 yield key(与 Set 一致) (set as { [Symbol.iterator]?: () => IterableIterator })[Symbol.iterator] = () => set.keys(); return set; } export function createMembershipSet(): MembershipSet { return bindMembershipIterator(new Map()); } export function membershipAdd(set: MembershipSet, key: K): MembershipSet { set.set(key, true); return set; } export function membershipHas(set: ReadonlyMembershipSet, key: K): boolean { return set.has(key); } export function membershipDelete(set: MembershipSet, key: K): boolean { return set.delete(key); } export function membershipClear(set: MembershipSet): void { set.clear(); } export function membershipFromArray(items: Iterable): MembershipSet { const set = createMembershipSet(); for (const item of items) { set.set(item, true); } return set; } export function membershipToArray(set: ReadonlyMembershipSet): K[] { return [...set]; } /** 去重数组(替代 Array.from(new Set(...)) / [...new Set(...)]) */ export function membershipDedupeArray(items: Iterable): K[] { return membershipToArray(membershipFromArray(items)); } export function membershipForEach(set: ReadonlyMembershipSet, fn: (key: K) => void): void { for (const key of set) { fn(key); } }