@4players/odin-common
Version:
A collection of commonly used type definitions and utility functions across ODIN web projects
41 lines (40 loc) • 1.17 kB
JavaScript
import * as z from 'zod';
export class ChannelSet {
constructor(value = BigInt(0)) {
this.value = value;
}
from(...channels) {
const value = channels.reduce((value, channel) => value | channel_mask(channel), BigInt(0));
return new ChannelSet(value);
}
contains(channel) {
return (this.value & channel_mask(channel)) !== BigInt(0);
}
insert(channel) {
this.value |= channel_mask(channel);
}
remove(channel) {
this.value &= ~channel_mask(channel);
}
[Symbol.iterator]() {
let channel = -1;
const self = new ChannelSet(this.value);
return {
next() {
while (channel < 63) {
channel += 1;
if (self.contains(channel)) {
return { value: channel, done: false };
}
}
return { value: undefined, done: true };
},
};
}
}
export const ChannelSetSchema = z
.bigint()
.transform((number) => new ChannelSet(number));
function channel_mask(channel) {
return BigInt(1) << BigInt(channel);
}