UNPKG

@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
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); }