@sapphire/bitfield 1.2.0 → 1.2.1-next.08908f25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,256 @@
1
+ declare const FlagEntriesSymbol: unique symbol;
2
+ declare class BitField<Flags extends Record<string, number> | Record<string, bigint>> {
3
+ readonly type: Flags[keyof Flags] extends number ? 'number' : 'bigint';
4
+ readonly zero: Flags[keyof Flags] extends number ? 0 : 0n;
5
+ readonly mask: ValueType<this>;
6
+ readonly flags: Flags;
7
+ private readonly [FlagEntriesSymbol];
8
+ constructor(flags: Readonly<Flags>);
9
+ /**
10
+ * Resolves a:
11
+ * - `string`: If it's a property of {@link Flags}.
12
+ * - `number`: If the BitField processes `number` primitives.
13
+ * - `bigint`: If the BitField processes `bigint` primitives.
14
+ * - `Array`: Resolves recursively.
15
+ * @param resolvable The value to resolve.
16
+ * @returns The resolved value.
17
+ */
18
+ resolve(resolvable: ValueResolvable<this>): ValueType<this>;
19
+ /**
20
+ * Checks whether or not `field` contains any of the bits from `bits`.
21
+ * @param field The bits to compare the bits from.
22
+ * @param bits The bits to compare with.
23
+ * @returns Whether or not `field` has any of `bits`'s bits, also denoted as `A ∩ B ≠ ∅`.
24
+ */
25
+ any(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean;
26
+ /**
27
+ * Checks whether or not `field` is a superset of or equal to `bits`.
28
+ * @param field The bits to compare the bits from.
29
+ * @param bits The bits to compare with.
30
+ * @returns Whether or not `field` is a superset of or equal to `bits`, also denoted as `A ⊇ B`.
31
+ */
32
+ has(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean;
33
+ /**
34
+ * Makes the complement of `field`, which is a field of all bits (of `U` or the union of all {@link Flags} bits)
35
+ * that do not belong to `A`. It is the result of `U ∖ A`, or `difference(U, field)`.
36
+ * @param field The bits to get the complement of.
37
+ * @returns The complement of `field`, also denoted `Aᶜ` or `A'`.
38
+ * @example
39
+ * ```typescript
40
+ * const bitfield = new BitField({
41
+ * Read: 0b0001,
42
+ * Write: 0b0010,
43
+ * Edit: 0b0100,
44
+ * Delete: 0b1000
45
+ * });
46
+ *
47
+ * bitfield.complement(0b0100);
48
+ * // 0b1011
49
+ * ```
50
+ */
51
+ complement(field: ValueResolvable<this>): ValueType<this>;
52
+ /**
53
+ * Makes a union of all the bits.
54
+ * @param fields The bits to create a union of.
55
+ * @returns The result of combining all bits together, also denoted as `∅ ⋃ fields`.
56
+ * @example
57
+ * ```typescript
58
+ * bitfield.union(0b0001, 0b0100);
59
+ * // 0b0101
60
+ *
61
+ * bitfield.union(0b1100, 0b0001, 0b0010);
62
+ * // 0b1111
63
+ * ```
64
+ * @seealso {@link https://en.wikipedia.org/wiki/Union_(set_theory)}
65
+ */
66
+ union(...fields: readonly ValueResolvable<this>[]): ValueType<this>;
67
+ /**
68
+ * Makes an intersection of all the bits.
69
+ * @param bitfield The first field.
70
+ * @param fields The bits to intersect with `bitfield`.
71
+ * @returns The result of intersecting `bitfield` with all of the `fields`, also denoted as `A ⋂ fields`.
72
+ * @example
73
+ * ```typescript
74
+ * bitfield.intersection(0b0001, 0b0100);
75
+ * // 0b0000
76
+ *
77
+ * bitfield.intersection(0b1100, 0b0100);
78
+ * // 0b0100
79
+ *
80
+ * bitfield.intersection(0b1101, 0b0101, 0b1100);
81
+ * // 0b0100
82
+ * ```
83
+ * @seealso {@link https://en.wikipedia.org/wiki/Intersection_(set_theory)}
84
+ */
85
+ intersection(bitfield: ValueResolvable<this>, ...fields: readonly ValueResolvable<this>[]): ValueType<this>;
86
+ /**
87
+ * Removes from `a` the bits that exist in `b`.
88
+ * @param a The first field.
89
+ * @param b The bits to remove from `a`.
90
+ * @returns The result of `a ∖ b`.
91
+ * @example
92
+ * ```typescript
93
+ * bitfield.difference(0b1100, 0b0100);
94
+ * // 0b1000
95
+ *
96
+ * bitfield.difference(0b1111, 0b0110);
97
+ * // 0b1001
98
+ * ```
99
+ * @seealso {@link https://en.wikipedia.org/wiki/Difference_(set_theory)}
100
+ */
101
+ difference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this>;
102
+ /**
103
+ * Computes the symmetric difference, denoted as `A ⊖ B` or `A Δ B`, which is the disjunctive union, or the set of
104
+ * elements which are in either of the sets, but not in their intersection. As such, this is the result of
105
+ * `(A ∖ B) ∪ (B ∖ A)`, `union(difference(a, b), difference(b, a))`, or `a ⊕ b`.
106
+ * @remarks The empty set (`∅`) is neutral, as such, `A Δ ∅ = A` and `A Δ A = ∅`
107
+ * @param a The first field.
108
+ * @param b The second field.
109
+ * @returns The result of computing `a Δ b`.
110
+ * @example
111
+ * ```typescript
112
+ * bitfield.symmetricDifference(0b1100, 0b0011);
113
+ * // 0b1111
114
+ *
115
+ * bitfield.symmetricDifference(0b1101, 0b1011);
116
+ * // 0b0110
117
+ * ```
118
+ * @seealso {@link https://en.wikipedia.org/wiki/Symmetric_difference}
119
+ */
120
+ symmetricDifference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this>;
121
+ /**
122
+ * Retrieves an array of the properties from {@link Flags} whose values are contained in `field`.
123
+ * @param field The field to convert to an array.
124
+ * @returns The names of the {@link BitField}'s flag properties whose value are contained in `field`.
125
+ * @example
126
+ * ```typescript
127
+ * const bitfield = new BitField({
128
+ * Read: 0b0001,
129
+ * Write: 0b0010,
130
+ * Edit: 0b0100,
131
+ * Delete: 0b1000
132
+ * });
133
+ *
134
+ * bitfield.toArray(0b0101);
135
+ * // ['Read', 'Edit']
136
+ * ```
137
+ */
138
+ toArray(field: ValueResolvable<this>): (keyof Flags)[];
139
+ /**
140
+ * Retrieves an iterator of the properties from {@link Flags} whose values are contained in `field`.
141
+ * @param field The field to convert to an iterator.
142
+ * @returns An iterator with the keys of the {@link BitField}'s flag properties whose value are contained in `field`.
143
+ * @example
144
+ * ```typescript
145
+ * const bitfield = new BitField({
146
+ * Read: 0b0001,
147
+ * Write: 0b0010,
148
+ * Edit: 0b0100,
149
+ * Delete: 0b1000
150
+ * });
151
+ *
152
+ * [...bitfield.toKeys(0b0101)];
153
+ * // ['Read', 'Edit']
154
+ * ```
155
+ */
156
+ toKeys(field: ValueResolvable<this>): IterableIterator<keyof Flags>;
157
+ /**
158
+ * Retrieves an iterator of the values from {@link Flags} whose values are contained in `field`.
159
+ * @param field The field to convert to an iterator.
160
+ * @returns An iterator with the values of the {@link BitField}'s flag properties whose value are contained in `field`.
161
+ * @example
162
+ * ```typescript
163
+ * const bitfield = new BitField({
164
+ * Read: 0b0001,
165
+ * Write: 0b0010,
166
+ * Edit: 0b0100,
167
+ * Delete: 0b1000
168
+ * });
169
+ *
170
+ * [...bitfield.toValues(0b0101)];
171
+ * // [0b0001, 0b0100]
172
+ * ```
173
+ */
174
+ toValues(field: ValueResolvable<this>): IterableIterator<ValueType<this>>;
175
+ /**
176
+ * Retrieves an iterator of the entries from {@link Flags} whose values are contained in `field`.
177
+ * @param field The field to convert to an iterator.
178
+ * @returns An iterator with the entries of the {@link BitField}'s flag properties whose value are contained in `field`.
179
+ * @example
180
+ * ```typescript
181
+ * const bitfield = new BitField({
182
+ * Read: 0b0001,
183
+ * Write: 0b0010,
184
+ * Edit: 0b0100,
185
+ * Delete: 0b1000
186
+ * });
187
+ *
188
+ * [...bitfield.toEntries(0b0101)];
189
+ * // [['Read', 0b0001], ['Edit', 0b0100]]
190
+ * ```
191
+ */
192
+ toEntries(field: ValueResolvable<this>): IterableIterator<[key: keyof Flags, value: ValueType<this>]>;
193
+ /**
194
+ * Retrieves an object with the properties from {@link Flags} whose values are boolean denoting whether or not the
195
+ * flag's bit is contained in `field`.
196
+ * @param field The field to convert to an object.
197
+ * @returns An object with the properties of {@link Flags} which values are boolean.
198
+ * @example
199
+ * ```typescript
200
+ * const bitfield = new BitField({
201
+ * Read: 0b0001,
202
+ * Write: 0b0010,
203
+ * Edit: 0b0100,
204
+ * Delete: 0b1000
205
+ * });
206
+ *
207
+ * bitfield.toObject(0b0101);
208
+ * // {
209
+ * // Read: true,
210
+ * // Write: false,
211
+ * // Edit: true,
212
+ * // Delete: false
213
+ * // }
214
+ * ```
215
+ */
216
+ toObject(field: ValueResolvable<this>): Record<keyof Flags, boolean>;
217
+ }
218
+ type PrimitiveType<T> = T extends number ? number : bigint;
219
+ type MaybeArray<T> = T | readonly T[];
220
+ /**
221
+ * Resolves the type of the values the specified {@link BitField} takes.
222
+ * @typeparam A {@link BitField} instance type.
223
+ */
224
+ type ValueType<T> = T extends BitField<infer Flags> ? PrimitiveType<Flags[keyof Flags]> : never;
225
+ /**
226
+ * Resolves the possible types accepted by the specified {@link BitField}.
227
+ * @typeparam A {@link BitField} instance type.
228
+ */
229
+ type ValueResolvable<T> = T extends BitField<infer Flags> ? MaybeArray<keyof Flags | PrimitiveType<Flags[keyof Flags]>> : never;
230
+
231
+ /**
232
+ * Converts a TypeScript enum to a 1-way object, stripping out the number keys.
233
+ * @param enumObject The enum to convert
234
+ * @example
235
+ * ```typescript
236
+ * enum Permissions {
237
+ * Read: 1 << 0,
238
+ * Write: 1 << 1
239
+ * }
240
+ * // {
241
+ * // Read: 1,
242
+ * // Write: 2,
243
+ * // 1: 'Read',
244
+ * // 2: 'Write'
245
+ * // }
246
+ *
247
+ * enumToObject(Permissions);
248
+ * // { Read: 1, Write: 2 }
249
+ * ```
250
+ * @returns The mapped object
251
+ */
252
+ declare function enumToObject<T extends object>(enumObject: T): {
253
+ [K in Exclude<keyof T, `${number}`>]: T[K];
254
+ };
255
+
256
+ export { BitField, MaybeArray, PrimitiveType, ValueResolvable, ValueType, enumToObject };
@@ -12,7 +12,7 @@ var SapphireBitField = (function (exports) {
12
12
  // src/lib/BitField.ts
13
13
  var FlagEntriesSymbol = Symbol("@sapphire/bitfield.flags.entries");
14
14
  var _a;
15
- var BitField = class {
15
+ var _BitField = class _BitField {
16
16
  constructor(flags) {
17
17
  __publicField(this, "type");
18
18
  __publicField(this, "zero");
@@ -329,8 +329,9 @@ var SapphireBitField = (function (exports) {
329
329
  return Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit]));
330
330
  }
331
331
  };
332
- __name(BitField, "BitField");
333
332
  _a = FlagEntriesSymbol;
333
+ __name(_BitField, "BitField");
334
+ var BitField = _BitField;
334
335
 
335
336
  // src/lib/utilities.ts
336
337
  function enumToObject(enumObject) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/BitField.ts","../src/lib/utilities.ts"],"names":[],"mappings":"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","sourcesContent":["const FlagEntriesSymbol = Symbol('@sapphire/bitfield.flags.entries');\n\nexport class BitField<Flags extends Record<string, number> | Record<string, bigint>> {\n\tpublic readonly type: Flags[keyof Flags] extends number ? 'number' : 'bigint';\n\tpublic readonly zero: Flags[keyof Flags] extends number ? 0 : 0n;\n\tpublic readonly mask: ValueType<this>;\n\tpublic readonly flags: Flags;\n\tprivate readonly [FlagEntriesSymbol]: readonly [string, Flags[keyof Flags]][];\n\n\tpublic constructor(flags: Readonly<Flags>) {\n\t\tif (typeof flags !== 'object' || flags === null) {\n\t\t\tthrow new TypeError('flags must be a non-null object');\n\t\t}\n\n\t\tconst entries = Object.entries(flags) as [string, Flags[keyof Flags]][];\n\t\tif (entries.length === 0) {\n\t\t\tthrow new TypeError('flags must be a non-empty object');\n\t\t}\n\n\t\tconst type = typeof entries[0][1];\n\t\tif (type !== 'number' && type !== 'bigint') {\n\t\t\tthrow new TypeError('A bitfield can only use numbers or bigints for its values');\n\t\t}\n\n\t\tthis.type = type as any;\n\t\tthis.flags = flags;\n\t\tthis[FlagEntriesSymbol] = entries;\n\n\t\tif (type === 'number') {\n\t\t\tthis.zero = 0 as any;\n\n\t\t\tlet mask = 0;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'number') throw new TypeError(`The property \"${key}\" does not resolve to a number`);\n\t\t\t\tif (value !== (value | 0)) throw new RangeError(`The property \"${key}\" does not resolve to a safe bitfield value`);\n\t\t\t\tif (value <= 0) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t} else {\n\t\t\tthis.zero = 0n as any;\n\n\t\t\tlet mask = 0n;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'bigint') throw new TypeError(`The property \"${key}\" does not resolve to a bigint`);\n\t\t\t\tif (value <= 0n) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t}\n\t}\n\n\t/**\n\t * Resolves a:\n\t * - `string`: If it's a property of {@link Flags}.\n\t * - `number`: If the BitField processes `number` primitives.\n\t * - `bigint`: If the BitField processes `bigint` primitives.\n\t * - `Array`: Resolves recursively.\n\t * @param resolvable The value to resolve.\n\t * @returns The resolved value.\n\t */\n\tpublic resolve(resolvable: ValueResolvable<this>): ValueType<this> {\n\t\tswitch (typeof resolvable) {\n\t\t\tcase 'string':\n\t\t\t\tif ((resolvable as string) in this.flags) return this.flags[resolvable as keyof Flags] as any;\n\t\t\t\tthrow new RangeError('Received a name that could not be resolved to a property of flags');\n\t\t\tcase this.type:\n\t\t\t\treturn ((resolvable as ValueType<this>) & this.mask) as any;\n\t\t\tcase 'object':\n\t\t\t\tif (Array.isArray(resolvable)) return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);\n\t\t\t\tthrow new TypeError('Received an object value that is not an Array');\n\t\t\tdefault:\n\t\t\t\tthrow new TypeError(`Received a value that is not either type \"string\", type \"${this.type}\", or an Array`);\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether or not `field` contains any of the bits from `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` has any of `bits`'s bits, also denoted as `A ∩ B ≠ ∅`.\n\t */\n\tpublic any(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\treturn (this.resolve(field) & this.resolve(bits)) !== this.zero;\n\t}\n\n\t/**\n\t * Checks whether or not `field` is a superset of or equal to `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` is a superset of or equal to `bits`, also denoted as `A ⊇ B`.\n\t */\n\tpublic has(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\tconst resolved = this.resolve(bits);\n\t\treturn (this.resolve(field) & resolved) === resolved;\n\t}\n\n\t/**\n\t * Makes the complement of `field`, which is a field of all bits (of `U` or the union of all {@link Flags} bits)\n\t * that do not belong to `A`. It is the result of `U ∖ A`, or `difference(U, field)`.\n\t * @param field The bits to get the complement of.\n\t * @returns The complement of `field`, also denoted `Aᶜ` or `A'`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.complement(0b0100);\n\t * // 0b1011\n\t * ```\n\t */\n\tpublic complement(field: ValueResolvable<this>): ValueType<this> {\n\t\treturn this.difference(this.mask, field);\n\t}\n\n\t/**\n\t * Makes a union of all the bits.\n\t * @param fields The bits to create a union of.\n\t * @returns The result of combining all bits together, also denoted as `∅ ⋃ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.union(0b0001, 0b0100);\n\t * // 0b0101\n\t *\n\t * bitfield.union(0b1100, 0b0001, 0b0010);\n\t * // 0b1111\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Union_(set_theory)}\n\t */\n\tpublic union(...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.zero as ValueType<this>;\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field | this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Makes an intersection of all the bits.\n\t * @param bitfield The first field.\n\t * @param fields The bits to intersect with `bitfield`.\n\t * @returns The result of intersecting `bitfield` with all of the `fields`, also denoted as `A ⋂ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.intersection(0b0001, 0b0100);\n\t * // 0b0000\n\t *\n\t * bitfield.intersection(0b1100, 0b0100);\n\t * // 0b0100\n\t *\n\t * bitfield.intersection(0b1101, 0b0101, 0b1100);\n\t * // 0b0100\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Intersection_(set_theory)}\n\t */\n\tpublic intersection(bitfield: ValueResolvable<this>, ...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.resolve(bitfield);\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field & this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Removes from `a` the bits that exist in `b`.\n\t * @param a The first field.\n\t * @param b The bits to remove from `a`.\n\t * @returns The result of `a ∖ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.difference(0b1100, 0b0100);\n\t * // 0b1000\n\t *\n\t * bitfield.difference(0b1111, 0b0110);\n\t * // 0b1001\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Difference_(set_theory)}\n\t */\n\tpublic difference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) & ~this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Computes the symmetric difference, denoted as `A ⊖ B` or `A Δ B`, which is the disjunctive union, or the set of\n\t * elements which are in either of the sets, but not in their intersection. As such, this is the result of\n\t * `(A ∖ B) ∪ (B ∖ A)`, `union(difference(a, b), difference(b, a))`, or `a ⊕ b`.\n\t * @remarks The empty set (`∅`) is neutral, as such, `A Δ ∅ = A` and `A Δ A = ∅`\n\t * @param a The first field.\n\t * @param b The second field.\n\t * @returns The result of computing `a Δ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.symmetricDifference(0b1100, 0b0011);\n\t * // 0b1111\n\t *\n\t * bitfield.symmetricDifference(0b1101, 0b1011);\n\t * // 0b0110\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Symmetric_difference}\n\t */\n\tpublic symmetricDifference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) ^ this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Retrieves an array of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an array.\n\t * @returns The names of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toArray(0b0101);\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic toArray(field: ValueResolvable<this>): (keyof Flags)[] {\n\t\treturn [...this.toKeys(field)];\n\t}\n\n\t/**\n\t * Retrieves an iterator of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the keys of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toKeys(0b0101)];\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic *toKeys(field: ValueResolvable<this>): IterableIterator<keyof Flags> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield key;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the values from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the values of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toValues(0b0101)];\n\t * // [0b0001, 0b0100]\n\t * ```\n\t */\n\tpublic *toValues(field: ValueResolvable<this>): IterableIterator<ValueType<this>> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [_, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield bit as unknown as ValueType<this>;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the entries from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the entries of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toEntries(0b0101)];\n\t * // [['Read', 0b0001], ['Edit', 0b0100]]\n\t * ```\n\t */\n\tpublic *toEntries(field: ValueResolvable<this>): IterableIterator<[key: keyof Flags, value: ValueType<this>]> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield [key, bit as unknown as ValueType<this>];\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an object with the properties from {@link Flags} whose values are boolean denoting whether or not the\n\t * flag's bit is contained in `field`.\n\t * @param field The field to convert to an object.\n\t * @returns An object with the properties of {@link Flags} which values are boolean.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toObject(0b0101);\n\t * // {\n\t * // \tRead: true,\n\t * // \tWrite: false,\n\t * // \tEdit: true,\n\t * // \tDelete: false\n\t * // }\n\t * ```\n\t */\n\tpublic toObject(field: ValueResolvable<this>): Record<keyof Flags, boolean> {\n\t\tconst bits = this.resolve(field);\n\t\treturn Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit])) as Record<keyof Flags, boolean>;\n\t}\n}\n\nexport type PrimitiveType<T> = T extends number ? number : bigint;\n\nexport type MaybeArray<T> = T | readonly T[];\n\n/**\n * Resolves the type of the values the specified {@link BitField} takes.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueType<T> = T extends BitField<infer Flags> ? PrimitiveType<Flags[keyof Flags]> : never;\n\n/**\n * Resolves the possible types accepted by the specified {@link BitField}.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueResolvable<T> = T extends BitField<infer Flags> ? MaybeArray<keyof Flags | PrimitiveType<Flags[keyof Flags]>> : never;\n","/**\n * Converts a TypeScript enum to a 1-way object, stripping out the number keys.\n * @param enumObject The enum to convert\n * @example\n * ```typescript\n * enum Permissions {\n * \tRead: 1 << 0,\n * \tWrite: 1 << 1\n * }\n * // {\n * // \tRead: 1,\n * // \tWrite: 2,\n * // \t1: 'Read',\n * // \t2: 'Write'\n * // }\n *\n * enumToObject(Permissions);\n * // { Read: 1, Write: 2 }\n * ```\n * @returns The mapped object\n */\nexport function enumToObject<T extends object>(enumObject: T): { [K in Exclude<keyof T, `${number}`>]: T[K] } {\n\tconst result = {} as { [K in Exclude<keyof T, `${number}`>]: T[K] };\n\tfor (const [key, value] of Object.entries(enumObject)) {\n\t\tif (Number.isNaN(Number(key))) result[key as Exclude<keyof T, `${number}`>] = value;\n\t}\n\n\treturn result;\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/BitField.ts","../src/lib/utilities.ts"],"names":[],"mappings":"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","sourcesContent":["const FlagEntriesSymbol = Symbol('@sapphire/bitfield.flags.entries');\n\nexport class BitField<Flags extends Record<string, number> | Record<string, bigint>> {\n\tpublic readonly type: Flags[keyof Flags] extends number ? 'number' : 'bigint';\n\tpublic readonly zero: Flags[keyof Flags] extends number ? 0 : 0n;\n\tpublic readonly mask: ValueType<this>;\n\tpublic readonly flags: Flags;\n\tprivate readonly [FlagEntriesSymbol]: readonly [string, Flags[keyof Flags]][];\n\n\tpublic constructor(flags: Readonly<Flags>) {\n\t\tif (typeof flags !== 'object' || flags === null) {\n\t\t\tthrow new TypeError('flags must be a non-null object');\n\t\t}\n\n\t\tconst entries = Object.entries(flags) as [string, Flags[keyof Flags]][];\n\t\tif (entries.length === 0) {\n\t\t\tthrow new TypeError('flags must be a non-empty object');\n\t\t}\n\n\t\tconst type = typeof entries[0][1];\n\t\tif (type !== 'number' && type !== 'bigint') {\n\t\t\tthrow new TypeError('A bitfield can only use numbers or bigints for its values');\n\t\t}\n\n\t\tthis.type = type as any;\n\t\tthis.flags = flags;\n\t\tthis[FlagEntriesSymbol] = entries;\n\n\t\tif (type === 'number') {\n\t\t\tthis.zero = 0 as any;\n\n\t\t\tlet mask = 0;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'number') throw new TypeError(`The property \"${key}\" does not resolve to a number`);\n\t\t\t\tif (value !== (value | 0)) throw new RangeError(`The property \"${key}\" does not resolve to a safe bitfield value`);\n\t\t\t\tif (value <= 0) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t} else {\n\t\t\tthis.zero = 0n as any;\n\n\t\t\tlet mask = 0n;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'bigint') throw new TypeError(`The property \"${key}\" does not resolve to a bigint`);\n\t\t\t\tif (value <= 0n) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t}\n\t}\n\n\t/**\n\t * Resolves a:\n\t * - `string`: If it's a property of {@link Flags}.\n\t * - `number`: If the BitField processes `number` primitives.\n\t * - `bigint`: If the BitField processes `bigint` primitives.\n\t * - `Array`: Resolves recursively.\n\t * @param resolvable The value to resolve.\n\t * @returns The resolved value.\n\t */\n\tpublic resolve(resolvable: ValueResolvable<this>): ValueType<this> {\n\t\tswitch (typeof resolvable) {\n\t\t\tcase 'string':\n\t\t\t\tif ((resolvable as string) in this.flags) return this.flags[resolvable as keyof Flags] as any;\n\t\t\t\tthrow new RangeError('Received a name that could not be resolved to a property of flags');\n\t\t\tcase this.type:\n\t\t\t\treturn ((resolvable as ValueType<this>) & this.mask) as any;\n\t\t\tcase 'object':\n\t\t\t\tif (Array.isArray(resolvable)) return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);\n\t\t\t\tthrow new TypeError('Received an object value that is not an Array');\n\t\t\tdefault:\n\t\t\t\tthrow new TypeError(`Received a value that is not either type \"string\", type \"${this.type}\", or an Array`);\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether or not `field` contains any of the bits from `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` has any of `bits`'s bits, also denoted as `A ∩ B ≠ ∅`.\n\t */\n\tpublic any(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\treturn (this.resolve(field) & this.resolve(bits)) !== this.zero;\n\t}\n\n\t/**\n\t * Checks whether or not `field` is a superset of or equal to `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` is a superset of or equal to `bits`, also denoted as `A ⊇ B`.\n\t */\n\tpublic has(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\tconst resolved = this.resolve(bits);\n\t\treturn (this.resolve(field) & resolved) === resolved;\n\t}\n\n\t/**\n\t * Makes the complement of `field`, which is a field of all bits (of `U` or the union of all {@link Flags} bits)\n\t * that do not belong to `A`. It is the result of `U ∖ A`, or `difference(U, field)`.\n\t * @param field The bits to get the complement of.\n\t * @returns The complement of `field`, also denoted `Aᶜ` or `A'`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.complement(0b0100);\n\t * // 0b1011\n\t * ```\n\t */\n\tpublic complement(field: ValueResolvable<this>): ValueType<this> {\n\t\treturn this.difference(this.mask, field);\n\t}\n\n\t/**\n\t * Makes a union of all the bits.\n\t * @param fields The bits to create a union of.\n\t * @returns The result of combining all bits together, also denoted as `∅ ⋃ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.union(0b0001, 0b0100);\n\t * // 0b0101\n\t *\n\t * bitfield.union(0b1100, 0b0001, 0b0010);\n\t * // 0b1111\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Union_(set_theory)}\n\t */\n\tpublic union(...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.zero as ValueType<this>;\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field | this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Makes an intersection of all the bits.\n\t * @param bitfield The first field.\n\t * @param fields The bits to intersect with `bitfield`.\n\t * @returns The result of intersecting `bitfield` with all of the `fields`, also denoted as `A ⋂ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.intersection(0b0001, 0b0100);\n\t * // 0b0000\n\t *\n\t * bitfield.intersection(0b1100, 0b0100);\n\t * // 0b0100\n\t *\n\t * bitfield.intersection(0b1101, 0b0101, 0b1100);\n\t * // 0b0100\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Intersection_(set_theory)}\n\t */\n\tpublic intersection(bitfield: ValueResolvable<this>, ...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.resolve(bitfield);\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field & this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Removes from `a` the bits that exist in `b`.\n\t * @param a The first field.\n\t * @param b The bits to remove from `a`.\n\t * @returns The result of `a ∖ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.difference(0b1100, 0b0100);\n\t * // 0b1000\n\t *\n\t * bitfield.difference(0b1111, 0b0110);\n\t * // 0b1001\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Difference_(set_theory)}\n\t */\n\tpublic difference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) & ~this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Computes the symmetric difference, denoted as `A ⊖ B` or `A Δ B`, which is the disjunctive union, or the set of\n\t * elements which are in either of the sets, but not in their intersection. As such, this is the result of\n\t * `(A ∖ B) ∪ (B ∖ A)`, `union(difference(a, b), difference(b, a))`, or `a ⊕ b`.\n\t * @remarks The empty set (`∅`) is neutral, as such, `A Δ ∅ = A` and `A Δ A = ∅`\n\t * @param a The first field.\n\t * @param b The second field.\n\t * @returns The result of computing `a Δ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.symmetricDifference(0b1100, 0b0011);\n\t * // 0b1111\n\t *\n\t * bitfield.symmetricDifference(0b1101, 0b1011);\n\t * // 0b0110\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Symmetric_difference}\n\t */\n\tpublic symmetricDifference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) ^ this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Retrieves an array of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an array.\n\t * @returns The names of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toArray(0b0101);\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic toArray(field: ValueResolvable<this>): (keyof Flags)[] {\n\t\treturn [...this.toKeys(field)];\n\t}\n\n\t/**\n\t * Retrieves an iterator of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the keys of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toKeys(0b0101)];\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic *toKeys(field: ValueResolvable<this>): IterableIterator<keyof Flags> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield key;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the values from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the values of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toValues(0b0101)];\n\t * // [0b0001, 0b0100]\n\t * ```\n\t */\n\tpublic *toValues(field: ValueResolvable<this>): IterableIterator<ValueType<this>> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [_, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield bit as unknown as ValueType<this>;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the entries from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the entries of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toEntries(0b0101)];\n\t * // [['Read', 0b0001], ['Edit', 0b0100]]\n\t * ```\n\t */\n\tpublic *toEntries(field: ValueResolvable<this>): IterableIterator<[key: keyof Flags, value: ValueType<this>]> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield [key, bit as unknown as ValueType<this>];\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an object with the properties from {@link Flags} whose values are boolean denoting whether or not the\n\t * flag's bit is contained in `field`.\n\t * @param field The field to convert to an object.\n\t * @returns An object with the properties of {@link Flags} which values are boolean.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toObject(0b0101);\n\t * // {\n\t * // \tRead: true,\n\t * // \tWrite: false,\n\t * // \tEdit: true,\n\t * // \tDelete: false\n\t * // }\n\t * ```\n\t */\n\tpublic toObject(field: ValueResolvable<this>): Record<keyof Flags, boolean> {\n\t\tconst bits = this.resolve(field);\n\t\treturn Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit])) as Record<keyof Flags, boolean>;\n\t}\n}\n\nexport type PrimitiveType<T> = T extends number ? number : bigint;\n\nexport type MaybeArray<T> = T | readonly T[];\n\n/**\n * Resolves the type of the values the specified {@link BitField} takes.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueType<T> = T extends BitField<infer Flags> ? PrimitiveType<Flags[keyof Flags]> : never;\n\n/**\n * Resolves the possible types accepted by the specified {@link BitField}.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueResolvable<T> = T extends BitField<infer Flags> ? MaybeArray<keyof Flags | PrimitiveType<Flags[keyof Flags]>> : never;\n","/**\n * Converts a TypeScript enum to a 1-way object, stripping out the number keys.\n * @param enumObject The enum to convert\n * @example\n * ```typescript\n * enum Permissions {\n * \tRead: 1 << 0,\n * \tWrite: 1 << 1\n * }\n * // {\n * // \tRead: 1,\n * // \tWrite: 2,\n * // \t1: 'Read',\n * // \t2: 'Write'\n * // }\n *\n * enumToObject(Permissions);\n * // { Read: 1, Write: 2 }\n * ```\n * @returns The mapped object\n */\nexport function enumToObject<T extends object>(enumObject: T): { [K in Exclude<keyof T, `${number}`>]: T[K] } {\n\tconst result = {} as { [K in Exclude<keyof T, `${number}`>]: T[K] };\n\tfor (const [key, value] of Object.entries(enumObject)) {\n\t\tif (Number.isNaN(Number(key))) result[key as Exclude<keyof T, `${number}`>] = value;\n\t}\n\n\treturn result;\n}\n"]}
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ var __publicField = (obj, key, value) => {
11
11
  // src/lib/BitField.ts
12
12
  var FlagEntriesSymbol = Symbol("@sapphire/bitfield.flags.entries");
13
13
  var _a;
14
- var BitField = class {
14
+ var _BitField = class _BitField {
15
15
  constructor(flags) {
16
16
  __publicField(this, "type");
17
17
  __publicField(this, "zero");
@@ -328,8 +328,9 @@ var BitField = class {
328
328
  return Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit]));
329
329
  }
330
330
  };
331
- __name(BitField, "BitField");
332
331
  _a = FlagEntriesSymbol;
332
+ __name(_BitField, "BitField");
333
+ var BitField = _BitField;
333
334
 
334
335
  // src/lib/utilities.ts
335
336
  function enumToObject(enumObject) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/BitField.ts","../src/lib/utilities.ts"],"names":[],"mappings":"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","sourcesContent":["const FlagEntriesSymbol = Symbol('@sapphire/bitfield.flags.entries');\n\nexport class BitField<Flags extends Record<string, number> | Record<string, bigint>> {\n\tpublic readonly type: Flags[keyof Flags] extends number ? 'number' : 'bigint';\n\tpublic readonly zero: Flags[keyof Flags] extends number ? 0 : 0n;\n\tpublic readonly mask: ValueType<this>;\n\tpublic readonly flags: Flags;\n\tprivate readonly [FlagEntriesSymbol]: readonly [string, Flags[keyof Flags]][];\n\n\tpublic constructor(flags: Readonly<Flags>) {\n\t\tif (typeof flags !== 'object' || flags === null) {\n\t\t\tthrow new TypeError('flags must be a non-null object');\n\t\t}\n\n\t\tconst entries = Object.entries(flags) as [string, Flags[keyof Flags]][];\n\t\tif (entries.length === 0) {\n\t\t\tthrow new TypeError('flags must be a non-empty object');\n\t\t}\n\n\t\tconst type = typeof entries[0][1];\n\t\tif (type !== 'number' && type !== 'bigint') {\n\t\t\tthrow new TypeError('A bitfield can only use numbers or bigints for its values');\n\t\t}\n\n\t\tthis.type = type as any;\n\t\tthis.flags = flags;\n\t\tthis[FlagEntriesSymbol] = entries;\n\n\t\tif (type === 'number') {\n\t\t\tthis.zero = 0 as any;\n\n\t\t\tlet mask = 0;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'number') throw new TypeError(`The property \"${key}\" does not resolve to a number`);\n\t\t\t\tif (value !== (value | 0)) throw new RangeError(`The property \"${key}\" does not resolve to a safe bitfield value`);\n\t\t\t\tif (value <= 0) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t} else {\n\t\t\tthis.zero = 0n as any;\n\n\t\t\tlet mask = 0n;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'bigint') throw new TypeError(`The property \"${key}\" does not resolve to a bigint`);\n\t\t\t\tif (value <= 0n) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t}\n\t}\n\n\t/**\n\t * Resolves a:\n\t * - `string`: If it's a property of {@link Flags}.\n\t * - `number`: If the BitField processes `number` primitives.\n\t * - `bigint`: If the BitField processes `bigint` primitives.\n\t * - `Array`: Resolves recursively.\n\t * @param resolvable The value to resolve.\n\t * @returns The resolved value.\n\t */\n\tpublic resolve(resolvable: ValueResolvable<this>): ValueType<this> {\n\t\tswitch (typeof resolvable) {\n\t\t\tcase 'string':\n\t\t\t\tif ((resolvable as string) in this.flags) return this.flags[resolvable as keyof Flags] as any;\n\t\t\t\tthrow new RangeError('Received a name that could not be resolved to a property of flags');\n\t\t\tcase this.type:\n\t\t\t\treturn ((resolvable as ValueType<this>) & this.mask) as any;\n\t\t\tcase 'object':\n\t\t\t\tif (Array.isArray(resolvable)) return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);\n\t\t\t\tthrow new TypeError('Received an object value that is not an Array');\n\t\t\tdefault:\n\t\t\t\tthrow new TypeError(`Received a value that is not either type \"string\", type \"${this.type}\", or an Array`);\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether or not `field` contains any of the bits from `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` has any of `bits`'s bits, also denoted as `A ∩ B ≠ ∅`.\n\t */\n\tpublic any(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\treturn (this.resolve(field) & this.resolve(bits)) !== this.zero;\n\t}\n\n\t/**\n\t * Checks whether or not `field` is a superset of or equal to `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` is a superset of or equal to `bits`, also denoted as `A ⊇ B`.\n\t */\n\tpublic has(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\tconst resolved = this.resolve(bits);\n\t\treturn (this.resolve(field) & resolved) === resolved;\n\t}\n\n\t/**\n\t * Makes the complement of `field`, which is a field of all bits (of `U` or the union of all {@link Flags} bits)\n\t * that do not belong to `A`. It is the result of `U ∖ A`, or `difference(U, field)`.\n\t * @param field The bits to get the complement of.\n\t * @returns The complement of `field`, also denoted `Aᶜ` or `A'`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.complement(0b0100);\n\t * // 0b1011\n\t * ```\n\t */\n\tpublic complement(field: ValueResolvable<this>): ValueType<this> {\n\t\treturn this.difference(this.mask, field);\n\t}\n\n\t/**\n\t * Makes a union of all the bits.\n\t * @param fields The bits to create a union of.\n\t * @returns The result of combining all bits together, also denoted as `∅ ⋃ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.union(0b0001, 0b0100);\n\t * // 0b0101\n\t *\n\t * bitfield.union(0b1100, 0b0001, 0b0010);\n\t * // 0b1111\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Union_(set_theory)}\n\t */\n\tpublic union(...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.zero as ValueType<this>;\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field | this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Makes an intersection of all the bits.\n\t * @param bitfield The first field.\n\t * @param fields The bits to intersect with `bitfield`.\n\t * @returns The result of intersecting `bitfield` with all of the `fields`, also denoted as `A ⋂ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.intersection(0b0001, 0b0100);\n\t * // 0b0000\n\t *\n\t * bitfield.intersection(0b1100, 0b0100);\n\t * // 0b0100\n\t *\n\t * bitfield.intersection(0b1101, 0b0101, 0b1100);\n\t * // 0b0100\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Intersection_(set_theory)}\n\t */\n\tpublic intersection(bitfield: ValueResolvable<this>, ...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.resolve(bitfield);\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field & this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Removes from `a` the bits that exist in `b`.\n\t * @param a The first field.\n\t * @param b The bits to remove from `a`.\n\t * @returns The result of `a ∖ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.difference(0b1100, 0b0100);\n\t * // 0b1000\n\t *\n\t * bitfield.difference(0b1111, 0b0110);\n\t * // 0b1001\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Difference_(set_theory)}\n\t */\n\tpublic difference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) & ~this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Computes the symmetric difference, denoted as `A ⊖ B` or `A Δ B`, which is the disjunctive union, or the set of\n\t * elements which are in either of the sets, but not in their intersection. As such, this is the result of\n\t * `(A ∖ B) ∪ (B ∖ A)`, `union(difference(a, b), difference(b, a))`, or `a ⊕ b`.\n\t * @remarks The empty set (`∅`) is neutral, as such, `A Δ ∅ = A` and `A Δ A = ∅`\n\t * @param a The first field.\n\t * @param b The second field.\n\t * @returns The result of computing `a Δ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.symmetricDifference(0b1100, 0b0011);\n\t * // 0b1111\n\t *\n\t * bitfield.symmetricDifference(0b1101, 0b1011);\n\t * // 0b0110\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Symmetric_difference}\n\t */\n\tpublic symmetricDifference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) ^ this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Retrieves an array of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an array.\n\t * @returns The names of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toArray(0b0101);\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic toArray(field: ValueResolvable<this>): (keyof Flags)[] {\n\t\treturn [...this.toKeys(field)];\n\t}\n\n\t/**\n\t * Retrieves an iterator of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the keys of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toKeys(0b0101)];\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic *toKeys(field: ValueResolvable<this>): IterableIterator<keyof Flags> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield key;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the values from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the values of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toValues(0b0101)];\n\t * // [0b0001, 0b0100]\n\t * ```\n\t */\n\tpublic *toValues(field: ValueResolvable<this>): IterableIterator<ValueType<this>> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [_, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield bit as unknown as ValueType<this>;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the entries from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the entries of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toEntries(0b0101)];\n\t * // [['Read', 0b0001], ['Edit', 0b0100]]\n\t * ```\n\t */\n\tpublic *toEntries(field: ValueResolvable<this>): IterableIterator<[key: keyof Flags, value: ValueType<this>]> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield [key, bit as unknown as ValueType<this>];\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an object with the properties from {@link Flags} whose values are boolean denoting whether or not the\n\t * flag's bit is contained in `field`.\n\t * @param field The field to convert to an object.\n\t * @returns An object with the properties of {@link Flags} which values are boolean.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toObject(0b0101);\n\t * // {\n\t * // \tRead: true,\n\t * // \tWrite: false,\n\t * // \tEdit: true,\n\t * // \tDelete: false\n\t * // }\n\t * ```\n\t */\n\tpublic toObject(field: ValueResolvable<this>): Record<keyof Flags, boolean> {\n\t\tconst bits = this.resolve(field);\n\t\treturn Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit])) as Record<keyof Flags, boolean>;\n\t}\n}\n\nexport type PrimitiveType<T> = T extends number ? number : bigint;\n\nexport type MaybeArray<T> = T | readonly T[];\n\n/**\n * Resolves the type of the values the specified {@link BitField} takes.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueType<T> = T extends BitField<infer Flags> ? PrimitiveType<Flags[keyof Flags]> : never;\n\n/**\n * Resolves the possible types accepted by the specified {@link BitField}.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueResolvable<T> = T extends BitField<infer Flags> ? MaybeArray<keyof Flags | PrimitiveType<Flags[keyof Flags]>> : never;\n","/**\n * Converts a TypeScript enum to a 1-way object, stripping out the number keys.\n * @param enumObject The enum to convert\n * @example\n * ```typescript\n * enum Permissions {\n * \tRead: 1 << 0,\n * \tWrite: 1 << 1\n * }\n * // {\n * // \tRead: 1,\n * // \tWrite: 2,\n * // \t1: 'Read',\n * // \t2: 'Write'\n * // }\n *\n * enumToObject(Permissions);\n * // { Read: 1, Write: 2 }\n * ```\n * @returns The mapped object\n */\nexport function enumToObject<T extends object>(enumObject: T): { [K in Exclude<keyof T, `${number}`>]: T[K] } {\n\tconst result = {} as { [K in Exclude<keyof T, `${number}`>]: T[K] };\n\tfor (const [key, value] of Object.entries(enumObject)) {\n\t\tif (Number.isNaN(Number(key))) result[key as Exclude<keyof T, `${number}`>] = value;\n\t}\n\n\treturn result;\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/BitField.ts","../src/lib/utilities.ts"],"names":[],"mappings":"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","sourcesContent":["const FlagEntriesSymbol = Symbol('@sapphire/bitfield.flags.entries');\n\nexport class BitField<Flags extends Record<string, number> | Record<string, bigint>> {\n\tpublic readonly type: Flags[keyof Flags] extends number ? 'number' : 'bigint';\n\tpublic readonly zero: Flags[keyof Flags] extends number ? 0 : 0n;\n\tpublic readonly mask: ValueType<this>;\n\tpublic readonly flags: Flags;\n\tprivate readonly [FlagEntriesSymbol]: readonly [string, Flags[keyof Flags]][];\n\n\tpublic constructor(flags: Readonly<Flags>) {\n\t\tif (typeof flags !== 'object' || flags === null) {\n\t\t\tthrow new TypeError('flags must be a non-null object');\n\t\t}\n\n\t\tconst entries = Object.entries(flags) as [string, Flags[keyof Flags]][];\n\t\tif (entries.length === 0) {\n\t\t\tthrow new TypeError('flags must be a non-empty object');\n\t\t}\n\n\t\tconst type = typeof entries[0][1];\n\t\tif (type !== 'number' && type !== 'bigint') {\n\t\t\tthrow new TypeError('A bitfield can only use numbers or bigints for its values');\n\t\t}\n\n\t\tthis.type = type as any;\n\t\tthis.flags = flags;\n\t\tthis[FlagEntriesSymbol] = entries;\n\n\t\tif (type === 'number') {\n\t\t\tthis.zero = 0 as any;\n\n\t\t\tlet mask = 0;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'number') throw new TypeError(`The property \"${key}\" does not resolve to a number`);\n\t\t\t\tif (value !== (value | 0)) throw new RangeError(`The property \"${key}\" does not resolve to a safe bitfield value`);\n\t\t\t\tif (value <= 0) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t} else {\n\t\t\tthis.zero = 0n as any;\n\n\t\t\tlet mask = 0n;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'bigint') throw new TypeError(`The property \"${key}\" does not resolve to a bigint`);\n\t\t\t\tif (value <= 0n) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t}\n\t}\n\n\t/**\n\t * Resolves a:\n\t * - `string`: If it's a property of {@link Flags}.\n\t * - `number`: If the BitField processes `number` primitives.\n\t * - `bigint`: If the BitField processes `bigint` primitives.\n\t * - `Array`: Resolves recursively.\n\t * @param resolvable The value to resolve.\n\t * @returns The resolved value.\n\t */\n\tpublic resolve(resolvable: ValueResolvable<this>): ValueType<this> {\n\t\tswitch (typeof resolvable) {\n\t\t\tcase 'string':\n\t\t\t\tif ((resolvable as string) in this.flags) return this.flags[resolvable as keyof Flags] as any;\n\t\t\t\tthrow new RangeError('Received a name that could not be resolved to a property of flags');\n\t\t\tcase this.type:\n\t\t\t\treturn ((resolvable as ValueType<this>) & this.mask) as any;\n\t\t\tcase 'object':\n\t\t\t\tif (Array.isArray(resolvable)) return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);\n\t\t\t\tthrow new TypeError('Received an object value that is not an Array');\n\t\t\tdefault:\n\t\t\t\tthrow new TypeError(`Received a value that is not either type \"string\", type \"${this.type}\", or an Array`);\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether or not `field` contains any of the bits from `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` has any of `bits`'s bits, also denoted as `A ∩ B ≠ ∅`.\n\t */\n\tpublic any(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\treturn (this.resolve(field) & this.resolve(bits)) !== this.zero;\n\t}\n\n\t/**\n\t * Checks whether or not `field` is a superset of or equal to `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` is a superset of or equal to `bits`, also denoted as `A ⊇ B`.\n\t */\n\tpublic has(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\tconst resolved = this.resolve(bits);\n\t\treturn (this.resolve(field) & resolved) === resolved;\n\t}\n\n\t/**\n\t * Makes the complement of `field`, which is a field of all bits (of `U` or the union of all {@link Flags} bits)\n\t * that do not belong to `A`. It is the result of `U ∖ A`, or `difference(U, field)`.\n\t * @param field The bits to get the complement of.\n\t * @returns The complement of `field`, also denoted `Aᶜ` or `A'`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.complement(0b0100);\n\t * // 0b1011\n\t * ```\n\t */\n\tpublic complement(field: ValueResolvable<this>): ValueType<this> {\n\t\treturn this.difference(this.mask, field);\n\t}\n\n\t/**\n\t * Makes a union of all the bits.\n\t * @param fields The bits to create a union of.\n\t * @returns The result of combining all bits together, also denoted as `∅ ⋃ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.union(0b0001, 0b0100);\n\t * // 0b0101\n\t *\n\t * bitfield.union(0b1100, 0b0001, 0b0010);\n\t * // 0b1111\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Union_(set_theory)}\n\t */\n\tpublic union(...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.zero as ValueType<this>;\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field | this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Makes an intersection of all the bits.\n\t * @param bitfield The first field.\n\t * @param fields The bits to intersect with `bitfield`.\n\t * @returns The result of intersecting `bitfield` with all of the `fields`, also denoted as `A ⋂ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.intersection(0b0001, 0b0100);\n\t * // 0b0000\n\t *\n\t * bitfield.intersection(0b1100, 0b0100);\n\t * // 0b0100\n\t *\n\t * bitfield.intersection(0b1101, 0b0101, 0b1100);\n\t * // 0b0100\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Intersection_(set_theory)}\n\t */\n\tpublic intersection(bitfield: ValueResolvable<this>, ...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.resolve(bitfield);\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field & this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Removes from `a` the bits that exist in `b`.\n\t * @param a The first field.\n\t * @param b The bits to remove from `a`.\n\t * @returns The result of `a ∖ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.difference(0b1100, 0b0100);\n\t * // 0b1000\n\t *\n\t * bitfield.difference(0b1111, 0b0110);\n\t * // 0b1001\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Difference_(set_theory)}\n\t */\n\tpublic difference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) & ~this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Computes the symmetric difference, denoted as `A ⊖ B` or `A Δ B`, which is the disjunctive union, or the set of\n\t * elements which are in either of the sets, but not in their intersection. As such, this is the result of\n\t * `(A ∖ B) ∪ (B ∖ A)`, `union(difference(a, b), difference(b, a))`, or `a ⊕ b`.\n\t * @remarks The empty set (`∅`) is neutral, as such, `A Δ ∅ = A` and `A Δ A = ∅`\n\t * @param a The first field.\n\t * @param b The second field.\n\t * @returns The result of computing `a Δ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.symmetricDifference(0b1100, 0b0011);\n\t * // 0b1111\n\t *\n\t * bitfield.symmetricDifference(0b1101, 0b1011);\n\t * // 0b0110\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Symmetric_difference}\n\t */\n\tpublic symmetricDifference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) ^ this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Retrieves an array of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an array.\n\t * @returns The names of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toArray(0b0101);\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic toArray(field: ValueResolvable<this>): (keyof Flags)[] {\n\t\treturn [...this.toKeys(field)];\n\t}\n\n\t/**\n\t * Retrieves an iterator of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the keys of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toKeys(0b0101)];\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic *toKeys(field: ValueResolvable<this>): IterableIterator<keyof Flags> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield key;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the values from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the values of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toValues(0b0101)];\n\t * // [0b0001, 0b0100]\n\t * ```\n\t */\n\tpublic *toValues(field: ValueResolvable<this>): IterableIterator<ValueType<this>> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [_, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield bit as unknown as ValueType<this>;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the entries from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the entries of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toEntries(0b0101)];\n\t * // [['Read', 0b0001], ['Edit', 0b0100]]\n\t * ```\n\t */\n\tpublic *toEntries(field: ValueResolvable<this>): IterableIterator<[key: keyof Flags, value: ValueType<this>]> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield [key, bit as unknown as ValueType<this>];\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an object with the properties from {@link Flags} whose values are boolean denoting whether or not the\n\t * flag's bit is contained in `field`.\n\t * @param field The field to convert to an object.\n\t * @returns An object with the properties of {@link Flags} which values are boolean.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toObject(0b0101);\n\t * // {\n\t * // \tRead: true,\n\t * // \tWrite: false,\n\t * // \tEdit: true,\n\t * // \tDelete: false\n\t * // }\n\t * ```\n\t */\n\tpublic toObject(field: ValueResolvable<this>): Record<keyof Flags, boolean> {\n\t\tconst bits = this.resolve(field);\n\t\treturn Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit])) as Record<keyof Flags, boolean>;\n\t}\n}\n\nexport type PrimitiveType<T> = T extends number ? number : bigint;\n\nexport type MaybeArray<T> = T | readonly T[];\n\n/**\n * Resolves the type of the values the specified {@link BitField} takes.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueType<T> = T extends BitField<infer Flags> ? PrimitiveType<Flags[keyof Flags]> : never;\n\n/**\n * Resolves the possible types accepted by the specified {@link BitField}.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueResolvable<T> = T extends BitField<infer Flags> ? MaybeArray<keyof Flags | PrimitiveType<Flags[keyof Flags]>> : never;\n","/**\n * Converts a TypeScript enum to a 1-way object, stripping out the number keys.\n * @param enumObject The enum to convert\n * @example\n * ```typescript\n * enum Permissions {\n * \tRead: 1 << 0,\n * \tWrite: 1 << 1\n * }\n * // {\n * // \tRead: 1,\n * // \tWrite: 2,\n * // \t1: 'Read',\n * // \t2: 'Write'\n * // }\n *\n * enumToObject(Permissions);\n * // { Read: 1, Write: 2 }\n * ```\n * @returns The mapped object\n */\nexport function enumToObject<T extends object>(enumObject: T): { [K in Exclude<keyof T, `${number}`>]: T[K] } {\n\tconst result = {} as { [K in Exclude<keyof T, `${number}`>]: T[K] };\n\tfor (const [key, value] of Object.entries(enumObject)) {\n\t\tif (Number.isNaN(Number(key))) result[key as Exclude<keyof T, `${number}`>] = value;\n\t}\n\n\treturn result;\n}\n"]}
package/dist/index.mjs CHANGED
@@ -9,7 +9,7 @@ var __publicField = (obj, key, value) => {
9
9
  // src/lib/BitField.ts
10
10
  var FlagEntriesSymbol = Symbol("@sapphire/bitfield.flags.entries");
11
11
  var _a;
12
- var BitField = class {
12
+ var _BitField = class _BitField {
13
13
  constructor(flags) {
14
14
  __publicField(this, "type");
15
15
  __publicField(this, "zero");
@@ -326,8 +326,9 @@ var BitField = class {
326
326
  return Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit]));
327
327
  }
328
328
  };
329
- __name(BitField, "BitField");
330
329
  _a = FlagEntriesSymbol;
330
+ __name(_BitField, "BitField");
331
+ var BitField = _BitField;
331
332
 
332
333
  // src/lib/utilities.ts
333
334
  function enumToObject(enumObject) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/BitField.ts","../src/lib/utilities.ts"],"names":[],"mappings":"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","sourcesContent":["const FlagEntriesSymbol = Symbol('@sapphire/bitfield.flags.entries');\n\nexport class BitField<Flags extends Record<string, number> | Record<string, bigint>> {\n\tpublic readonly type: Flags[keyof Flags] extends number ? 'number' : 'bigint';\n\tpublic readonly zero: Flags[keyof Flags] extends number ? 0 : 0n;\n\tpublic readonly mask: ValueType<this>;\n\tpublic readonly flags: Flags;\n\tprivate readonly [FlagEntriesSymbol]: readonly [string, Flags[keyof Flags]][];\n\n\tpublic constructor(flags: Readonly<Flags>) {\n\t\tif (typeof flags !== 'object' || flags === null) {\n\t\t\tthrow new TypeError('flags must be a non-null object');\n\t\t}\n\n\t\tconst entries = Object.entries(flags) as [string, Flags[keyof Flags]][];\n\t\tif (entries.length === 0) {\n\t\t\tthrow new TypeError('flags must be a non-empty object');\n\t\t}\n\n\t\tconst type = typeof entries[0][1];\n\t\tif (type !== 'number' && type !== 'bigint') {\n\t\t\tthrow new TypeError('A bitfield can only use numbers or bigints for its values');\n\t\t}\n\n\t\tthis.type = type as any;\n\t\tthis.flags = flags;\n\t\tthis[FlagEntriesSymbol] = entries;\n\n\t\tif (type === 'number') {\n\t\t\tthis.zero = 0 as any;\n\n\t\t\tlet mask = 0;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'number') throw new TypeError(`The property \"${key}\" does not resolve to a number`);\n\t\t\t\tif (value !== (value | 0)) throw new RangeError(`The property \"${key}\" does not resolve to a safe bitfield value`);\n\t\t\t\tif (value <= 0) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t} else {\n\t\t\tthis.zero = 0n as any;\n\n\t\t\tlet mask = 0n;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'bigint') throw new TypeError(`The property \"${key}\" does not resolve to a bigint`);\n\t\t\t\tif (value <= 0n) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t}\n\t}\n\n\t/**\n\t * Resolves a:\n\t * - `string`: If it's a property of {@link Flags}.\n\t * - `number`: If the BitField processes `number` primitives.\n\t * - `bigint`: If the BitField processes `bigint` primitives.\n\t * - `Array`: Resolves recursively.\n\t * @param resolvable The value to resolve.\n\t * @returns The resolved value.\n\t */\n\tpublic resolve(resolvable: ValueResolvable<this>): ValueType<this> {\n\t\tswitch (typeof resolvable) {\n\t\t\tcase 'string':\n\t\t\t\tif ((resolvable as string) in this.flags) return this.flags[resolvable as keyof Flags] as any;\n\t\t\t\tthrow new RangeError('Received a name that could not be resolved to a property of flags');\n\t\t\tcase this.type:\n\t\t\t\treturn ((resolvable as ValueType<this>) & this.mask) as any;\n\t\t\tcase 'object':\n\t\t\t\tif (Array.isArray(resolvable)) return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);\n\t\t\t\tthrow new TypeError('Received an object value that is not an Array');\n\t\t\tdefault:\n\t\t\t\tthrow new TypeError(`Received a value that is not either type \"string\", type \"${this.type}\", or an Array`);\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether or not `field` contains any of the bits from `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` has any of `bits`'s bits, also denoted as `A ∩ B ≠ ∅`.\n\t */\n\tpublic any(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\treturn (this.resolve(field) & this.resolve(bits)) !== this.zero;\n\t}\n\n\t/**\n\t * Checks whether or not `field` is a superset of or equal to `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` is a superset of or equal to `bits`, also denoted as `A ⊇ B`.\n\t */\n\tpublic has(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\tconst resolved = this.resolve(bits);\n\t\treturn (this.resolve(field) & resolved) === resolved;\n\t}\n\n\t/**\n\t * Makes the complement of `field`, which is a field of all bits (of `U` or the union of all {@link Flags} bits)\n\t * that do not belong to `A`. It is the result of `U ∖ A`, or `difference(U, field)`.\n\t * @param field The bits to get the complement of.\n\t * @returns The complement of `field`, also denoted `Aᶜ` or `A'`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.complement(0b0100);\n\t * // 0b1011\n\t * ```\n\t */\n\tpublic complement(field: ValueResolvable<this>): ValueType<this> {\n\t\treturn this.difference(this.mask, field);\n\t}\n\n\t/**\n\t * Makes a union of all the bits.\n\t * @param fields The bits to create a union of.\n\t * @returns The result of combining all bits together, also denoted as `∅ ⋃ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.union(0b0001, 0b0100);\n\t * // 0b0101\n\t *\n\t * bitfield.union(0b1100, 0b0001, 0b0010);\n\t * // 0b1111\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Union_(set_theory)}\n\t */\n\tpublic union(...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.zero as ValueType<this>;\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field | this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Makes an intersection of all the bits.\n\t * @param bitfield The first field.\n\t * @param fields The bits to intersect with `bitfield`.\n\t * @returns The result of intersecting `bitfield` with all of the `fields`, also denoted as `A ⋂ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.intersection(0b0001, 0b0100);\n\t * // 0b0000\n\t *\n\t * bitfield.intersection(0b1100, 0b0100);\n\t * // 0b0100\n\t *\n\t * bitfield.intersection(0b1101, 0b0101, 0b1100);\n\t * // 0b0100\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Intersection_(set_theory)}\n\t */\n\tpublic intersection(bitfield: ValueResolvable<this>, ...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.resolve(bitfield);\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field & this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Removes from `a` the bits that exist in `b`.\n\t * @param a The first field.\n\t * @param b The bits to remove from `a`.\n\t * @returns The result of `a ∖ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.difference(0b1100, 0b0100);\n\t * // 0b1000\n\t *\n\t * bitfield.difference(0b1111, 0b0110);\n\t * // 0b1001\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Difference_(set_theory)}\n\t */\n\tpublic difference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) & ~this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Computes the symmetric difference, denoted as `A ⊖ B` or `A Δ B`, which is the disjunctive union, or the set of\n\t * elements which are in either of the sets, but not in their intersection. As such, this is the result of\n\t * `(A ∖ B) ∪ (B ∖ A)`, `union(difference(a, b), difference(b, a))`, or `a ⊕ b`.\n\t * @remarks The empty set (`∅`) is neutral, as such, `A Δ ∅ = A` and `A Δ A = ∅`\n\t * @param a The first field.\n\t * @param b The second field.\n\t * @returns The result of computing `a Δ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.symmetricDifference(0b1100, 0b0011);\n\t * // 0b1111\n\t *\n\t * bitfield.symmetricDifference(0b1101, 0b1011);\n\t * // 0b0110\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Symmetric_difference}\n\t */\n\tpublic symmetricDifference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) ^ this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Retrieves an array of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an array.\n\t * @returns The names of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toArray(0b0101);\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic toArray(field: ValueResolvable<this>): (keyof Flags)[] {\n\t\treturn [...this.toKeys(field)];\n\t}\n\n\t/**\n\t * Retrieves an iterator of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the keys of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toKeys(0b0101)];\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic *toKeys(field: ValueResolvable<this>): IterableIterator<keyof Flags> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield key;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the values from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the values of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toValues(0b0101)];\n\t * // [0b0001, 0b0100]\n\t * ```\n\t */\n\tpublic *toValues(field: ValueResolvable<this>): IterableIterator<ValueType<this>> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [_, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield bit as unknown as ValueType<this>;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the entries from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the entries of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toEntries(0b0101)];\n\t * // [['Read', 0b0001], ['Edit', 0b0100]]\n\t * ```\n\t */\n\tpublic *toEntries(field: ValueResolvable<this>): IterableIterator<[key: keyof Flags, value: ValueType<this>]> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield [key, bit as unknown as ValueType<this>];\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an object with the properties from {@link Flags} whose values are boolean denoting whether or not the\n\t * flag's bit is contained in `field`.\n\t * @param field The field to convert to an object.\n\t * @returns An object with the properties of {@link Flags} which values are boolean.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toObject(0b0101);\n\t * // {\n\t * // \tRead: true,\n\t * // \tWrite: false,\n\t * // \tEdit: true,\n\t * // \tDelete: false\n\t * // }\n\t * ```\n\t */\n\tpublic toObject(field: ValueResolvable<this>): Record<keyof Flags, boolean> {\n\t\tconst bits = this.resolve(field);\n\t\treturn Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit])) as Record<keyof Flags, boolean>;\n\t}\n}\n\nexport type PrimitiveType<T> = T extends number ? number : bigint;\n\nexport type MaybeArray<T> = T | readonly T[];\n\n/**\n * Resolves the type of the values the specified {@link BitField} takes.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueType<T> = T extends BitField<infer Flags> ? PrimitiveType<Flags[keyof Flags]> : never;\n\n/**\n * Resolves the possible types accepted by the specified {@link BitField}.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueResolvable<T> = T extends BitField<infer Flags> ? MaybeArray<keyof Flags | PrimitiveType<Flags[keyof Flags]>> : never;\n","/**\n * Converts a TypeScript enum to a 1-way object, stripping out the number keys.\n * @param enumObject The enum to convert\n * @example\n * ```typescript\n * enum Permissions {\n * \tRead: 1 << 0,\n * \tWrite: 1 << 1\n * }\n * // {\n * // \tRead: 1,\n * // \tWrite: 2,\n * // \t1: 'Read',\n * // \t2: 'Write'\n * // }\n *\n * enumToObject(Permissions);\n * // { Read: 1, Write: 2 }\n * ```\n * @returns The mapped object\n */\nexport function enumToObject<T extends object>(enumObject: T): { [K in Exclude<keyof T, `${number}`>]: T[K] } {\n\tconst result = {} as { [K in Exclude<keyof T, `${number}`>]: T[K] };\n\tfor (const [key, value] of Object.entries(enumObject)) {\n\t\tif (Number.isNaN(Number(key))) result[key as Exclude<keyof T, `${number}`>] = value;\n\t}\n\n\treturn result;\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/BitField.ts","../src/lib/utilities.ts"],"names":[],"mappings":"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","sourcesContent":["const FlagEntriesSymbol = Symbol('@sapphire/bitfield.flags.entries');\n\nexport class BitField<Flags extends Record<string, number> | Record<string, bigint>> {\n\tpublic readonly type: Flags[keyof Flags] extends number ? 'number' : 'bigint';\n\tpublic readonly zero: Flags[keyof Flags] extends number ? 0 : 0n;\n\tpublic readonly mask: ValueType<this>;\n\tpublic readonly flags: Flags;\n\tprivate readonly [FlagEntriesSymbol]: readonly [string, Flags[keyof Flags]][];\n\n\tpublic constructor(flags: Readonly<Flags>) {\n\t\tif (typeof flags !== 'object' || flags === null) {\n\t\t\tthrow new TypeError('flags must be a non-null object');\n\t\t}\n\n\t\tconst entries = Object.entries(flags) as [string, Flags[keyof Flags]][];\n\t\tif (entries.length === 0) {\n\t\t\tthrow new TypeError('flags must be a non-empty object');\n\t\t}\n\n\t\tconst type = typeof entries[0][1];\n\t\tif (type !== 'number' && type !== 'bigint') {\n\t\t\tthrow new TypeError('A bitfield can only use numbers or bigints for its values');\n\t\t}\n\n\t\tthis.type = type as any;\n\t\tthis.flags = flags;\n\t\tthis[FlagEntriesSymbol] = entries;\n\n\t\tif (type === 'number') {\n\t\t\tthis.zero = 0 as any;\n\n\t\t\tlet mask = 0;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'number') throw new TypeError(`The property \"${key}\" does not resolve to a number`);\n\t\t\t\tif (value !== (value | 0)) throw new RangeError(`The property \"${key}\" does not resolve to a safe bitfield value`);\n\t\t\t\tif (value <= 0) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t} else {\n\t\t\tthis.zero = 0n as any;\n\n\t\t\tlet mask = 0n;\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tif (typeof value !== 'bigint') throw new TypeError(`The property \"${key}\" does not resolve to a bigint`);\n\t\t\t\tif (value <= 0n) throw new RangeError(`The property \"${key}\" resolves to a non-positive value`);\n\t\t\t\tmask |= value;\n\t\t\t}\n\n\t\t\tthis.mask = mask as any;\n\t\t}\n\t}\n\n\t/**\n\t * Resolves a:\n\t * - `string`: If it's a property of {@link Flags}.\n\t * - `number`: If the BitField processes `number` primitives.\n\t * - `bigint`: If the BitField processes `bigint` primitives.\n\t * - `Array`: Resolves recursively.\n\t * @param resolvable The value to resolve.\n\t * @returns The resolved value.\n\t */\n\tpublic resolve(resolvable: ValueResolvable<this>): ValueType<this> {\n\t\tswitch (typeof resolvable) {\n\t\t\tcase 'string':\n\t\t\t\tif ((resolvable as string) in this.flags) return this.flags[resolvable as keyof Flags] as any;\n\t\t\t\tthrow new RangeError('Received a name that could not be resolved to a property of flags');\n\t\t\tcase this.type:\n\t\t\t\treturn ((resolvable as ValueType<this>) & this.mask) as any;\n\t\t\tcase 'object':\n\t\t\t\tif (Array.isArray(resolvable)) return resolvable.reduce((acc, value) => this.resolve(value) | acc, this.zero);\n\t\t\t\tthrow new TypeError('Received an object value that is not an Array');\n\t\t\tdefault:\n\t\t\t\tthrow new TypeError(`Received a value that is not either type \"string\", type \"${this.type}\", or an Array`);\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether or not `field` contains any of the bits from `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` has any of `bits`'s bits, also denoted as `A ∩ B ≠ ∅`.\n\t */\n\tpublic any(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\treturn (this.resolve(field) & this.resolve(bits)) !== this.zero;\n\t}\n\n\t/**\n\t * Checks whether or not `field` is a superset of or equal to `bits`.\n\t * @param field The bits to compare the bits from.\n\t * @param bits The bits to compare with.\n\t * @returns Whether or not `field` is a superset of or equal to `bits`, also denoted as `A ⊇ B`.\n\t */\n\tpublic has(field: ValueResolvable<this>, bits: ValueResolvable<this>): boolean {\n\t\tconst resolved = this.resolve(bits);\n\t\treturn (this.resolve(field) & resolved) === resolved;\n\t}\n\n\t/**\n\t * Makes the complement of `field`, which is a field of all bits (of `U` or the union of all {@link Flags} bits)\n\t * that do not belong to `A`. It is the result of `U ∖ A`, or `difference(U, field)`.\n\t * @param field The bits to get the complement of.\n\t * @returns The complement of `field`, also denoted `Aᶜ` or `A'`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.complement(0b0100);\n\t * // 0b1011\n\t * ```\n\t */\n\tpublic complement(field: ValueResolvable<this>): ValueType<this> {\n\t\treturn this.difference(this.mask, field);\n\t}\n\n\t/**\n\t * Makes a union of all the bits.\n\t * @param fields The bits to create a union of.\n\t * @returns The result of combining all bits together, also denoted as `∅ ⋃ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.union(0b0001, 0b0100);\n\t * // 0b0101\n\t *\n\t * bitfield.union(0b1100, 0b0001, 0b0010);\n\t * // 0b1111\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Union_(set_theory)}\n\t */\n\tpublic union(...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.zero as ValueType<this>;\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field | this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Makes an intersection of all the bits.\n\t * @param bitfield The first field.\n\t * @param fields The bits to intersect with `bitfield`.\n\t * @returns The result of intersecting `bitfield` with all of the `fields`, also denoted as `A ⋂ fields`.\n\t * @example\n\t * ```typescript\n\t * bitfield.intersection(0b0001, 0b0100);\n\t * // 0b0000\n\t *\n\t * bitfield.intersection(0b1100, 0b0100);\n\t * // 0b0100\n\t *\n\t * bitfield.intersection(0b1101, 0b0101, 0b1100);\n\t * // 0b0100\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Intersection_(set_theory)}\n\t */\n\tpublic intersection(bitfield: ValueResolvable<this>, ...fields: readonly ValueResolvable<this>[]): ValueType<this> {\n\t\tlet field = this.resolve(bitfield);\n\t\tfor (const resolvable of fields) {\n\t\t\tfield = (field & this.resolve(resolvable)) as ValueType<this>;\n\t\t}\n\n\t\treturn field;\n\t}\n\n\t/**\n\t * Removes from `a` the bits that exist in `b`.\n\t * @param a The first field.\n\t * @param b The bits to remove from `a`.\n\t * @returns The result of `a ∖ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.difference(0b1100, 0b0100);\n\t * // 0b1000\n\t *\n\t * bitfield.difference(0b1111, 0b0110);\n\t * // 0b1001\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Difference_(set_theory)}\n\t */\n\tpublic difference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) & ~this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Computes the symmetric difference, denoted as `A ⊖ B` or `A Δ B`, which is the disjunctive union, or the set of\n\t * elements which are in either of the sets, but not in their intersection. As such, this is the result of\n\t * `(A ∖ B) ∪ (B ∖ A)`, `union(difference(a, b), difference(b, a))`, or `a ⊕ b`.\n\t * @remarks The empty set (`∅`) is neutral, as such, `A Δ ∅ = A` and `A Δ A = ∅`\n\t * @param a The first field.\n\t * @param b The second field.\n\t * @returns The result of computing `a Δ b`.\n\t * @example\n\t * ```typescript\n\t * bitfield.symmetricDifference(0b1100, 0b0011);\n\t * // 0b1111\n\t *\n\t * bitfield.symmetricDifference(0b1101, 0b1011);\n\t * // 0b0110\n\t * ```\n\t * @seealso {@link https://en.wikipedia.org/wiki/Symmetric_difference}\n\t */\n\tpublic symmetricDifference(a: ValueResolvable<this>, b: ValueResolvable<this>): ValueType<this> {\n\t\treturn (this.resolve(a) ^ this.resolve(b)) as ValueType<this>;\n\t}\n\n\t/**\n\t * Retrieves an array of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an array.\n\t * @returns The names of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toArray(0b0101);\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic toArray(field: ValueResolvable<this>): (keyof Flags)[] {\n\t\treturn [...this.toKeys(field)];\n\t}\n\n\t/**\n\t * Retrieves an iterator of the properties from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the keys of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toKeys(0b0101)];\n\t * // ['Read', 'Edit']\n\t * ```\n\t */\n\tpublic *toKeys(field: ValueResolvable<this>): IterableIterator<keyof Flags> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield key;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the values from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the values of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toValues(0b0101)];\n\t * // [0b0001, 0b0100]\n\t * ```\n\t */\n\tpublic *toValues(field: ValueResolvable<this>): IterableIterator<ValueType<this>> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [_, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield bit as unknown as ValueType<this>;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an iterator of the entries from {@link Flags} whose values are contained in `field`.\n\t * @param field The field to convert to an iterator.\n\t * @returns An iterator with the entries of the {@link BitField}'s flag properties whose value are contained in `field`.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * [...bitfield.toEntries(0b0101)];\n\t * // [['Read', 0b0001], ['Edit', 0b0100]]\n\t * ```\n\t */\n\tpublic *toEntries(field: ValueResolvable<this>): IterableIterator<[key: keyof Flags, value: ValueType<this>]> {\n\t\tconst bits = this.resolve(field);\n\t\tfor (const [key, bit] of this[FlagEntriesSymbol]) {\n\t\t\t// Inline `.has` code for lower overhead:\n\t\t\tif ((bits & bit) === bit) yield [key, bit as unknown as ValueType<this>];\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves an object with the properties from {@link Flags} whose values are boolean denoting whether or not the\n\t * flag's bit is contained in `field`.\n\t * @param field The field to convert to an object.\n\t * @returns An object with the properties of {@link Flags} which values are boolean.\n\t * @example\n\t * ```typescript\n\t * const bitfield = new BitField({\n\t * \tRead: 0b0001,\n\t * \tWrite: 0b0010,\n\t * \tEdit: 0b0100,\n\t * \tDelete: 0b1000\n\t * });\n\t *\n\t * bitfield.toObject(0b0101);\n\t * // {\n\t * // \tRead: true,\n\t * // \tWrite: false,\n\t * // \tEdit: true,\n\t * // \tDelete: false\n\t * // }\n\t * ```\n\t */\n\tpublic toObject(field: ValueResolvable<this>): Record<keyof Flags, boolean> {\n\t\tconst bits = this.resolve(field);\n\t\treturn Object.fromEntries(this[FlagEntriesSymbol].map(([key, bit]) => [key, (bits & bit) === bit])) as Record<keyof Flags, boolean>;\n\t}\n}\n\nexport type PrimitiveType<T> = T extends number ? number : bigint;\n\nexport type MaybeArray<T> = T | readonly T[];\n\n/**\n * Resolves the type of the values the specified {@link BitField} takes.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueType<T> = T extends BitField<infer Flags> ? PrimitiveType<Flags[keyof Flags]> : never;\n\n/**\n * Resolves the possible types accepted by the specified {@link BitField}.\n * @typeparam A {@link BitField} instance type.\n */\nexport type ValueResolvable<T> = T extends BitField<infer Flags> ? MaybeArray<keyof Flags | PrimitiveType<Flags[keyof Flags]>> : never;\n","/**\n * Converts a TypeScript enum to a 1-way object, stripping out the number keys.\n * @param enumObject The enum to convert\n * @example\n * ```typescript\n * enum Permissions {\n * \tRead: 1 << 0,\n * \tWrite: 1 << 1\n * }\n * // {\n * // \tRead: 1,\n * // \tWrite: 2,\n * // \t1: 'Read',\n * // \t2: 'Write'\n * // }\n *\n * enumToObject(Permissions);\n * // { Read: 1, Write: 2 }\n * ```\n * @returns The mapped object\n */\nexport function enumToObject<T extends object>(enumObject: T): { [K in Exclude<keyof T, `${number}`>]: T[K] } {\n\tconst result = {} as { [K in Exclude<keyof T, `${number}`>]: T[K] };\n\tfor (const [key, value] of Object.entries(enumObject)) {\n\t\tif (Number.isNaN(Number(key))) result[key as Exclude<keyof T, `${number}`>] = value;\n\t}\n\n\treturn result;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapphire/bitfield",
3
- "version": "1.2.0",
3
+ "version": "1.2.1-next.08908f25.0",
4
4
  "description": "A bitfield utility library for JavaScript.",
5
5
  "author": "@sapphire",
6
6
  "license": "MIT",
@@ -57,12 +57,12 @@
57
57
  "access": "public"
58
58
  },
59
59
  "devDependencies": {
60
- "@favware/cliff-jumper": "^2.0.1",
61
- "@vitest/coverage-c8": "^0.31.1",
62
- "tsup": "^6.7.0",
63
- "typedoc": "^0.24.7",
64
- "typedoc-json-parser": "^8.1.2",
65
- "typescript": "^5.0.4",
66
- "vitest": "^0.31.1"
60
+ "@favware/cliff-jumper": "^2.1.1",
61
+ "@vitest/coverage-v8": "^0.34.3",
62
+ "tsup": "^7.2.0",
63
+ "typedoc": "^0.25.0",
64
+ "typedoc-json-parser": "^8.2.0",
65
+ "typescript": "^5.2.2",
66
+ "vitest": "^0.34.3"
67
67
  }
68
68
  }