atom.io 0.40.1 → 0.40.3

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 (98) hide show
  1. package/dist/data/index.d.ts +1 -1
  2. package/dist/data/index.d.ts.map +1 -1
  3. package/dist/data/index.js.map +1 -1
  4. package/dist/internal/index.d.ts +155 -144
  5. package/dist/internal/index.d.ts.map +1 -1
  6. package/dist/internal/index.js +91 -39
  7. package/dist/internal/index.js.map +1 -1
  8. package/dist/introspection/index.d.ts +4 -4
  9. package/dist/introspection/index.d.ts.map +1 -1
  10. package/dist/introspection/index.js.map +1 -1
  11. package/dist/main/index.d.ts +80 -56
  12. package/dist/main/index.d.ts.map +1 -1
  13. package/dist/main/index.js.map +1 -1
  14. package/dist/react/index.d.ts +11 -11
  15. package/dist/react/index.d.ts.map +1 -1
  16. package/dist/react/index.js.map +1 -1
  17. package/dist/react-devtools/index.d.ts.map +1 -1
  18. package/dist/react-devtools/index.js.map +1 -1
  19. package/package.json +1 -1
  20. package/src/data/struct.ts +2 -2
  21. package/src/internal/atom/create-regular-atom.ts +8 -7
  22. package/src/internal/atom/dispose-atom.ts +6 -3
  23. package/src/internal/atom/has-role.ts +1 -1
  24. package/src/internal/caching.ts +15 -15
  25. package/src/internal/events/ingest-creation-disposal.ts +1 -1
  26. package/src/internal/families/create-readonly-held-selector-family.ts +6 -7
  27. package/src/internal/families/create-readonly-pure-selector-family.ts +23 -17
  28. package/src/internal/families/create-regular-atom-family.ts +17 -15
  29. package/src/internal/families/create-selector-family.ts +9 -9
  30. package/src/internal/families/create-writable-held-selector-family.ts +6 -7
  31. package/src/internal/families/create-writable-pure-selector-family.ts +24 -18
  32. package/src/internal/families/dispose-from-store.ts +10 -7
  33. package/src/internal/families/find-in-store.ts +23 -23
  34. package/src/internal/families/get-family-of-token.ts +17 -17
  35. package/src/internal/families/mint-in-store.ts +11 -11
  36. package/src/internal/families/seek-in-store.ts +26 -26
  37. package/src/internal/get-state/get-fallback.ts +8 -8
  38. package/src/internal/get-state/get-from-store.ts +17 -12
  39. package/src/internal/get-state/read-or-compute-value.ts +78 -14
  40. package/src/internal/get-state/reduce-reference.ts +10 -10
  41. package/src/internal/index.ts +58 -53
  42. package/src/internal/join/join-internal.ts +15 -6
  43. package/src/internal/mutable/create-mutable-atom-family.ts +7 -8
  44. package/src/internal/mutable/get-json-family.ts +3 -2
  45. package/src/internal/mutable/get-update-family.ts +7 -5
  46. package/src/internal/mutable/tracker-family.ts +5 -1
  47. package/src/internal/mutable/tracker.ts +5 -1
  48. package/src/internal/operation.ts +4 -2
  49. package/src/internal/selector/create-readonly-pure-selector.ts +8 -6
  50. package/src/internal/selector/create-standalone-selector.ts +10 -10
  51. package/src/internal/selector/create-writable-pure-selector.ts +9 -7
  52. package/src/internal/selector/dispose-selector.ts +2 -2
  53. package/src/internal/selector/register-selector.ts +2 -2
  54. package/src/internal/selector/trace-selector-atoms.ts +3 -3
  55. package/src/internal/selector/update-selector-atoms.ts +1 -1
  56. package/src/internal/set-state/dispatch-state-update.ts +9 -5
  57. package/src/internal/set-state/evict-downstream.ts +4 -1
  58. package/src/internal/set-state/operate-on-store.ts +16 -10
  59. package/src/internal/set-state/reset-atom-or-selector.ts +7 -7
  60. package/src/internal/set-state/reset-in-store.ts +9 -6
  61. package/src/internal/set-state/set-atom-or-selector.ts +1 -1
  62. package/src/internal/set-state/set-atom.ts +1 -1
  63. package/src/internal/set-state/set-into-store.ts +10 -7
  64. package/src/internal/set-state/set-selector.ts +1 -1
  65. package/src/internal/store/deposit.ts +38 -30
  66. package/src/internal/store/mint-or-counterfeit.ts +23 -23
  67. package/src/internal/store/store.ts +9 -9
  68. package/src/internal/store/withdraw.ts +68 -62
  69. package/src/internal/subscribe/recall-state.ts +4 -1
  70. package/src/internal/subscribe/subscribe-to-root-atoms.ts +2 -2
  71. package/src/internal/subscribe/subscribe-to-state.ts +4 -4
  72. package/src/internal/timeline/create-timeline.ts +5 -5
  73. package/src/internal/utility-types.ts +2 -0
  74. package/src/introspection/attach-atom-index.ts +2 -2
  75. package/src/introspection/attach-selector-index.ts +4 -2
  76. package/src/introspection/attach-timeline-family.ts +13 -11
  77. package/src/introspection/attach-timeline-index.ts +1 -1
  78. package/src/introspection/attach-transaction-index.ts +1 -1
  79. package/src/introspection/attach-transaction-logs.ts +4 -2
  80. package/src/introspection/attach-type-selectors.ts +2 -1
  81. package/src/introspection/index.ts +3 -5
  82. package/src/main/atom.ts +15 -9
  83. package/src/main/events.ts +25 -23
  84. package/src/main/get-state.ts +10 -8
  85. package/src/main/reset-state.ts +4 -4
  86. package/src/main/selector.ts +41 -24
  87. package/src/main/set-state.ts +8 -4
  88. package/src/main/timeline.ts +5 -3
  89. package/src/main/tokens.ts +72 -44
  90. package/src/main/validators.ts +4 -4
  91. package/src/react/parse-state-overloads.ts +10 -10
  92. package/src/react/use-i.ts +6 -6
  93. package/src/react/use-loadable.ts +15 -15
  94. package/src/react/use-o.ts +9 -9
  95. package/src/react-devtools/StateEditor.tsx +5 -3
  96. package/src/react-devtools/StateIndex.tsx +6 -4
  97. package/src/react-devtools/Updates.tsx +1 -1
  98. package/src/react-devtools/store.ts +16 -7
@@ -8,24 +8,24 @@ import { COUNTERFEIT, mint } from "../store"
8
8
 
9
9
  export const MUST_CREATE: unique symbol = Symbol(`MUST_CREATE`)
10
10
 
11
- export function mintInStore<T, K extends Canonical, Key extends K>(
11
+ export function mintInStore<T, K extends Canonical, Key extends K, E>(
12
12
  store: Store,
13
- family: ReadableFamily<T, K>,
13
+ family: ReadableFamily<T, K, E>,
14
14
  key: Key,
15
15
  mustCreate?: typeof MUST_CREATE,
16
- ): WritableToken<T, K>
17
- export function mintInStore<T, K extends Canonical, Key extends K>(
16
+ ): WritableToken<T, Key, E>
17
+ export function mintInStore<T, K extends Canonical, Key extends K, E>(
18
18
  store: Store,
19
- family: ReadableFamily<T, K>,
19
+ family: ReadableFamily<T, K, E>,
20
20
  key: Key,
21
21
  mustCreate?: typeof MUST_CREATE,
22
- ): ReadableToken<T, K>
23
- export function mintInStore<T, K extends Canonical, Key extends K>(
22
+ ): ReadableToken<T, Key, E>
23
+ export function mintInStore<T, K extends Canonical, Key extends K, E>(
24
24
  store: Store,
25
- family: ReadableFamily<T, K>,
25
+ family: ReadableFamily<T, K, E>,
26
26
  key: Key,
27
27
  mustCreate?: typeof MUST_CREATE,
28
- ): ReadableToken<T, K> {
28
+ ): ReadableToken<T, Key, E> {
29
29
  const stringKey = stringifyJson(key)
30
30
  const molecule = store.molecules.get(stringKey)
31
31
 
@@ -43,7 +43,7 @@ export function mintInStore<T, K extends Canonical, Key extends K>(
43
43
  return mint(family, key, COUNTERFEIT)
44
44
  }
45
45
 
46
- let token: ReadableToken<T, K>
46
+ let token: ReadableToken<T, Key, E>
47
47
  if (mustCreate === MUST_CREATE) {
48
48
  store.logger.info(
49
49
  `👪`,
@@ -52,7 +52,7 @@ export function mintInStore<T, K extends Canonical, Key extends K>(
52
52
  `adds member`,
53
53
  typeof key === `string` ? `\`${key}\`` : key,
54
54
  )
55
- token = family(key)
55
+ token = family.create(key)
56
56
  if (molecule) {
57
57
  store.moleculeData.set(stringKey, family.key)
58
58
  }
@@ -19,7 +19,7 @@ import type {
19
19
  import type { Canonical } from "atom.io/json"
20
20
  import { stringifyJson } from "atom.io/json"
21
21
 
22
- import type { Molecule, ReadableState } from ".."
22
+ import type { ReadableState } from ".."
23
23
  import { newest } from "../lineage"
24
24
  import type { Transceiver } from "../mutable"
25
25
  import { deposit, type Store } from "../store"
@@ -32,59 +32,59 @@ export function seekInStore<
32
32
  store: Store,
33
33
  token: MutableAtomFamilyToken<T, K>,
34
34
  key: Key,
35
- ): MutableAtomToken<T, K> | undefined
35
+ ): MutableAtomToken<T, Key> | undefined
36
36
 
37
- export function seekInStore<T, K extends Canonical, Key extends K>(
37
+ export function seekInStore<T, K extends Canonical, Key extends K, E>(
38
38
  store: Store,
39
- token: RegularAtomFamilyToken<T, K>,
39
+ token: RegularAtomFamilyToken<T, K, E>,
40
40
  key: Key,
41
- ): RegularAtomToken<T, K> | undefined
41
+ ): RegularAtomToken<T, Key, E> | undefined
42
42
 
43
- export function seekInStore<T, K extends Canonical, Key extends K>(
43
+ export function seekInStore<T, K extends Canonical, Key extends K, E>(
44
44
  store: Store,
45
- token: AtomFamilyToken<T, K>,
45
+ token: AtomFamilyToken<T, K, E>,
46
46
  key: Key,
47
- ): AtomToken<T, K> | undefined
47
+ ): AtomToken<T, Key, E> | undefined
48
48
 
49
- export function seekInStore<T, K extends Canonical, Key extends K>(
49
+ export function seekInStore<T, K extends Canonical, Key extends K, E>(
50
50
  store: Store,
51
- token: WritablePureSelectorFamilyToken<T, K>,
51
+ token: WritablePureSelectorFamilyToken<T, K, E>,
52
52
  key: Key,
53
- ): WritablePureSelectorToken<T, K> | undefined
53
+ ): WritablePureSelectorToken<T, Key, E> | undefined
54
54
 
55
- export function seekInStore<T, K extends Canonical, Key extends K>(
55
+ export function seekInStore<T, K extends Canonical, Key extends K, E>(
56
56
  store: Store,
57
- token: ReadonlyPureSelectorFamilyToken<T, K>,
57
+ token: ReadonlyPureSelectorFamilyToken<T, K, E>,
58
58
  key: Key,
59
- ): ReadonlyPureSelectorToken<T, K> | undefined
59
+ ): ReadonlyPureSelectorToken<T, Key, E> | undefined
60
60
 
61
- export function seekInStore<T, K extends Canonical, Key extends K>(
61
+ export function seekInStore<T, K extends Canonical, Key extends K, E>(
62
62
  store: Store,
63
- token: SelectorFamilyToken<T, K>,
63
+ token: SelectorFamilyToken<T, K, E>,
64
64
  key: Key,
65
- ): SelectorToken<T, K> | undefined
65
+ ): SelectorToken<T, Key, E> | undefined
66
66
 
67
- export function seekInStore<T, K extends Canonical, Key extends K>(
67
+ export function seekInStore<T, K extends Canonical, Key extends K, E>(
68
68
  store: Store,
69
- token: WritableFamilyToken<T, K>,
69
+ token: WritableFamilyToken<T, K, E>,
70
70
  key: Key,
71
- ): WritableToken<T, K> | undefined
71
+ ): WritableToken<T, Key, E> | undefined
72
72
 
73
- export function seekInStore<T, K extends Canonical, Key extends K>(
73
+ export function seekInStore<T, K extends Canonical, Key extends K, E>(
74
74
  store: Store,
75
- token: ReadableFamilyToken<T, K>,
75
+ token: ReadableFamilyToken<T, K, E>,
76
76
  key: Key,
77
- ): ReadableToken<T, K> | undefined
77
+ ): ReadableToken<T, Key, E> | undefined
78
78
 
79
79
  export function seekInStore(
80
80
  store: Store,
81
- token: ReadableFamilyToken<any, any>,
81
+ token: ReadableFamilyToken<any, any, any>,
82
82
  key: Canonical,
83
- ): ReadableToken<any> | undefined {
83
+ ): ReadableToken<any, any, any> | undefined {
84
84
  const subKey = stringifyJson(key)
85
85
  const fullKey = `${token.key}(${subKey})`
86
86
  const target = newest(store)
87
- let state: Molecule<any> | ReadableState<any> | undefined
87
+ let state: ReadableState<any, any> | undefined
88
88
  switch (token.type) {
89
89
  case `atom_family`:
90
90
  case `mutable_atom_family`:
@@ -1,15 +1,15 @@
1
- import type { ReadableToken } from "atom.io"
1
+ import type { ReadableToken, ViewOf } from "atom.io"
2
2
  import { type Canonical, stringifyJson } from "atom.io/json"
3
3
 
4
4
  import type { ReadableFamily } from ".."
5
5
  import type { Store } from "../store"
6
6
 
7
- export function getFallback<T, K extends Canonical>(
7
+ export function getFallback<T, K extends Canonical, E>(
8
8
  store: Store,
9
- token: ReadableToken<T, K>,
10
- family: ReadableFamily<T, K>,
9
+ token: ReadableToken<T, K, E>,
10
+ family: ReadableFamily<T, K, E>,
11
11
  subKey: K,
12
- ): T {
12
+ ): ViewOf<E | T> {
13
13
  const disposal = store.disposalTraces.buffer.find(
14
14
  (item) => item?.key === stringifyJson(subKey),
15
15
  )
@@ -31,7 +31,7 @@ export function getFallback<T, K extends Canonical>(
31
31
  }
32
32
  const defaultValue = new family.class()
33
33
  store.defaults.set(family.key, defaultValue)
34
- return defaultValue
34
+ return defaultValue.READONLY_VIEW
35
35
  }
36
36
  case `atom_family`: {
37
37
  if (store.defaults.has(family.key)) {
@@ -40,7 +40,7 @@ export function getFallback<T, K extends Canonical>(
40
40
  const def = family.default as (key: K) => T
41
41
  const defaultValue = def(subKey)
42
42
  store.defaults.set(family.key, defaultValue)
43
- return defaultValue
43
+ return defaultValue as ViewOf<T>
44
44
  }
45
45
  case `readonly_pure_selector_family`:
46
46
  case `writable_pure_selector_family`:
@@ -51,7 +51,7 @@ export function getFallback<T, K extends Canonical>(
51
51
  }
52
52
  const defaultValue = family.default(subKey)
53
53
  store.defaults.set(family.key, defaultValue)
54
- return defaultValue
54
+ return defaultValue as ViewOf<T>
55
55
  }
56
56
  }
57
57
  }
@@ -1,4 +1,4 @@
1
- import type { ReadableFamilyToken, ReadableToken } from "atom.io"
1
+ import type { ReadableFamilyToken, ReadableToken, ViewOf } from "atom.io"
2
2
  import type { Canonical } from "atom.io/json"
3
3
 
4
4
  import { type Store, withdraw } from "../store"
@@ -8,25 +8,30 @@ import { reduceReference } from "./reduce-reference"
8
8
 
9
9
  export function getFromStore<T>(store: Store, token: ReadableToken<T>): T
10
10
 
11
- export function getFromStore<T, K extends Canonical>(
11
+ export function getFromStore<T, E>(
12
12
  store: Store,
13
- token: ReadableFamilyToken<T, K>,
13
+ token: ReadableToken<T, any, E>,
14
+ ): E | T
15
+
16
+ export function getFromStore<T, K extends Canonical, E>(
17
+ store: Store,
18
+ token: ReadableFamilyToken<T, K, E>,
14
19
  key: K,
15
- ): T
20
+ ): ViewOf<E | T>
16
21
 
17
- export function getFromStore<T, K extends Canonical, Key extends K>(
22
+ export function getFromStore<T, K extends Canonical, Key extends K, E>(
18
23
  store: Store,
19
24
  ...params:
20
- | [token: ReadableFamilyToken<T, K>, key: Key]
21
- | [token: ReadableToken<T>]
22
- ): T
25
+ | [token: ReadableFamilyToken<T, K, E>, key: Key]
26
+ | [token: ReadableToken<T, any, E>]
27
+ ): ViewOf<E | T>
23
28
 
24
- export function getFromStore<T, K extends Canonical, Key extends K>(
29
+ export function getFromStore<T, K extends Canonical, Key extends K, E>(
25
30
  store: Store,
26
31
  ...params:
27
- | [token: ReadableFamilyToken<T, K>, key: Key]
28
- | [token: ReadableToken<T>]
29
- ): any {
32
+ | [token: ReadableFamilyToken<T, K, E>, key: Key]
33
+ | [token: ReadableToken<T, any, E>]
34
+ ): ViewOf<E | T> {
30
35
  const { token, family, subKey } = reduceReference(store, ...params)
31
36
 
32
37
  if (`counterfeit` in token && family && subKey) {
@@ -5,21 +5,21 @@ import { readFromCache, writeToCache } from "../caching"
5
5
  import { isFn } from "../is-fn"
6
6
  import type { Store } from "../store"
7
7
 
8
- export function readOrComputeValue<T>(
8
+ export function readOrComputeValue<T, E>(
9
9
  target: Store,
10
- state: ReadableState<T>,
10
+ state: ReadableState<T, E>,
11
11
  mut?: undefined,
12
- ): ViewOf<T>
13
- export function readOrComputeValue<T>(
12
+ ): ViewOf<E | T>
13
+ export function readOrComputeValue<T, E>(
14
14
  target: Store,
15
- state: ReadableState<T>,
15
+ state: ReadableState<T, E>,
16
16
  mut: `mut`,
17
- ): T
18
- export function readOrComputeValue<T>(
17
+ ): E | T
18
+ export function readOrComputeValue<T, E>(
19
19
  target: Store,
20
- state: ReadableState<T>,
20
+ state: ReadableState<T, E>,
21
21
  mut: `mut` | undefined,
22
- ): T {
22
+ ): E | T {
23
23
  if (target.valueMap.has(state.key)) {
24
24
  return readFromCache(target, state, mut)
25
25
  }
@@ -27,16 +27,80 @@ export function readOrComputeValue<T>(
27
27
  const { key } = state
28
28
  switch (state.type) {
29
29
  case `readonly_held_selector`:
30
- case `readonly_pure_selector`:
31
30
  case `writable_held_selector`:
32
- case `writable_pure_selector`:
33
31
  target.logger.info(`🧮`, state.type, key, `computing value`)
34
32
  return state.getFrom(target)
33
+ case `readonly_pure_selector`:
34
+ case `writable_pure_selector`: {
35
+ let val: E | T
36
+ target.logger.info(`🧮`, state.type, key, `computing value`)
37
+ try {
38
+ val = state.getFrom(target)
39
+ if (val instanceof Promise) {
40
+ return (val as Promise<E & T>).catch((e) => {
41
+ target.logger.error(`💥`, state.type, key, `rejected:`, e)
42
+ if (state.catch) {
43
+ for (const Class of state.catch) {
44
+ if (e instanceof Class) {
45
+ return writeToCache(target, state, e)
46
+ }
47
+ }
48
+ }
49
+ throw e
50
+ }) as E | T
51
+ }
52
+ } catch (e) {
53
+ target.logger.error(`💥`, state.type, key, `rejected:`, e)
54
+ if (state.catch) {
55
+ for (const Class of state.catch) {
56
+ if (e instanceof Class) {
57
+ return writeToCache(target, state, e)
58
+ }
59
+ }
60
+ }
61
+ throw e
62
+ }
63
+ const cachedValue = writeToCache(target, state, val)
64
+ return cachedValue
65
+ }
35
66
  case `atom`: {
36
- let def: T
67
+ let def: E | T
37
68
  if (isFn(state.default)) {
38
- def = state.default()
39
- target.logger.info(`✨`, state.type, key, `computed default`, def)
69
+ try {
70
+ def = state.default()
71
+ if (def instanceof Promise) {
72
+ def = (def as Promise<T> & T).catch<E | T>((e) => {
73
+ target.logger.error(`💥`, state.type, key, `rejected:`, e)
74
+ if (state.catch) {
75
+ for (const Class of state.catch) {
76
+ if (e instanceof Class) {
77
+ def = writeToCache(target, state, e)
78
+ return def
79
+ }
80
+ }
81
+ }
82
+ throw e
83
+ }) as E | T
84
+ }
85
+ } catch (e) {
86
+ target.logger.error(`💥`, state.type, key, `rejected:`, e)
87
+ if (state.catch) {
88
+ for (const Class of state.catch) {
89
+ if (e instanceof Class) {
90
+ def = writeToCache(target, state, e)
91
+ target.logger.info(
92
+ `✨`,
93
+ state.type,
94
+ key,
95
+ `computed default`,
96
+ def,
97
+ )
98
+ return def
99
+ }
100
+ }
101
+ }
102
+ throw e
103
+ }
40
104
  } else {
41
105
  def = state.default
42
106
  target.logger.info(`✨`, state.type, key, `using static default`, def)
@@ -13,27 +13,27 @@ import { mintInStore, MUST_CREATE } from "../families/mint-in-store"
13
13
  import type { Store } from "../store"
14
14
  import { withdraw } from "../store"
15
15
 
16
- export function reduceReference<T, K extends Canonical>(
16
+ export function reduceReference<T, K extends Canonical, E>(
17
17
  store: Store,
18
18
  ...params:
19
- | [token: ReadableFamilyToken<T, K>, key: K]
20
- | [token: ReadableToken<T>]
19
+ | [token: ReadableFamilyToken<T, K, E>, key: K]
20
+ | [token: ReadableToken<T, K, E>]
21
21
  ): {
22
- token: ReadableToken<T, K>
23
- family: ReadableFamily<T, K> | undefined
22
+ token: ReadableToken<T, K, E>
23
+ family: ReadableFamily<T, K, E> | undefined
24
24
  subKey: K | undefined
25
25
  isNew: boolean
26
26
  } {
27
- let existingToken: ReadableToken<T> | undefined
28
- let brandNewToken: ReadableToken<T> | undefined
29
- let family: ReadableFamily<T, K> | undefined
27
+ let existingToken: ReadableToken<T, K, E> | undefined
28
+ let brandNewToken: ReadableToken<T, K, E> | undefined
29
+ let family: ReadableFamily<T, K, E> | undefined
30
30
  let subKey: K | undefined
31
- let token: ReadableToken<T, K>
31
+ let token: ReadableToken<T, K, E>
32
32
  if (params.length === 1) {
33
33
  token = params[0]
34
34
  if (`family` in token) {
35
35
  const familyToken = getFamilyOfToken(store, token)
36
- family = withdraw(store, familyToken) as ReadableFamily<T, K>
36
+ family = withdraw(store, familyToken) as ReadableFamily<T, K, E>
37
37
  subKey = parseJson(token.family.subKey)
38
38
  existingToken = seekInStore(store, familyToken, subKey)
39
39
  if (`counterfeit` in token) {
@@ -23,7 +23,7 @@ import type { Store } from "./store"
23
23
  import type { Subject } from "./subject"
24
24
  import type { Timeline } from "./timeline"
25
25
  import type { RootStore, Transaction } from "./transaction"
26
- import type { Flat } from "./utility-types"
26
+ import type { Ctor, Flat } from "./utility-types"
27
27
 
28
28
  export * from "./arbitrary"
29
29
  export * from "./atom"
@@ -61,12 +61,13 @@ export type AtomIOState = {
61
61
  install: (store: RootStore) => void
62
62
  subject: Subject<StateUpdate<any>>
63
63
  }
64
- export type RegularAtom<T> = Flat<
64
+ export type RegularAtom<T, E> = Flat<
65
65
  AtomIOState & {
66
66
  type: `atom`
67
67
  default: T | (() => T)
68
68
  cleanup?: () => void
69
69
  internalRoles?: internalRole[]
70
+ catch?: readonly Ctor<E>[]
70
71
  }
71
72
  >
72
73
  export type MutableAtom<T extends Transceiver<any, any, any>> = Flat<
@@ -76,8 +77,8 @@ export type MutableAtom<T extends Transceiver<any, any, any>> = Flat<
76
77
  cleanup?: () => void
77
78
  }
78
79
  >
79
- export type Atom<T> =
80
- | RegularAtom<T>
80
+ export type Atom<T, E> =
81
+ | RegularAtom<T, E>
81
82
  | (T extends Transceiver<any, any, any> ? MutableAtom<T> : never)
82
83
 
83
84
  export type WritableHeldSelector<T> = Flat<
@@ -95,48 +96,52 @@ export type ReadonlyHeldSelector<T> = Flat<
95
96
  getFrom: (target: Store) => T
96
97
  }
97
98
  >
98
- export type WritablePureSelector<T> = Flat<
99
+ export type WritablePureSelector<T, E> = Flat<
99
100
  AtomIOState & {
100
101
  type: `writable_pure_selector`
101
- getFrom: (target: Store) => T
102
+ getFrom: (target: Store) => E | T
102
103
  setSelf: (newValue: T) => void
104
+ catch?: readonly Ctor<E>[]
103
105
  }
104
106
  >
105
- export type ReadonlyPureSelector<T> = Flat<
107
+ export type ReadonlyPureSelector<T, E> = Flat<
106
108
  AtomIOState & {
107
109
  type: `readonly_pure_selector`
108
- getFrom: (target: Store) => T
110
+ getFrom: (target: Store) => E | T
111
+ catch?: readonly Ctor<E>[]
109
112
  }
110
113
  >
111
- export type ReadonlySelector<T> =
114
+ export type ReadonlySelector<T, E> =
112
115
  | ReadonlyHeldSelector<T>
113
- | ReadonlyPureSelector<T>
114
- export type WritableSelector<T> =
116
+ | ReadonlyPureSelector<T, E>
117
+ export type WritableSelector<T, E> =
115
118
  | WritableHeldSelector<T>
116
- | WritablePureSelector<T>
119
+ | WritablePureSelector<T, E>
117
120
  export type HeldSelector<T> = ReadonlyHeldSelector<T> | WritableHeldSelector<T>
118
- export type PureSelector<T> = ReadonlyPureSelector<T> | WritablePureSelector<T>
119
- export type Selector<T> =
121
+ export type PureSelector<T, E> =
122
+ | ReadonlyPureSelector<T, E>
123
+ | WritablePureSelector<T, E>
124
+ export type Selector<T, E> =
120
125
  | ReadonlyHeldSelector<T>
121
- | ReadonlyPureSelector<T>
126
+ | ReadonlyPureSelector<T, E>
122
127
  | WritableHeldSelector<T>
123
- | WritablePureSelector<T>
128
+ | WritablePureSelector<T, E>
124
129
 
125
- export type WritableState<T> = Atom<T> | WritableSelector<T>
126
- export type ReadableState<T> = Atom<T> | Selector<T>
130
+ export type WritableState<T, E> = Atom<T, E> | WritableSelector<T, E>
131
+ export type ReadableState<T, E> = Atom<T, E> | Selector<T, E>
127
132
 
128
133
  // biome-ignore format: intersection
129
- export type RegularAtomFamily<T, K extends Canonical> =
134
+ export type RegularAtomFamily<T, K extends Canonical, E = never> =
130
135
  & Flat<
131
- & RegularAtomFamilyToken<T, K>
136
+ & RegularAtomFamilyToken<T, K, E>
132
137
  & {
138
+ create: <Key extends K>(key: Key) => RegularAtomToken<T, Key, E>
133
139
  default: T | ((key: K) => T)
134
140
  install: (store: RootStore) => void
135
141
  internalRoles: string[] | undefined
136
- subject: Subject<StateLifecycleEvent<RegularAtomToken<T>>>
142
+ subject: Subject<StateLifecycleEvent<RegularAtomToken<T, K, E>>>
137
143
  }
138
144
  >
139
- & ((key: K) => RegularAtomToken<T>)
140
145
 
141
146
  // biome-ignore format: intersection
142
147
  export type MutableAtomFamily<
@@ -146,99 +151,99 @@ export type MutableAtomFamily<
146
151
  & Flat<
147
152
  & MutableAtomFamilyToken<T, K>
148
153
  & {
154
+ create: <Key extends K>(key: Key) => MutableAtomToken<T, Key>
149
155
  class: ConstructorOf<T>
150
156
  install: (store: RootStore) => void
151
157
  internalRoles: string[] | undefined
152
158
  subject: Subject<StateLifecycleEvent<MutableAtomToken<T>>>
153
159
  }
154
160
  >
155
- & ((key: K) => MutableAtomToken<T>)
156
161
 
157
- export type AtomFamily<T, K extends Canonical = Canonical> =
162
+ export type AtomFamily<T, K extends Canonical, E> =
158
163
  | MutableAtomFamily<T extends Transceiver<any, any, any> ? T : never, K>
159
- | RegularAtomFamily<T, K>
164
+ | RegularAtomFamily<T, K, E>
160
165
 
161
166
  // biome-ignore format: intersection
162
- export type WritablePureSelectorFamily<T, K extends Canonical> =
167
+ export type WritablePureSelectorFamily<T, K extends Canonical, E> =
163
168
  & Flat<
164
- & WritablePureSelectorFamilyToken<T, K>
169
+ & WritablePureSelectorFamilyToken<T, K, E>
165
170
  & {
171
+ create: <Key extends K>(key: Key) => WritablePureSelectorToken<T, Key, E>
166
172
  default: (key: K) => T,
167
173
  install: (store: RootStore) => void
168
174
  internalRoles: string[] | undefined
169
- subject: Subject<StateLifecycleEvent<WritablePureSelectorToken<T>>>
175
+ subject: Subject<StateLifecycleEvent<WritablePureSelectorToken<T, K, E>>>
170
176
  }
171
177
  >
172
- & ((key: K) => WritablePureSelectorToken<T>)
173
178
 
174
179
  // biome-ignore format: intersection
175
180
  export type WritableHeldSelectorFamily<T , K extends Canonical> =
176
181
  & Flat<
177
182
  & WritableHeldSelectorFamilyToken<T, K>
178
183
  & {
184
+ create: <Key extends K>(key: Key) => WritableHeldSelectorToken<T, Key>
179
185
  default: (key: K) => T,
180
186
  install: (store: RootStore) => void
181
187
  internalRoles: string[] | undefined
182
- subject: Subject<StateLifecycleEvent<WritableHeldSelectorToken<T>>>
188
+ subject: Subject<StateLifecycleEvent<WritableHeldSelectorToken<T, K>>>
183
189
  }
184
190
  >
185
- & ((key: K) => WritableHeldSelectorToken<T>)
186
191
 
187
192
  // biome-ignore format: intersection
188
- export type ReadonlyPureSelectorFamily<T, K extends Canonical> =
193
+ export type ReadonlyPureSelectorFamily<T, K extends Canonical, E> =
189
194
  & Flat<
190
- & ReadonlyPureSelectorFamilyToken<T, K>
195
+ & ReadonlyPureSelectorFamilyToken<T, K, E>
191
196
  & {
197
+ create: <Key extends K>(key: Key) => ReadonlyPureSelectorToken<T, Key, E>
192
198
  default: (key: K) => T,
193
199
  install: (store: RootStore) => void
194
200
  internalRoles: string[] | undefined
195
- subject: Subject<StateLifecycleEvent<ReadonlyPureSelectorToken<T>>>
201
+ subject: Subject<StateLifecycleEvent<ReadonlyPureSelectorToken<T, K, E>>>
196
202
  }
197
203
  >
198
- & ((key: K) => ReadonlyPureSelectorToken<T>)
199
204
 
200
205
  // biome-ignore format: intersection
201
206
  export type ReadonlyHeldSelectorFamily<T , K extends Canonical> =
202
207
  & Flat<
203
208
  & ReadonlyHeldSelectorFamilyToken<T, K>
204
209
  & {
210
+ create: <Key extends K>(key: Key) => ReadonlyHeldSelectorToken<T, Key>
205
211
  default: (key: K) => T,
206
212
  install: (store: RootStore) => void
207
213
  internalRoles: string[] | undefined
208
214
  subject: Subject<StateLifecycleEvent<ReadonlyHeldSelectorToken<T>>>
209
215
  }
210
216
  >
211
- & ((key: K) => ReadonlyHeldSelectorToken<T>)
212
217
 
213
- export type PureSelectorFamily<T, K extends Canonical> =
214
- | ReadonlyPureSelectorFamily<T, K>
215
- | WritablePureSelectorFamily<T, K>
218
+ export type PureSelectorFamily<T, K extends Canonical, E> =
219
+ | ReadonlyPureSelectorFamily<T, K, E>
220
+ | WritablePureSelectorFamily<T, K, E>
216
221
 
217
222
  export type HeldSelectorFamily<T, K extends Canonical> =
218
223
  | ReadonlyHeldSelectorFamily<T, K>
219
224
  | WritableHeldSelectorFamily<T, K>
220
225
 
221
- export type ReadonlySelectorFamily<T, K extends Canonical> =
226
+ export type ReadonlySelectorFamily<T, K extends Canonical, E> =
222
227
  | ReadonlyHeldSelectorFamily<T, K>
223
- | ReadonlyPureSelectorFamily<T, K>
228
+ | ReadonlyPureSelectorFamily<T, K, E>
224
229
 
225
- export type WritableSelectorFamily<T, K extends Canonical> =
230
+ export type WritableSelectorFamily<T, K extends Canonical, E> =
226
231
  | WritableHeldSelectorFamily<T, K>
227
- | WritablePureSelectorFamily<T, K>
232
+ | WritablePureSelectorFamily<T, K, E>
228
233
 
229
- export type SelectorFamily<T, K extends Canonical> =
234
+ export type SelectorFamily<T, K extends Canonical, E> =
230
235
  | HeldSelectorFamily<T, K>
231
- | PureSelectorFamily<T, K>
236
+ | PureSelectorFamily<T, K, E>
232
237
 
233
- export type WritableFamily<T, K extends Canonical> =
234
- | AtomFamily<T, K>
235
- | WritablePureSelectorFamily<T, K>
236
- export type ReadableFamily<T, K extends Canonical> =
237
- | AtomFamily<T, K>
238
- | SelectorFamily<T, K>
238
+ export type WritableFamily<T, K extends Canonical, E> =
239
+ | AtomFamily<T, K, E>
240
+ | WritableSelectorFamily<T, K, E>
241
+ export type ReadableFamily<T, K extends Canonical, E> =
242
+ | AtomFamily<T, K, E>
243
+ | SelectorFamily<T, K, E>
239
244
 
240
245
  export type AtomIOInternalResource =
241
- | ReadableFamily<any, any>
242
- | ReadableState<any>
246
+ | ReadableFamily<any, any, any>
247
+ | ReadableState<any, any>
243
248
  | Timeline<any>
244
249
  | Transaction<any>