You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
AdLike2048/extensions/tools/source/MembershipSet.ts

56 lines
1.8 KiB

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