@bodil/bdb 0.1.3 → 0.2.1

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.
package/dist/table.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"table.js","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type IndexablePrimitive = string | number | null | undefined | bigint;
1
+ export type IndexablePrimitive = string | number | bigint;
2
2
  export type IndexableType = IndexablePrimitive | Array<IndexablePrimitive> | ReadonlyArray<IndexablePrimitive>;
3
3
  export type CustomIndexablesOf<A, T> = string & keyof A & {
4
4
  [Key in keyof A]: A[Key] extends T ? Key : never;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bodil/bdb",
3
- "version": "0.1.3",
3
+ "version": "0.2.1",
4
4
  "description": "A signal enabled database",
5
5
  "homepage": "https://codeberg.org/bodil/bdb",
6
6
  "repository": {
@@ -28,7 +28,7 @@
28
28
  "dependencies": {
29
29
  "@bodil/core": "^0.5.2",
30
30
  "@bodil/opt": "^1.0.0",
31
- "@bodil/signal": "^0.5.1",
31
+ "@bodil/signal": "^0.5.2",
32
32
  "immer": "^11.1.3",
33
33
  "sorted-btree": "2.1.0"
34
34
  },
@@ -41,7 +41,7 @@
41
41
  "@typhonjs-typedoc/ts-lib-docs": "^2024.12.25",
42
42
  "eslint": "^9.39.2",
43
43
  "eslint-config-prettier": "^10.1.8",
44
- "eslint-plugin-jsdoc": "^61.5.0",
44
+ "eslint-plugin-jsdoc": "^61.7.1",
45
45
  "fake-indexeddb": "^6.2.5",
46
46
  "globals": "^17.0.0",
47
47
  "npm-run-all2": "^8.0.4",
package/src/backend.ts CHANGED
@@ -4,9 +4,18 @@ import type { IndexablePrimitive } from "./types";
4
4
 
5
5
  export type DatabaseBroadcast = { event: "update" | "delete"; table: string; key: unknown };
6
6
 
7
+ /**
8
+ * Configuration for IndexedDB backends.
9
+ */
7
10
  export type IndexedDBBackendConfig = {
11
+ /** Name of the IndexedDB database to connect to. */
8
12
  name: string;
13
+ /** Version number of the database. */
9
14
  version: number;
15
+ /**
16
+ * Name of the IndexedDB database table to store our database in. Defaults
17
+ * to `"store"`.
18
+ */
10
19
  table?: string;
11
20
  };
12
21
 
@@ -27,6 +36,9 @@ function unpackRecord<A = unknown>(record: StorageRecord): A {
27
36
  return deserialise(record.value) as A;
28
37
  }
29
38
 
39
+ /**
40
+ * Base class for storage backends.
41
+ */
30
42
  export abstract class StorageBackend {
31
43
  readonly name: string;
32
44
 
@@ -49,12 +61,36 @@ export abstract class StorageBackend {
49
61
  }
50
62
  }
51
63
 
64
+ /**
65
+ * Storage backend using an IndexedDB database.
66
+ *
67
+ * Use {@link IndexedDBBackend.open} to obtain a storage backend connected to
68
+ * the specified IndexedDB database.
69
+ *
70
+ * @example
71
+ * // Connect to the IndexedDB database.
72
+ * const storage = await IndexedDBBackend.open("my-docs", 1);
73
+ * // Declare a document type.
74
+ * type Document = { id: string; value: number };
75
+ * // Create the table.
76
+ * const docs = Table.create<Document>()
77
+ * .withPrimaryKey(index<Document>().key("id"))
78
+ * // Connect the table to our storage.
79
+ * .withStorage(storage);
80
+ * // Wait until the table has finished syncing with the storage.
81
+ * await docs.ready;
82
+ * // Ready for use!
83
+ * docs.add({ id: "Robert", value: 9001 });
84
+ */
52
85
  export class IndexedDBBackend extends StorageBackend {
53
86
  private db?: IDBDatabase;
54
87
 
55
88
  readonly version: number;
56
89
  readonly table: string;
57
90
 
91
+ /**
92
+ * Connect to an IndexedDB database.
93
+ */
58
94
  static async open(config: IndexedDBBackendConfig): Promise<IndexedDBBackend> {
59
95
  const c = { ...backendConfigDefaults, ...config };
60
96
  const storage = new IndexedDBBackend(c.name, c.version, c.table);
@@ -107,6 +143,7 @@ export class IndexedDBBackend extends StorageBackend {
107
143
  });
108
144
  }
109
145
 
146
+ /** @internal */
110
147
  async get<A = unknown>(table: string, key: unknown): Promise<A> {
111
148
  const value: StorageRecord = await this.transaction("readonly", (store) => {
112
149
  return request(store.get([table, key] as IDBValidKey));
@@ -114,6 +151,7 @@ export class IndexedDBBackend extends StorageBackend {
114
151
  return unpackRecord(value);
115
152
  }
116
153
 
154
+ /** @internal */
117
155
  async getAll<A = unknown>(table: string): Promise<Array<A>> {
118
156
  const values = await this.transaction("readonly", (store) => {
119
157
  return request(store.index("table").getAll(table));
@@ -121,6 +159,7 @@ export class IndexedDBBackend extends StorageBackend {
121
159
  return (values as Array<StorageRecord>).map(unpackRecord<A>);
122
160
  }
123
161
 
162
+ /** @internal */
124
163
  async update(table: string, key: unknown, value: unknown): Promise<void> {
125
164
  await this.transaction("readwrite", (store) => {
126
165
  return request(store.put({ table, key, value: serialise(value) }));
@@ -128,6 +167,7 @@ export class IndexedDBBackend extends StorageBackend {
128
167
  this.broadcast?.send({ event: "update", table, key });
129
168
  }
130
169
 
170
+ /** @internal */
131
171
  async delete(table: string, key: unknown): Promise<void> {
132
172
  await this.transaction("readwrite", (store) => {
133
173
  return request(store.delete([table, key as IDBValidKey]));
package/src/index.test.ts CHANGED
@@ -6,7 +6,7 @@ import { sleep } from "@bodil/core/async";
6
6
  import { Signal } from "@bodil/signal";
7
7
  import { expect, expectTypeOf, test } from "vitest";
8
8
 
9
- import { arrayIndex, compoundIndex, createTable, index, timeIndex } from ".";
9
+ import { index, Table } from ".";
10
10
  import { IndexedDBBackend } from "./backend";
11
11
  import type { IndexablesOf } from "./types";
12
12
 
@@ -34,11 +34,12 @@ test("memdb basics", () => {
34
34
  tags: Array<string>;
35
35
  };
36
36
 
37
- const table = createTable<TestItem>()(index<TestItem>()("id"))
38
- .withIndex(timeIndex<TestItem>()("created"))
39
- .withIndex(index<TestItem>()("uri"))
40
- .withIndex(arrayIndex<TestItem>()("tags"))
41
- .withIndex(compoundIndex<TestItem>()("id", "uri"));
37
+ const table = Table.create<TestItem>()
38
+ .withPrimaryIndex(index<TestItem>().key("id"))
39
+ .withIndex(index<TestItem>().time("created"))
40
+ .withIndex(index<TestItem>().key("uri"))
41
+ .withIndex(index<TestItem>().array("tags"))
42
+ .withIndex(index<TestItem>().keys("id", "uri"));
42
43
 
43
44
  const now = time.now();
44
45
  const [welp, wolp, wulp, wilp] = [
@@ -115,9 +116,9 @@ test("memdb basics", () => {
115
116
 
116
117
  test("memdb index dupes", () => {
117
118
  type Account = { id: string; order: number };
118
- const accounts = createTable<Account>()(index<Account>()("id")).withIndex(
119
- index<Account>()("order"),
120
- );
119
+ const accounts = Table.create<Account>()
120
+ .withPrimaryIndex(index<Account>().key("id"))
121
+ .withIndex(index<Account>().key("order"));
121
122
 
122
123
  const account = { id: "test@test.com", order: 1 };
123
124
  accounts.add({ ...account });
@@ -128,10 +129,10 @@ test("memdb index dupes", () => {
128
129
 
129
130
  test("memdb signals", () => {
130
131
  type Thing = { name: string; counter: number };
131
- const things = createTable<Thing>()(index<Thing>()("name"));
132
+ const things = Table.create<Thing>().withPrimaryIndex(index<Thing>().key("name"));
132
133
 
133
134
  type ThingMap = { id: number; name: string };
134
- const thingMaps = createTable<ThingMap>()(index<ThingMap>()("id"));
135
+ const thingMaps = Table.create<ThingMap>().withPrimaryIndex(index<ThingMap>().key("id"));
135
136
  thingMaps.add({ id: 1, name: "Mike" }, { id: 2, name: "Robert" });
136
137
 
137
138
  const joe = things.signal("Joe");
@@ -163,7 +164,7 @@ test("memdb signals", () => {
163
164
 
164
165
  test("failed update shouldn't change anything", () => {
165
166
  type Thing = { name: string; counter: number };
166
- const things = createTable<Thing>()(index<Thing>()("name"));
167
+ const things = Table.create<Thing>().withPrimaryIndex(index<Thing>().key("name"));
167
168
 
168
169
  things.add({ name: "Joe", counter: 321 });
169
170
  expect(() =>
@@ -181,8 +182,9 @@ test("IndexedDB", async () => {
181
182
  const before = now.subtract(time.seconds(25));
182
183
  {
183
184
  const store = await IndexedDBBackend.open({ name: "test", version: 1 });
184
- const things = createTable<Thing>()(index<Thing>()("key"))
185
- .withIndex(timeIndex<Thing>()("time"))
185
+ const things = Table.create<Thing>()
186
+ .withPrimaryIndex(index<Thing>().key("key"))
187
+ .withIndex(index<Thing>().time("time"))
186
188
  .withStorage(store, "things");
187
189
  await things.ready;
188
190
  things.add(
@@ -199,8 +201,9 @@ test("IndexedDB", async () => {
199
201
  }
200
202
  {
201
203
  const store = await IndexedDBBackend.open({ name: "test", version: 1 });
202
- const things = createTable<Thing>()(index<Thing>()("key"))
203
- .withIndex(timeIndex<Thing>()("time"))
204
+ const things = Table.create<Thing>()
205
+ .withPrimaryIndex(index<Thing>().key("key"))
206
+ .withIndex(index<Thing>().time("time"))
204
207
  .withStorage(store, "things");
205
208
  await things.ready;
206
209
  expect(things.get("Joe")).deep.equal({ key: "Joe", value: "Armstrong", time: now });
@@ -213,7 +216,9 @@ test("IndexedDB", async () => {
213
216
 
214
217
  test("query.below/query.above", () => {
215
218
  type Item = { id: string; value: number };
216
- const table = createTable<Item>()(index<Item>()("id")).withIndex(index<Item>()("value"));
219
+ const table = Table.create<Item>()
220
+ .withPrimaryIndex(index<Item>().key("id"))
221
+ .withIndex(index<Item>().key("value"));
217
222
  table.add(
218
223
  { id: "1", value: 1 },
219
224
  { id: "2", value: 2 },
@@ -252,3 +257,83 @@ test("query.below/query.above", () => {
252
257
  .map((i) => i.value),
253
258
  ).toEqual([3, 4, 5]);
254
259
  });
260
+
261
+ test("query.delete()", () => {
262
+ type Doc = { id: number };
263
+ const table = Table.create<Doc>().withPrimaryIndex(index<Doc>().key("id"));
264
+ for (let id = 0; id < 10; id++) {
265
+ table.add({ id });
266
+ }
267
+
268
+ const ids = table
269
+ .where("id")
270
+ .signal()
271
+ .map((docs) => docs.map((doc) => doc.id));
272
+ expect(ids.get()).toEqual([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
273
+
274
+ expect(table.where("id").above(5).delete()).toEqual(4);
275
+ expect(
276
+ Iterator.from(table)
277
+ .map((doc) => doc.id)
278
+ .toArray(),
279
+ ).toEqual([0, 1, 2, 3, 4, 5]);
280
+ });
281
+
282
+ test("table.changed", () => {
283
+ type Doc = { id: number };
284
+ const table = Table.create<Doc>().withPrimaryIndex(index<Doc>().key("id"));
285
+ let counter = 0;
286
+ const sig = Signal.computed(() => {
287
+ table.changed.get();
288
+ counter++;
289
+ return counter;
290
+ });
291
+ expect(sig.get()).toBe(1);
292
+ table.add({ id: 1 });
293
+ expect(sig.get()).toBe(2);
294
+ table.delete(2);
295
+ expect(sig.get()).toBe(2);
296
+ table.delete(1);
297
+ expect(sig.get()).toBe(3);
298
+ });
299
+
300
+ test("query signals", () => {
301
+ type Doc = { id: number };
302
+ const table = Table.create<Doc>().withPrimaryIndex(index<Doc>().key("id"));
303
+ for (let id = 0; id < 10; id++) {
304
+ table.add({ id });
305
+ }
306
+
307
+ const ids = table
308
+ .where("id")
309
+ .above(5)
310
+ .signal()
311
+ .map((docs) => docs.map((doc) => doc.id));
312
+ expect(ids.get()).toEqual([6, 7, 8, 9]);
313
+
314
+ let updates = 0;
315
+ const updated = Signal.computed(() => {
316
+ ids.get();
317
+ return updates++;
318
+ });
319
+ expect(updated.get()).toEqual(0);
320
+
321
+ // make a lot of changes inside and outside the query
322
+ table.add({ id: 10 }, { id: 0 });
323
+ table.delete(3, 7);
324
+ // query should show all the changes
325
+ expect(ids.get()).toEqual([6, 8, 9, 10]);
326
+ expect(updated.get()).toEqual(1);
327
+
328
+ // delete a document outside the query
329
+ table.delete(5);
330
+ // query should not update
331
+ expect(ids.get()).toEqual([6, 8, 9, 10]);
332
+ expect(updated.get()).toEqual(1);
333
+
334
+ // delete a document inside the query
335
+ table.delete(9);
336
+ // query should update
337
+ expect(ids.get()).toEqual([6, 8, 10]);
338
+ expect(updated.get()).toEqual(2);
339
+ });
package/src/index.ts CHANGED
@@ -1,8 +1,7 @@
1
1
  import type { OrderFn } from "@bodil/core/order";
2
2
  import BTree from "sorted-btree";
3
3
 
4
- import { ArrayIndex, CompoundIndex, CustomIndex, PrimitiveIndex, type UnitIndex } from "./indices";
5
- import { Table } from "./table";
4
+ import { ArrayIndex, CompoundIndex, CustomIndex, PrimitiveIndex } from "./indices";
6
5
  import type { ArrayIndexablesOf, CustomIndexablesOf, PrimitiveIndexablesOf } from "./types";
7
6
 
8
7
  export type {
@@ -19,58 +18,126 @@ export type {
19
18
  CustomIndexablesOf,
20
19
  PrimitiveIndexablesOf,
21
20
  } from "./types";
22
- export type { Table, TableEvent } from "./table";
21
+ export { Table, type TableEvent } from "./table";
23
22
  export type { IndexQuery, ArrayQuery, ChainQuery } from "./query";
24
23
  export type { Broadcaster } from "./broadcast";
25
24
  export type { IndexedDBBackendConfig, DatabaseBroadcast } from "./backend";
26
25
 
27
26
  export { StorageBackend, IndexedDBBackend } from "./backend";
28
27
 
29
- export function createTable<A extends object>(): <PI extends UnitIndex<A>>(
30
- primaryIndex: PI,
31
- ) => Table<A, PI, PI["record"]> {
32
- return (primaryIndex) => new Table(primaryIndex);
33
- }
28
+ /**
29
+ * Constructor functions for creating an {@link index}.
30
+ * @interface
31
+ */
32
+ export type IndexConstructor<Document extends object> = {
33
+ /**
34
+ * Create an index for a single property on a document.
35
+ *
36
+ * The type of the property needs to match {@link IndexablePrimitive}, ie.
37
+ * it needs to be a string, a number or a bigint. If you need an index for a
38
+ * different value type, use {@link IndexConstructor.custom}.
39
+ *
40
+ * @example
41
+ * type Document = { id: string; value: number };
42
+ * const index = index<Document>().key("id");
43
+ */
44
+ key: <I extends PrimitiveIndexablesOf<Document>>(key: I) => PrimitiveIndex<Document, I>;
34
45
 
35
- export function index<A extends object>(): <I extends PrimitiveIndexablesOf<A>>(
36
- key: I,
37
- ) => PrimitiveIndex<A, I> {
38
- return (key) => new PrimitiveIndex(key);
39
- }
46
+ /**
47
+ * Create a compound index for a pair of properties on a document.
48
+ *
49
+ * The types of the properties need to match {@link IndexablePrimitive}, ie.
50
+ * they need to be strings, numbers or bigints.
51
+ *
52
+ * This index matches documents where both properties match the provided
53
+ * pair of values. Partial matches do not count.
54
+ *
55
+ * Whemn a compound index is used as a primary index, the unique key is the
56
+ * value pair, not either of the individual values, so you can have multiple
57
+ * documents with either one of the properties having identical values, but
58
+ * only one document matching any one given value pair.
59
+ *
60
+ * @example
61
+ * type Document = { id: string; value: number };
62
+ * const compoundIndex = index<Document>().keys("id", "value");
63
+ */
64
+ keys: <
65
+ I extends PrimitiveIndexablesOf<Document>,
66
+ J extends Exclude<PrimitiveIndexablesOf<Document>, I>,
67
+ >(
68
+ leftKey: I,
69
+ rightKey: J,
70
+ ) => CompoundIndex<Document, I, J>;
40
71
 
41
- export function timeIndex<A extends object>(): <I extends CustomIndexablesOf<A, Temporal.Instant>>(
42
- key: I,
43
- ) => CustomIndex<A, Temporal.Instant, I> {
44
- return (key) =>
45
- new CustomIndex(
46
- key,
47
- () => new BTree(undefined, Temporal.Instant.compare as OrderFn<A[typeof key]>),
48
- );
49
- }
72
+ /**
73
+ * Create an array index for a property on a document.
74
+ *
75
+ * This index works on a property with an array of
76
+ * {@link IndexablePrimitive}s. It will match documents where the lookup
77
+ * value is a member of the array.
78
+ *
79
+ * @example
80
+ * type Document = { id: string; flags: Array<string> };
81
+ * const arrayIndex = index<Document>().array("flags");
82
+ */
83
+ array: <I extends ArrayIndexablesOf<Document>, L extends Document[I] & Array<unknown>>(
84
+ key: I,
85
+ ) => ArrayIndex<Document, I, L>;
50
86
 
51
- export function arrayIndex<A extends object>(): <
52
- I extends ArrayIndexablesOf<A>,
53
- L extends A[I] & Array<unknown>,
54
- >(
55
- key: I,
56
- ) => ArrayIndex<A, I, L> {
57
- return (key) => new ArrayIndex(key);
58
- }
87
+ /**
88
+ * Create an index for a {@link Temporal.Instant} property on a document.
89
+ *
90
+ * This works exactly like {@link IndexConstructor.key}, except that it
91
+ * takes a {@link Temporal.Instant} instead of a primitive value.
92
+ */
93
+ time: <I extends CustomIndexablesOf<Document, Temporal.Instant>>(
94
+ key: I,
95
+ ) => CustomIndex<Document, Temporal.Instant, I>;
59
96
 
60
- export function compoundIndex<A extends object>(): <
61
- I extends PrimitiveIndexablesOf<A>,
62
- J extends Exclude<PrimitiveIndexablesOf<A>, I>,
63
- >(
64
- leftKey: I,
65
- rightKey: J,
66
- ) => CompoundIndex<A, I, J> {
67
- return (leftKey, rightKey) => new CompoundIndex(leftKey, rightKey);
68
- }
97
+ /**
98
+ * Create an index with a custom ordering function for a property on a
99
+ * document.
100
+ *
101
+ * This works like {@link IndexConstructor.key}, except that it takes any
102
+ * value rather than just a primitive, as long as you provide an
103
+ * {@link OrderFn | ordering function} for it.
104
+ */
105
+ custom: <T, I extends CustomIndexablesOf<Document, T>>(
106
+ key: I,
107
+ orderFn: OrderFn<T>,
108
+ ) => CustomIndex<Document, T, I>;
109
+ };
110
+
111
+ const indexConstructor = Symbol("indexConstructor");
69
112
 
70
- export function customIndex<A extends object, T>(): <I extends CustomIndexablesOf<A, T>>(
71
- key: I,
72
- orderFn: OrderFn<T>,
73
- ) => CustomIndex<A, T, I> {
74
- return (key, orderFn: OrderFn<T>) =>
75
- new CustomIndex(key, () => new BTree(undefined, orderFn as OrderFn<A[typeof key]>));
113
+ /**
114
+ * Create an index.
115
+ *
116
+ * This function takes a document type as its type argument, and returns an
117
+ * object with a selection of {@link IndexConstructor}s which allow you to
118
+ * create an index for the given document type.
119
+ *
120
+ * @example
121
+ * type Document = { id: string; timestamp: Temporal.Instant };
122
+ * const idIndex = index<Document>().key("id");
123
+ * const timeIndex = index<Document>().time("timestamp");
124
+ */
125
+ export function index<Document extends object>(): IndexConstructor<Document> {
126
+ (index as any)[indexConstructor] ??= {
127
+ key: (key) => new PrimitiveIndex(key),
128
+ keys: (leftKey, rightKey) => new CompoundIndex(leftKey, rightKey),
129
+ array: (key) => new ArrayIndex(key),
130
+ time: (key) =>
131
+ new CustomIndex(
132
+ key,
133
+ () =>
134
+ new BTree(undefined, Temporal.Instant.compare as OrderFn<Document[typeof key]>),
135
+ ),
136
+ custom: (key, orderFn) =>
137
+ new CustomIndex(
138
+ key,
139
+ () => new BTree(undefined, orderFn as OrderFn<Document[typeof key]>),
140
+ ),
141
+ } as IndexConstructor<Document>;
142
+ return (index as any)[indexConstructor] as IndexConstructor<Document>;
76
143
  }
package/src/indices.ts CHANGED
@@ -2,6 +2,7 @@ import type BTree from "sorted-btree";
2
2
 
3
3
  import type { ArrayIndexablesOf, CustomIndexablesOf, PrimitiveIndexablesOf } from "./types";
4
4
 
5
+ /** @internal */
5
6
  export abstract class Index<A extends object> {
6
7
  readonly name!: string;
7
8
  readonly keyType!: unknown;
@@ -9,10 +10,12 @@ export abstract class Index<A extends object> {
9
10
  abstract extractKeys(value: A): Array<typeof this.keyType>;
10
11
  }
11
12
 
13
+ /** @internal */
12
14
  export abstract class UnitIndex<A extends object> extends Index<A> {
13
15
  abstract extractKey(value: A): typeof this.keyType;
14
16
  }
15
17
 
18
+ /** @internal */
16
19
  export class CustomIndex<A extends object, T, I extends CustomIndexablesOf<A, T>>
17
20
  implements Index<A>, UnitIndex<A>
18
21
  {
@@ -37,6 +40,7 @@ export class CustomIndex<A extends object, T, I extends CustomIndexablesOf<A, T>
37
40
  }
38
41
  }
39
42
 
43
+ /** @internal */
40
44
  export class PrimitiveIndex<A extends object, I extends PrimitiveIndexablesOf<A>>
41
45
  implements Index<A>, UnitIndex<A>
42
46
  {
@@ -58,12 +62,12 @@ export class PrimitiveIndex<A extends object, I extends PrimitiveIndexablesOf<A>
58
62
  }
59
63
  }
60
64
 
65
+ /** @internal */
61
66
  export class ArrayIndex<
62
67
  A extends object,
63
68
  I extends ArrayIndexablesOf<A>,
64
69
  L extends A[I] & Array<unknown>,
65
- > implements Index<A>
66
- {
70
+ > implements Index<A> {
67
71
  readonly index: I;
68
72
  readonly name: `*${I}`;
69
73
  readonly keyType!: L[number];
@@ -79,11 +83,12 @@ export class ArrayIndex<
79
83
  }
80
84
  }
81
85
 
86
+ /** @internal */
82
87
  export class CompoundIndex<
83
- A extends object,
84
- I extends PrimitiveIndexablesOf<A>,
85
- J extends Exclude<PrimitiveIndexablesOf<A>, I>,
86
- >
88
+ A extends object,
89
+ I extends PrimitiveIndexablesOf<A>,
90
+ J extends Exclude<PrimitiveIndexablesOf<A>, I>,
91
+ >
87
92
  implements Index<A>, UnitIndex<A>
88
93
  {
89
94
  readonly leftIndex: I;