atom.io 0.24.8 → 0.25.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.
Files changed (38) hide show
  1. package/data/dist/index.cjs +40 -62
  2. package/data/dist/index.d.ts +3 -3
  3. package/data/dist/index.js +41 -63
  4. package/data/src/join.ts +47 -64
  5. package/dist/index.cjs +26 -8
  6. package/dist/index.d.ts +37 -15
  7. package/dist/index.js +27 -9
  8. package/internal/dist/index.cjs +223 -111
  9. package/internal/dist/index.d.ts +12 -6
  10. package/internal/dist/index.js +224 -113
  11. package/internal/src/families/dispose-from-store.ts +56 -3
  12. package/internal/src/get-state/get-from-store.ts +58 -25
  13. package/internal/src/lineage.ts +7 -0
  14. package/internal/src/molecule/make-molecule-in-store.ts +75 -31
  15. package/internal/src/not-found-error.ts +29 -6
  16. package/internal/src/selector/create-writable-selector.ts +5 -5
  17. package/internal/src/selector/register-selector.ts +58 -9
  18. package/internal/src/set-state/set-into-store.ts +48 -1
  19. package/internal/src/store/store.ts +4 -4
  20. package/internal/src/transaction/build-transaction.ts +10 -9
  21. package/internal/src/transaction/create-transaction.ts +2 -2
  22. package/internal/src/transaction/index.ts +2 -2
  23. package/package.json +5 -5
  24. package/react/dist/index.cjs +4 -1
  25. package/react/dist/index.js +5 -2
  26. package/react/src/use-o.ts +11 -3
  27. package/realtime/dist/index.cjs +0 -1
  28. package/realtime/dist/index.js +0 -1
  29. package/realtime/src/realtime-continuity.ts +0 -1
  30. package/realtime-server/dist/index.cjs +7 -7
  31. package/realtime-server/dist/index.js +7 -7
  32. package/realtime-server/src/realtime-server-stores/server-room-external-actions.ts +7 -7
  33. package/src/dispose-state.ts +32 -3
  34. package/src/get-state.ts +37 -4
  35. package/src/molecule.ts +20 -7
  36. package/src/set-state.ts +19 -2
  37. package/src/silo.ts +11 -4
  38. package/src/transaction.ts +9 -17
package/data/src/join.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  /* eslint-disable @typescript-eslint/ban-types */
2
2
  import type {
3
+ CtorToolkit,
3
4
  disposeState,
5
+ getState,
4
6
  MoleculeFamilyToken,
5
- MoleculeTransactors,
6
7
  MutableAtomFamily,
7
8
  MutableAtomFamilyToken,
8
9
  Read,
@@ -11,7 +12,8 @@ import type {
11
12
  ReadonlySelectorFamily,
12
13
  ReadonlySelectorToken,
13
14
  RegularAtomFamily,
14
- Transactors,
15
+ setState,
16
+ SetterToolkit,
15
17
  Write,
16
18
  } from "atom.io"
17
19
  import type { findState } from "atom.io/ephemeral"
@@ -33,6 +35,7 @@ import {
33
35
  isChildStore,
34
36
  makeMoleculeInStore,
35
37
  newest,
38
+ NotFoundError,
36
39
  seekInStore,
37
40
  setIntoStore,
38
41
  withdraw,
@@ -141,7 +144,7 @@ export class Join<
141
144
  > {
142
145
  private options: JoinOptions<ASide, BSide, Cardinality, Content>
143
146
  private defaultContent: Content | undefined
144
- private transactors: Transactors & { dispose: typeof disposeState }
147
+ private toolkit: SetterToolkit & { dispose: typeof disposeState }
145
148
  public retrieve: typeof findState
146
149
  public molecules: Map<string, Molecule<any>> = new Map()
147
150
  public relations: Junction<ASide, BSide, Content>
@@ -154,13 +157,13 @@ export class Join<
154
157
  >
155
158
  }
156
159
  public transact(
157
- transactors: Transactors & { dispose: typeof disposeState },
160
+ toolkit: SetterToolkit & { dispose: typeof disposeState },
158
161
  run: (join: Join<ASide, BSide, Cardinality, Content>) => void,
159
162
  ): void {
160
- const originalTransactors = this.transactors
161
- this.transactors = transactors
163
+ const originalToolkit = this.toolkit
164
+ this.toolkit = toolkit
162
165
  run(this)
163
- this.transactors = originalTransactors
166
+ this.toolkit = originalToolkit
164
167
  }
165
168
 
166
169
  public store: Store
@@ -194,23 +197,24 @@ export class Join<
194
197
 
195
198
  this.store.miscResources.set(`join:${options.key}`, this)
196
199
 
197
- this.transactors = {
198
- get: (token) => getFromStore(token, store),
199
- set: (token, value) => {
200
- setIntoStore(token, value, store)
201
- },
200
+ this.toolkit = {
201
+ get: ((...ps: Parameters<typeof getState>) =>
202
+ getFromStore(...ps, store)) as typeof getState,
203
+ set: ((...ps: Parameters<typeof setState>) => {
204
+ setIntoStore(...ps, store)
205
+ }) as typeof setState,
202
206
  find: ((token, key) => findInStore(token, key, store)) as typeof findState,
203
207
  seek: ((token, key) => seekInStore(token, key, store)) as typeof seekState,
204
208
  json: (token) => getJsonToken(token, store),
205
- dispose: (token) => {
206
- disposeFromStore(token, store)
207
- },
209
+ dispose: ((...ps: Parameters<typeof disposeState>) => {
210
+ disposeFromStore(...ps, store)
211
+ }) as typeof disposeState,
208
212
  }
209
213
  this.retrieve = ((
210
214
  token: ReadableFamilyToken<any, any>,
211
215
  key: Json.Serializable,
212
216
  ): ReadableToken<any> => {
213
- const maybeToken = this.transactors.seek(token, key)
217
+ const maybeToken = this.toolkit.seek(token, key)
214
218
  if (maybeToken) {
215
219
  return maybeToken
216
220
  }
@@ -220,7 +224,7 @@ export class Join<
220
224
  return growMoleculeInStore(molecule, family, store)
221
225
  }
222
226
  if (store.config.lifespan === `immortal`) {
223
- throw new Error(`No molecule found for key "${stringifyJson(key)}"`)
227
+ throw new NotFoundError(token, key, store)
224
228
  }
225
229
  return initFamilyMemberInStore(token, key, store)
226
230
  }) as typeof findState
@@ -246,22 +250,22 @@ export class Join<
246
250
  key,
247
251
  ) => get(this.retrieve(relatedKeysAtoms, key))
248
252
  const addRelation: Write<(a: string, b: string) => void> = (
249
- transactors,
253
+ toolkit,
250
254
  a,
251
255
  b,
252
256
  ) => {
253
- const { set } = transactors
257
+ const { set } = toolkit
254
258
  const aKeysState = this.retrieve(relatedKeysAtoms, a)
255
259
  const bKeysState = this.retrieve(relatedKeysAtoms, b)
256
260
  set(aKeysState, (aKeys) => aKeys.add(b))
257
261
  set(bKeysState, (bKeys) => bKeys.add(a))
258
262
  }
259
263
  const deleteRelation: Write<(a: string, b: string) => void> = (
260
- transactors,
264
+ toolkit,
261
265
  a,
262
266
  b,
263
267
  ) => {
264
- const { set } = transactors
268
+ const { set } = toolkit
265
269
  const aKeysState = this.retrieve(relatedKeysAtoms, a)
266
270
  const bKeysState = this.retrieve(relatedKeysAtoms, b)
267
271
  let stringA: string | undefined
@@ -280,24 +284,11 @@ export class Join<
280
284
  }
281
285
  return bKeys
282
286
  })
283
-
284
- if (stringA) {
285
- const molecule = this.molecules.get(stringA)
286
- if (molecule) {
287
- this.transactors.dispose(molecule)
288
- }
289
- }
290
- if (stringB) {
291
- const molecule = this.molecules.get(stringB)
292
- if (molecule) {
293
- this.transactors.dispose(molecule)
294
- }
295
- }
296
287
  }
297
288
  const replaceRelationsSafely: Write<
298
289
  (a: string, newRelationsOfA: string[]) => void
299
- > = (transactors, a, newRelationsOfA) => {
300
- const { get, set } = transactors
290
+ > = (toolkit, a, newRelationsOfA) => {
291
+ const { get, set } = toolkit
301
292
  const relationsOfAState = this.retrieve(relatedKeysAtoms, a)
302
293
  const currentRelationsOfA = get(relationsOfAState)
303
294
  for (const currentRelationB of currentRelationsOfA) {
@@ -318,7 +309,7 @@ export class Join<
318
309
  relationsOfA.transaction((nextRelationsOfA) => {
319
310
  nextRelationsOfA.clear()
320
311
  for (const newRelationB of newRelationsOfA) {
321
- const relationsOfB = getRelatedKeys(transactors, newRelationB)
312
+ const relationsOfB = getRelatedKeys(toolkit, newRelationB)
322
313
  const newRelationBIsAlreadyRelated = relationsOfB.has(a)
323
314
  if (this.relations.cardinality === `1:n`) {
324
315
  const previousOwnersToDispose: string[] = []
@@ -327,7 +318,7 @@ export class Join<
327
318
  continue
328
319
  }
329
320
  const previousOwnerRelations = getRelatedKeys(
330
- transactors,
321
+ toolkit,
331
322
  previousOwner,
332
323
  )
333
324
  previousOwnerRelations.delete(newRelationB)
@@ -339,10 +330,6 @@ export class Join<
339
330
  relationsOfB.clear()
340
331
  }
341
332
  for (const previousOwner of previousOwnersToDispose) {
342
- const molecule = this.molecules.get(previousOwner)
343
- if (molecule) {
344
- this.transactors.dispose(molecule)
345
- }
346
333
  const sorted = [newRelationB, previousOwner].sort()
347
334
  const compositeKey = `"${sorted[0]}:${sorted[1]}"`
348
335
  this.molecules.delete(compositeKey)
@@ -360,8 +347,8 @@ export class Join<
360
347
  }
361
348
  const replaceRelationsUnsafely: Write<
362
349
  (a: string, newRelationsOfA: string[]) => void
363
- > = (transactors, a, newRelationsOfA) => {
364
- const { set } = transactors
350
+ > = (toolkit, a, newRelationsOfA) => {
351
+ const { set } = toolkit
365
352
  const relationsOfAState = this.retrieve(relatedKeysAtoms, a)
366
353
  set(relationsOfAState, (relationsOfA) => {
367
354
  relationsOfA.transaction((nextRelationsOfA) => {
@@ -381,29 +368,25 @@ export class Join<
381
368
  }
382
369
  return true
383
370
  }
384
- const has: Read<(a: string, b?: string) => boolean> = (
385
- transactors,
386
- a,
387
- b,
388
- ) => {
389
- const aKeys = getRelatedKeys(transactors, a)
371
+ const has: Read<(a: string, b?: string) => boolean> = (toolkit, a, b) => {
372
+ const aKeys = getRelatedKeys(toolkit, a)
390
373
  return b ? aKeys.has(b) : aKeys.size > 0
391
374
  }
392
375
  const baseExternalStoreConfiguration: BaseExternalStoreConfiguration = {
393
- getRelatedKeys: (key) => getRelatedKeys(this.transactors, key),
376
+ getRelatedKeys: (key) => getRelatedKeys(this.toolkit, key),
394
377
  addRelation: (a, b) => {
395
- addRelation(this.transactors, a, b)
378
+ addRelation(this.toolkit, a, b)
396
379
  },
397
380
  deleteRelation: (a, b) => {
398
- deleteRelation(this.transactors, a, b)
381
+ deleteRelation(this.toolkit, a, b)
399
382
  },
400
383
  replaceRelationsSafely: (a, bs) => {
401
- replaceRelationsSafely(this.transactors, a, bs)
384
+ replaceRelationsSafely(this.toolkit, a, bs)
402
385
  },
403
386
  replaceRelationsUnsafely: (a, bs) => {
404
- replaceRelationsUnsafely(this.transactors, a, bs)
387
+ replaceRelationsUnsafely(this.toolkit, a, bs)
405
388
  },
406
- has: (a, b) => has(this.transactors, a, b),
389
+ has: (a, b) => has(this.toolkit, a, b),
407
390
  }
408
391
  let externalStore: ExternalStoreConfiguration<Content>
409
392
  let contentAtoms: RegularAtomFamily<Content, string>
@@ -432,10 +415,10 @@ export class Join<
432
415
  key: `${options.key}/content-molecules`,
433
416
  new: class ContentMolecule {
434
417
  public constructor(
435
- transactors: MoleculeTransactors<string>,
418
+ toolkit: CtorToolkit<string>,
436
419
  public key: string,
437
420
  ) {
438
- transactors.join(joinToken)
421
+ toolkit.bond(joinToken, { as: null } as any)
439
422
  }
440
423
  },
441
424
  },
@@ -456,20 +439,20 @@ export class Join<
456
439
  ) => {
457
440
  const contentMolecule = store.molecules.get(`"${compositeKey}"`)
458
441
  if (contentMolecule) {
459
- this.transactors.dispose(contentMolecule)
442
+ this.toolkit.dispose(contentMolecule)
460
443
  this.molecules.delete(`"${compositeKey}"`)
461
444
  }
462
445
  }
463
446
  const externalStoreWithContentConfiguration = {
464
447
  getContent: (contentKey: string) => {
465
- const content = getContent(this.transactors, contentKey)
448
+ const content = getContent(this.toolkit, contentKey)
466
449
  return content
467
450
  },
468
451
  setContent: (contentKey: string, content: Content) => {
469
- setContent(this.transactors, contentKey, content)
452
+ setContent(this.toolkit, contentKey, content)
470
453
  },
471
454
  deleteContent: (contentKey: string) => {
472
- deleteContent(this.transactors, contentKey)
455
+ deleteContent(this.toolkit, contentKey)
473
456
  },
474
457
  }
475
458
  externalStore = Object.assign(
@@ -950,8 +933,8 @@ export function editRelationsInStore<
950
933
  const myJoin = getJoin(token, store)
951
934
  const target = newest(store)
952
935
  if (isChildStore(target)) {
953
- const { transactors } = target.transactionMeta
954
- myJoin.transact(transactors, ({ relations }) => {
936
+ const { toolkit } = target.transactionMeta
937
+ myJoin.transact(toolkit, ({ relations }) => {
955
938
  change(relations)
956
939
  })
957
940
  } else {
package/dist/index.cjs CHANGED
@@ -30,10 +30,21 @@ function atom(options) {
30
30
  function atomFamily(options) {
31
31
  return Internal.createAtomFamily(options, Internal.IMPLICIT.STORE);
32
32
  }
33
- function disposeState(token) {
34
- Internal__namespace.disposeFromStore(token, Internal__namespace.IMPLICIT.STORE);
33
+ function disposeState(token, key) {
34
+ if (key) {
35
+ Internal__namespace.disposeFromStore(token, key, Internal__namespace.IMPLICIT.STORE);
36
+ } else {
37
+ Internal__namespace.disposeFromStore(token, Internal__namespace.IMPLICIT.STORE);
38
+ }
35
39
  }
36
- function getState(token) {
40
+ function getState(token, key) {
41
+ if (key) {
42
+ return Internal__namespace.getFromStore(
43
+ token,
44
+ key,
45
+ Internal__namespace.IMPLICIT.STORE
46
+ );
47
+ }
37
48
  return Internal__namespace.getFromStore(token, Internal__namespace.IMPLICIT.STORE);
38
49
  }
39
50
 
@@ -95,8 +106,12 @@ function selector(options) {
95
106
  function selectorFamily(options) {
96
107
  return Internal.createSelectorFamily(options, Internal.IMPLICIT.STORE);
97
108
  }
98
- function setState(token, value) {
99
- Internal__namespace.setIntoStore(token, value, Internal__namespace.IMPLICIT.STORE);
109
+ function setState(token, p1, p2) {
110
+ if (p2) {
111
+ Internal__namespace.setIntoStore(token, p1, p2, Internal__namespace.IMPLICIT.STORE);
112
+ } else {
113
+ Internal__namespace.setIntoStore(token, p1, Internal__namespace.IMPLICIT.STORE);
114
+ }
100
115
  }
101
116
  var Silo = class {
102
117
  constructor(config, fromStore = null) {
@@ -115,9 +130,12 @@ var Silo = class {
115
130
  this.transaction = (options) => Internal.createTransaction(options, s);
116
131
  this.timeline = (options) => Internal.createTimeline(options, s);
117
132
  this.findState = (token, key) => Internal.findInStore(token, key, s);
118
- this.getState = (token) => Internal.getFromStore(token, s);
119
- this.setState = (token, newValue) => {
120
- Internal.setIntoStore(token, newValue, s);
133
+ this.getState = (...params) => Internal.getFromStore(...params, s);
134
+ this.setState = (...params) => {
135
+ Internal.setIntoStore(...params, s);
136
+ };
137
+ this.disposeState = (...params) => {
138
+ Internal.disposeFromStore(...params, s);
121
139
  };
122
140
  this.subscribe = (token, handler, key) => subscribe(token, handler, key, s);
123
141
  this.undo = (token) => {
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Transceiver, Subject, Store, EnvironmentData, Timeline, TimelineAtomUpdate, TimelineMoleculeCreation, TimelineMoleculeDisposal, TimelineSelectorUpdate, TimelineStateCreation, TimelineStateDisposal, TimelineTransactionUpdate } from 'atom.io/internal';
2
2
  import { Json, JsonInterface } from 'atom.io/json';
3
- import { MoleculeConstructor as MoleculeConstructor$1, MoleculeToken as MoleculeToken$1, MoleculeFamilyToken as MoleculeFamilyToken$1, MoleculeParams as MoleculeParams$1, getState as getState$1, makeMolecule as makeMolecule$1, Flat as Flat$1, TransactorsWithRunAndEnv as TransactorsWithRunAndEnv$1, MutableAtomFamilyToken as MutableAtomFamilyToken$1, MutableAtomToken as MutableAtomToken$1, RegularAtomFamilyToken as RegularAtomFamilyToken$1, RegularAtomToken as RegularAtomToken$1, WritableSelectorFamilyToken as WritableSelectorFamilyToken$1, WritableSelectorToken as WritableSelectorToken$1, ReadonlySelectorFamilyToken as ReadonlySelectorFamilyToken$1, ReadonlySelectorToken as ReadonlySelectorToken$1, WritableFamilyToken as WritableFamilyToken$1, WritableToken as WritableToken$1, ReadableFamilyToken as ReadableFamilyToken$1, ReadableToken as ReadableToken$1, MoleculeCreation as MoleculeCreation$1, MoleculeDisposal as MoleculeDisposal$1 } from 'atom.io';
3
+ import { MoleculeConstructor as MoleculeConstructor$1, MoleculeToken as MoleculeToken$1, MoleculeFamilyToken as MoleculeFamilyToken$1, MoleculeParams as MoleculeParams$1, getState as getState$1, setState as setState$1, makeMolecule as makeMolecule$1, Flat as Flat$1, ActorToolkit as ActorToolkit$1, MutableAtomFamilyToken as MutableAtomFamilyToken$1, MutableAtomToken as MutableAtomToken$1, RegularAtomFamilyToken as RegularAtomFamilyToken$1, RegularAtomToken as RegularAtomToken$1, WritableSelectorFamilyToken as WritableSelectorFamilyToken$1, WritableSelectorToken as WritableSelectorToken$1, ReadonlySelectorFamilyToken as ReadonlySelectorFamilyToken$1, ReadonlySelectorToken as ReadonlySelectorToken$1, WritableFamilyToken as WritableFamilyToken$1, WritableToken as WritableToken$1, ReadableFamilyToken as ReadableFamilyToken$1, ReadableToken as ReadableToken$1, MoleculeCreation as MoleculeCreation$1, MoleculeDisposal as MoleculeDisposal$1 } from 'atom.io';
4
4
  import { findState } from 'atom.io/ephemeral';
5
5
  import { seekState } from 'atom.io/immortal';
6
6
  import { JoinToken } from 'atom.io/data';
@@ -109,16 +109,17 @@ type TransactionUpdate<F extends Func> = {
109
109
  params: Parameters<F>;
110
110
  output: ReturnType<F>;
111
111
  };
112
- type Transactors = Readonly<{
112
+ type GetterToolkit = Pick<SetterToolkit, `find` | `get` | `json` | `seek`>;
113
+ type SetterToolkit = Readonly<{
113
114
  get: typeof getState$1;
114
- set: <S, New extends S>(state: WritableToken<S>, newValue: New | ((oldValue: S) => New)) => void;
115
+ set: typeof setState$1;
115
116
  find: typeof findState;
116
117
  seek: typeof seekState;
117
118
  json: <T extends Transceiver<any>, J extends Json.Serializable>(state: MutableAtomToken<T, J>) => WritableSelectorToken<J>;
118
119
  }>;
119
- type TransactorsWithRunAndEnv = Readonly<{
120
+ type ActorToolkit = Readonly<{
120
121
  get: typeof getState$1;
121
- set: <S, New extends S>(state: WritableToken<S>, newValue: New | ((oldValue: S) => New)) => void;
122
+ set: typeof setState$1;
122
123
  find: typeof findState;
123
124
  seek: typeof seekState;
124
125
  json: <T extends Transceiver<any>, J extends Json.Serializable>(state: MutableAtomToken<T, J>) => WritableSelectorToken<J>;
@@ -127,10 +128,9 @@ type TransactorsWithRunAndEnv = Readonly<{
127
128
  run: typeof runTransaction;
128
129
  env: () => EnvironmentData;
129
130
  }>;
130
- type ReadonlyTransactors = Pick<Transactors, `find` | `get` | `json` | `seek`>;
131
- type Read<F extends Func> = (transactors: ReadonlyTransactors, ...parameters: Parameters<F>) => ReturnType<F>;
132
- type Write<F extends Func> = (transactors: Transactors, ...parameters: Parameters<F>) => ReturnType<F>;
133
- type Transact<F extends Func> = (transactors: TransactorsWithRunAndEnv, ...parameters: Parameters<F>) => ReturnType<F>;
131
+ type Read<F extends Func> = (toolkit: GetterToolkit, ...parameters: Parameters<F>) => ReturnType<F>;
132
+ type Write<F extends Func> = (toolkit: SetterToolkit, ...parameters: Parameters<F>) => ReturnType<F>;
133
+ type Transact<F extends Func> = (toolkit: ActorToolkit, ...parameters: Parameters<F>) => ReturnType<F>;
134
134
  type TransactionOptions<F extends Func> = {
135
135
  key: string;
136
136
  do: Transact<F>;
@@ -197,20 +197,30 @@ type SelectorFamilyToken<T, K extends Json.Serializable> = ReadonlySelectorFamil
197
197
  declare function selectorFamily<T, K extends Json.Serializable>(options: WritableSelectorFamilyOptions<T, K>): WritableSelectorFamilyTokenWithCall<T, K>;
198
198
  declare function selectorFamily<T, K extends Json.Serializable>(options: ReadonlySelectorFamilyOptions<T, K>): ReadonlySelectorFamilyTokenWithCall<T, K>;
199
199
 
200
- type MoleculeTransactors<K extends Json.Serializable> = Flat$1<Omit<TransactorsWithRunAndEnv$1, `find`> & {
200
+ type CtorToolkit<K extends Json.Serializable> = Flat$1<Omit<ActorToolkit$1, `find`> & {
201
201
  bond<T extends Transceiver<any>, J extends Json.Serializable>(family: MutableAtomFamilyToken$1<T, J, K>): MutableAtomToken$1<T, J>;
202
202
  bond<T>(family: RegularAtomFamilyToken$1<T, K>): RegularAtomToken$1<T>;
203
203
  bond<T>(family: WritableSelectorFamilyToken$1<T, K>): WritableSelectorToken$1<T>;
204
204
  bond<T>(family: ReadonlySelectorFamilyToken$1<T, K>): ReadonlySelectorToken$1<T>;
205
205
  bond<T>(family: WritableFamilyToken$1<T, K>): WritableToken$1<T>;
206
206
  bond<T>(family: ReadableFamilyToken$1<T, K>): ReadableToken$1<T>;
207
+ bond<J extends JoinToken<any, any, any, any>>(joinToken: J, role: {
208
+ as: J extends JoinToken<infer A, infer B, any, any> ? A | B : never;
209
+ }): J extends JoinToken<any, any, any, infer Content> ? Content extends null ? {
210
+ relatedKeys: ReadonlySelectorToken$1<string[]>;
211
+ } : {
212
+ relatedKeys: ReadonlySelectorToken$1<string[]>;
213
+ relatedEntries: ReadonlySelectorToken$1<[
214
+ key: string,
215
+ value: Content
216
+ ][]>;
217
+ } : never;
207
218
  claim(below: MoleculeToken<any>, options: {
208
219
  exclusive: boolean;
209
- }): any;
210
- join<J extends JoinToken<any, any, any, any>>(joinToken: J): J;
220
+ }): void;
211
221
  spawn<Key extends Json.Serializable, Ctor extends MoleculeConstructor>(family: MoleculeFamilyToken<Ctor>, key: Key, ...params: MoleculeParams<Ctor>): MoleculeToken<Ctor>;
212
222
  }>;
213
- type MoleculeConstructor = new (transactors: MoleculeTransactors<any>, key: any, ...params: any) => any;
223
+ type MoleculeConstructor = new (toolkit: CtorToolkit<any>, key: any, ...params: any) => any;
214
224
  type Tail<T extends any[]> = T extends [any, ...infer Rest] ? Rest : any[];
215
225
  type MoleculeParams<M extends MoleculeConstructor> = Tail<Tail<ConstructorParameters<M>>>;
216
226
  type MoleculeFamilyOptions<M extends MoleculeConstructor> = {
@@ -243,9 +253,13 @@ type MK<M extends MoleculeConstructor> = MoleculeKey<M>;
243
253
  declare function makeRootMolecule(key: string, store?: Store): MoleculeToken<ObjectConstructor>;
244
254
 
245
255
  declare function disposeState(token: MoleculeToken<any> | ReadableToken<any>): void;
256
+ declare function disposeState<K extends Json.Serializable>(token: ReadableFamilyToken<any, K>, key: K): void;
257
+ declare function disposeState<M extends MoleculeConstructor>(token: MoleculeFamilyToken<M>, key: MoleculeKey<M>): void;
246
258
 
247
259
  declare function getState<T>(token: ReadableToken<T>): T;
248
- declare function getState<M extends MoleculeConstructor>(token: MoleculeToken<M>): InstanceType<M> | undefined;
260
+ declare function getState<M extends MoleculeConstructor>(token: MoleculeToken<M>): InstanceType<M>;
261
+ declare function getState<T, K extends Json.Serializable>(token: ReadableFamilyToken<T, K>, key: K): T;
262
+ declare function getState<M extends MoleculeConstructor>(token: MoleculeFamilyToken<M>, key: Json.Serializable): InstanceType<M>;
249
263
 
250
264
  declare const LoggerIconDictionary: {
251
265
  readonly "\u231B": "Timeline event fully captured";
@@ -317,7 +331,14 @@ declare class AtomIOLogger implements Logger {
317
331
  warn: LogFn;
318
332
  }
319
333
 
334
+ type primitive = boolean | number | string | null;
335
+
336
+ type Serializable = primitive | Readonly<{
337
+ [key: string]: Serializable;
338
+ }> | ReadonlyArray<Serializable>;
339
+
320
340
  declare function setState<T, New extends T>(token: WritableToken<T>, value: New | ((oldValue: T) => New)): void;
341
+ declare function setState<T, K extends Serializable, New extends T>(token: WritableFamilyToken<T, K>, key: K, value: New | ((oldValue: T) => New)): void;
321
342
 
322
343
  declare class Silo {
323
344
  store: Store;
@@ -330,6 +351,7 @@ declare class Silo {
330
351
  findState: typeof findState;
331
352
  getState: typeof getState;
332
353
  setState: typeof setState;
354
+ disposeState: typeof disposeState;
333
355
  subscribe: typeof subscribe;
334
356
  undo: typeof undo;
335
357
  redo: typeof redo;
@@ -426,4 +448,4 @@ type FamilyMetadata = {
426
448
  subKey: string;
427
449
  };
428
450
 
429
- export { type AtomEffect, type AtomFamily, type AtomFamilyToken, AtomIOLogger, type AtomOnly, type AtomToken, type Effectors, type FamilyMetadata, type Flat, type Func, type KeyedStateUpdate, LOG_LEVELS, type LogFilter, type LogFn, type LogLevel, type Logger, type LoggerIcon, type MK, type MoleculeConstructor, type MoleculeCreation, type MoleculeDisposal, type MoleculeFamily, type MoleculeFamilyOptions, type MoleculeFamilyToken, type MoleculeKey, type MoleculeParams, type MoleculeToken, type MoleculeTransactors, type MoleculeType, type MutableAtomFamily, type MutableAtomFamilyOptions, type MutableAtomFamilyToken, type MutableAtomFamilyTokenWithCall, type MutableAtomOptions, type MutableAtomToken, type Read, type ReadableFamily, type ReadableFamilyToken, type ReadableToken, type ReadonlySelectorFamily, type ReadonlySelectorFamilyOptions, type ReadonlySelectorFamilyToken, type ReadonlySelectorFamilyTokenWithCall, type ReadonlySelectorOptions, type ReadonlySelectorToken, type ReadonlyTransactors, type RegularAtomFamily, type RegularAtomFamilyOptions, type RegularAtomFamilyToken, type RegularAtomFamilyTokenWithCall, type RegularAtomOptions, type RegularAtomToken, type SelectorFamily, type SelectorFamilyToken, type SelectorToken, Silo, type StateCreation, type StateDisposal, type StateUpdate, type TimelineManageable, type TimelineOptions, type TimelineToken, type TimelineUpdate, type TokenDenomination, type TokenType, type Transact, type TransactionIO, type TransactionOptions, type TransactionToken, type TransactionUpdate, type TransactionUpdateContent, type TransactionUpdateHandler, type Transactors, type TransactorsWithRunAndEnv, type UpdateHandler, type WritableFamily, type WritableFamilyToken, type WritableSelectorFamily, type WritableSelectorFamilyOptions, type WritableSelectorFamilyToken, type WritableSelectorFamilyTokenWithCall, type WritableSelectorOptions, type WritableSelectorToken, type WritableToken, type Write, atom, atomFamily, belongsTo, disposeState, getState, isToken, makeMolecule, makeRootMolecule, moleculeFamily, redo, runTransaction, selector, selectorFamily, setState, simpleLog, simpleLogger, subscribe, timeline, transaction, undo };
451
+ export { type ActorToolkit, type AtomEffect, type AtomFamily, type AtomFamilyToken, AtomIOLogger, type AtomOnly, type AtomToken, type CtorToolkit, type Effectors, type FamilyMetadata, type Flat, type Func, type GetterToolkit, type KeyedStateUpdate, LOG_LEVELS, type LogFilter, type LogFn, type LogLevel, type Logger, type LoggerIcon, type MK, type MoleculeConstructor, type MoleculeCreation, type MoleculeDisposal, type MoleculeFamily, type MoleculeFamilyOptions, type MoleculeFamilyToken, type MoleculeKey, type MoleculeParams, type MoleculeToken, type MoleculeType, type MutableAtomFamily, type MutableAtomFamilyOptions, type MutableAtomFamilyToken, type MutableAtomFamilyTokenWithCall, type MutableAtomOptions, type MutableAtomToken, type Read, type ReadableFamily, type ReadableFamilyToken, type ReadableToken, type ReadonlySelectorFamily, type ReadonlySelectorFamilyOptions, type ReadonlySelectorFamilyToken, type ReadonlySelectorFamilyTokenWithCall, type ReadonlySelectorOptions, type ReadonlySelectorToken, type RegularAtomFamily, type RegularAtomFamilyOptions, type RegularAtomFamilyToken, type RegularAtomFamilyTokenWithCall, type RegularAtomOptions, type RegularAtomToken, type SelectorFamily, type SelectorFamilyToken, type SelectorToken, type SetterToolkit, Silo, type StateCreation, type StateDisposal, type StateUpdate, type TimelineManageable, type TimelineOptions, type TimelineToken, type TimelineUpdate, type TokenDenomination, type TokenType, type Transact, type TransactionIO, type TransactionOptions, type TransactionToken, type TransactionUpdate, type TransactionUpdateContent, type TransactionUpdateHandler, type UpdateHandler, type WritableFamily, type WritableFamilyToken, type WritableSelectorFamily, type WritableSelectorFamilyOptions, type WritableSelectorFamilyToken, type WritableSelectorFamilyTokenWithCall, type WritableSelectorOptions, type WritableSelectorToken, type WritableToken, type Write, atom, atomFamily, belongsTo, disposeState, getState, isToken, makeMolecule, makeRootMolecule, moleculeFamily, redo, runTransaction, selector, selectorFamily, setState, simpleLog, simpleLogger, subscribe, timeline, transaction, undo };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import './chunk-S4N6XNPH.js';
2
2
  import * as Internal from 'atom.io/internal';
3
- import { createStandaloneAtom, IMPLICIT, createAtomFamily, createMoleculeFamily, makeMoleculeInStore, Molecule, createStandaloneSelector, createSelectorFamily, Store, createTransaction, createTimeline, findInStore, getFromStore, setIntoStore, timeTravel, subscribeToTimeline, subscribeToTransaction, subscribeToState, arbitrary, actUponStore } from 'atom.io/internal';
3
+ import { createStandaloneAtom, IMPLICIT, createAtomFamily, createMoleculeFamily, makeMoleculeInStore, Molecule, createStandaloneSelector, createSelectorFamily, Store, createTransaction, createTimeline, findInStore, getFromStore, setIntoStore, disposeFromStore, timeTravel, subscribeToTimeline, subscribeToTransaction, subscribeToState, arbitrary, actUponStore } from 'atom.io/internal';
4
4
  import { stringifyJson } from 'atom.io/json';
5
5
 
6
6
  function atom(options) {
@@ -9,10 +9,21 @@ function atom(options) {
9
9
  function atomFamily(options) {
10
10
  return createAtomFamily(options, IMPLICIT.STORE);
11
11
  }
12
- function disposeState(token) {
13
- Internal.disposeFromStore(token, Internal.IMPLICIT.STORE);
12
+ function disposeState(token, key) {
13
+ if (key) {
14
+ Internal.disposeFromStore(token, key, Internal.IMPLICIT.STORE);
15
+ } else {
16
+ Internal.disposeFromStore(token, Internal.IMPLICIT.STORE);
17
+ }
14
18
  }
15
- function getState(token) {
19
+ function getState(token, key) {
20
+ if (key) {
21
+ return Internal.getFromStore(
22
+ token,
23
+ key,
24
+ Internal.IMPLICIT.STORE
25
+ );
26
+ }
16
27
  return Internal.getFromStore(token, Internal.IMPLICIT.STORE);
17
28
  }
18
29
 
@@ -74,8 +85,12 @@ function selector(options) {
74
85
  function selectorFamily(options) {
75
86
  return createSelectorFamily(options, IMPLICIT.STORE);
76
87
  }
77
- function setState(token, value) {
78
- Internal.setIntoStore(token, value, Internal.IMPLICIT.STORE);
88
+ function setState(token, p1, p2) {
89
+ if (p2) {
90
+ Internal.setIntoStore(token, p1, p2, Internal.IMPLICIT.STORE);
91
+ } else {
92
+ Internal.setIntoStore(token, p1, Internal.IMPLICIT.STORE);
93
+ }
79
94
  }
80
95
  var Silo = class {
81
96
  constructor(config, fromStore = null) {
@@ -94,9 +109,12 @@ var Silo = class {
94
109
  this.transaction = (options) => createTransaction(options, s);
95
110
  this.timeline = (options) => createTimeline(options, s);
96
111
  this.findState = (token, key) => findInStore(token, key, s);
97
- this.getState = (token) => getFromStore(token, s);
98
- this.setState = (token, newValue) => {
99
- setIntoStore(token, newValue, s);
112
+ this.getState = (...params) => getFromStore(...params, s);
113
+ this.setState = (...params) => {
114
+ setIntoStore(...params, s);
115
+ };
116
+ this.disposeState = (...params) => {
117
+ disposeFromStore(...params, s);
100
118
  };
101
119
  this.subscribe = (token, handler, key) => subscribe(token, handler, key, s);
102
120
  this.undo = (token) => {