effect 3.9.1 → 3.10.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.
Files changed (221) hide show
  1. package/Arbitrary/package.json +6 -0
  2. package/FastCheck/package.json +6 -0
  3. package/JSONSchema/package.json +6 -0
  4. package/ParseResult/package.json +6 -0
  5. package/Pretty/package.json +6 -0
  6. package/Schema/package.json +6 -0
  7. package/SchemaAST/package.json +6 -0
  8. package/TSubscriptionRef/package.json +6 -0
  9. package/dist/cjs/Arbitrary.js +490 -0
  10. package/dist/cjs/Arbitrary.js.map +1 -0
  11. package/dist/cjs/Effect.js +247 -16
  12. package/dist/cjs/Effect.js.map +1 -1
  13. package/dist/cjs/FastCheck.js +17 -0
  14. package/dist/cjs/FastCheck.js.map +1 -0
  15. package/dist/cjs/Inspectable.js +43 -3
  16. package/dist/cjs/Inspectable.js.map +1 -1
  17. package/dist/cjs/JSONSchema.js +418 -0
  18. package/dist/cjs/JSONSchema.js.map +1 -0
  19. package/dist/cjs/ParseResult.js +1539 -0
  20. package/dist/cjs/ParseResult.js.map +1 -0
  21. package/dist/cjs/Predicate.js +3 -1
  22. package/dist/cjs/Predicate.js.map +1 -1
  23. package/dist/cjs/Pretty.js +183 -0
  24. package/dist/cjs/Pretty.js.map +1 -0
  25. package/dist/cjs/Schema.js +5529 -0
  26. package/dist/cjs/Schema.js.map +1 -0
  27. package/dist/cjs/SchemaAST.js +2365 -0
  28. package/dist/cjs/SchemaAST.js.map +1 -0
  29. package/dist/cjs/Stream.js +17 -3
  30. package/dist/cjs/Stream.js.map +1 -1
  31. package/dist/cjs/TPubSub.js +9 -1
  32. package/dist/cjs/TPubSub.js.map +1 -1
  33. package/dist/cjs/TQueue.js.map +1 -1
  34. package/dist/cjs/TRef.js.map +1 -1
  35. package/dist/cjs/TSubscriptionRef.js +96 -0
  36. package/dist/cjs/TSubscriptionRef.js.map +1 -0
  37. package/dist/cjs/index.js +18 -2
  38. package/dist/cjs/index.js.map +1 -1
  39. package/dist/cjs/internal/cause.js +2 -2
  40. package/dist/cjs/internal/cause.js.map +1 -1
  41. package/dist/cjs/internal/core.js +4 -4
  42. package/dist/cjs/internal/core.js.map +1 -1
  43. package/dist/cjs/internal/doNotation.js.map +1 -1
  44. package/dist/cjs/internal/fiberRuntime.js +14 -12
  45. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  46. package/dist/cjs/internal/logger.js +7 -6
  47. package/dist/cjs/internal/logger.js.map +1 -1
  48. package/dist/cjs/internal/redacted.js +4 -0
  49. package/dist/cjs/internal/redacted.js.map +1 -1
  50. package/dist/cjs/internal/schema/errors.js +116 -0
  51. package/dist/cjs/internal/schema/errors.js.map +1 -0
  52. package/dist/cjs/internal/schema/filters.js +41 -0
  53. package/dist/cjs/internal/schema/filters.js.map +1 -0
  54. package/dist/cjs/internal/schema/util.js +96 -0
  55. package/dist/cjs/internal/schema/util.js.map +1 -0
  56. package/dist/cjs/internal/stm/core.js +2 -3
  57. package/dist/cjs/internal/stm/core.js.map +1 -1
  58. package/dist/cjs/internal/stm/tPubSub.js.map +1 -1
  59. package/dist/cjs/internal/stm/tQueue.js +1 -2
  60. package/dist/cjs/internal/stm/tQueue.js.map +1 -1
  61. package/dist/cjs/internal/stm/tRef.js +6 -2
  62. package/dist/cjs/internal/stm/tRef.js.map +1 -1
  63. package/dist/cjs/internal/stm/tSubscriptionRef.js +178 -0
  64. package/dist/cjs/internal/stm/tSubscriptionRef.js.map +1 -0
  65. package/dist/cjs/internal/stream.js +36 -16
  66. package/dist/cjs/internal/stream.js.map +1 -1
  67. package/dist/cjs/internal/version.js +1 -1
  68. package/dist/cjs/internal/version.js.map +1 -1
  69. package/dist/dts/Arbitrary.d.ts +45 -0
  70. package/dist/dts/Arbitrary.d.ts.map +1 -0
  71. package/dist/dts/Array.d.ts +4 -4
  72. package/dist/dts/Array.d.ts.map +1 -1
  73. package/dist/dts/Effect.d.ts +304 -36
  74. package/dist/dts/Effect.d.ts.map +1 -1
  75. package/dist/dts/Either.d.ts +4 -4
  76. package/dist/dts/Either.d.ts.map +1 -1
  77. package/dist/dts/FastCheck.d.ts +9 -0
  78. package/dist/dts/FastCheck.d.ts.map +1 -0
  79. package/dist/dts/Inspectable.d.ts +28 -0
  80. package/dist/dts/Inspectable.d.ts.map +1 -1
  81. package/dist/dts/JSONSchema.d.ts +181 -0
  82. package/dist/dts/JSONSchema.d.ts.map +1 -0
  83. package/dist/dts/Micro.d.ts +4 -4
  84. package/dist/dts/Micro.d.ts.map +1 -1
  85. package/dist/dts/Option.d.ts +4 -4
  86. package/dist/dts/Option.d.ts.map +1 -1
  87. package/dist/dts/ParseResult.d.ts +551 -0
  88. package/dist/dts/ParseResult.d.ts.map +1 -0
  89. package/dist/dts/Predicate.d.ts.map +1 -1
  90. package/dist/dts/Pretty.d.ts +26 -0
  91. package/dist/dts/Pretty.d.ts.map +1 -0
  92. package/dist/dts/STM.d.ts +4 -4
  93. package/dist/dts/STM.d.ts.map +1 -1
  94. package/dist/dts/Schema.d.ts +4562 -0
  95. package/dist/dts/Schema.d.ts.map +1 -0
  96. package/dist/dts/SchemaAST.d.ts +1321 -0
  97. package/dist/dts/SchemaAST.d.ts.map +1 -0
  98. package/dist/dts/Stream.d.ts +78 -13
  99. package/dist/dts/Stream.d.ts.map +1 -1
  100. package/dist/dts/TPubSub.d.ts +8 -0
  101. package/dist/dts/TPubSub.d.ts.map +1 -1
  102. package/dist/dts/TQueue.d.ts +7 -7
  103. package/dist/dts/TQueue.d.ts.map +1 -1
  104. package/dist/dts/TRef.d.ts +2 -1
  105. package/dist/dts/TRef.d.ts.map +1 -1
  106. package/dist/dts/TSubscriptionRef.d.ts +251 -0
  107. package/dist/dts/TSubscriptionRef.d.ts.map +1 -0
  108. package/dist/dts/index.d.ts +32 -0
  109. package/dist/dts/index.d.ts.map +1 -1
  110. package/dist/dts/internal/fiberRuntime.d.ts.map +1 -1
  111. package/dist/dts/internal/schema/errors.d.ts +2 -0
  112. package/dist/dts/internal/schema/errors.d.ts.map +1 -0
  113. package/dist/dts/internal/schema/filters.d.ts +2 -0
  114. package/dist/dts/internal/schema/filters.d.ts.map +1 -0
  115. package/dist/dts/internal/schema/util.d.ts +2 -0
  116. package/dist/dts/internal/schema/util.d.ts.map +1 -0
  117. package/dist/dts/internal/stm/tRef.d.ts +3 -1
  118. package/dist/dts/internal/stm/tRef.d.ts.map +1 -1
  119. package/dist/dts/internal/stm/tSubscriptionRef.d.ts +2 -0
  120. package/dist/dts/internal/stm/tSubscriptionRef.d.ts.map +1 -0
  121. package/dist/dts/internal/stream.d.ts.map +1 -1
  122. package/dist/esm/Arbitrary.js +472 -0
  123. package/dist/esm/Arbitrary.js.map +1 -0
  124. package/dist/esm/Effect.js +256 -18
  125. package/dist/esm/Effect.js.map +1 -1
  126. package/dist/esm/FastCheck.js +9 -0
  127. package/dist/esm/FastCheck.js.map +1 -0
  128. package/dist/esm/Inspectable.js +39 -2
  129. package/dist/esm/Inspectable.js.map +1 -1
  130. package/dist/esm/JSONSchema.js +408 -0
  131. package/dist/esm/JSONSchema.js.map +1 -0
  132. package/dist/esm/ParseResult.js +1503 -0
  133. package/dist/esm/ParseResult.js.map +1 -0
  134. package/dist/esm/Predicate.js +2 -1
  135. package/dist/esm/Predicate.js.map +1 -1
  136. package/dist/esm/Pretty.js +173 -0
  137. package/dist/esm/Pretty.js.map +1 -0
  138. package/dist/esm/Schema.js +5328 -0
  139. package/dist/esm/Schema.js.map +1 -0
  140. package/dist/esm/SchemaAST.js +2300 -0
  141. package/dist/esm/SchemaAST.js.map +1 -0
  142. package/dist/esm/Stream.js +14 -0
  143. package/dist/esm/Stream.js.map +1 -1
  144. package/dist/esm/TPubSub.js +8 -0
  145. package/dist/esm/TPubSub.js.map +1 -1
  146. package/dist/esm/TQueue.js.map +1 -1
  147. package/dist/esm/TRef.js.map +1 -1
  148. package/dist/esm/TSubscriptionRef.js +87 -0
  149. package/dist/esm/TSubscriptionRef.js.map +1 -0
  150. package/dist/esm/index.js +32 -0
  151. package/dist/esm/index.js.map +1 -1
  152. package/dist/esm/internal/cause.js +3 -3
  153. package/dist/esm/internal/cause.js.map +1 -1
  154. package/dist/esm/internal/core.js +4 -4
  155. package/dist/esm/internal/core.js.map +1 -1
  156. package/dist/esm/internal/doNotation.js.map +1 -1
  157. package/dist/esm/internal/fiberRuntime.js +14 -12
  158. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  159. package/dist/esm/internal/logger.js +7 -6
  160. package/dist/esm/internal/logger.js.map +1 -1
  161. package/dist/esm/internal/redacted.js +4 -0
  162. package/dist/esm/internal/redacted.js.map +1 -1
  163. package/dist/esm/internal/schema/errors.js +87 -0
  164. package/dist/esm/internal/schema/errors.js.map +1 -0
  165. package/dist/esm/internal/schema/filters.js +35 -0
  166. package/dist/esm/internal/schema/filters.js.map +1 -0
  167. package/dist/esm/internal/schema/util.js +78 -0
  168. package/dist/esm/internal/schema/util.js.map +1 -0
  169. package/dist/esm/internal/stm/core.js +1 -2
  170. package/dist/esm/internal/stm/core.js.map +1 -1
  171. package/dist/esm/internal/stm/tPubSub.js.map +1 -1
  172. package/dist/esm/internal/stm/tQueue.js +1 -2
  173. package/dist/esm/internal/stm/tQueue.js.map +1 -1
  174. package/dist/esm/internal/stm/tRef.js +5 -1
  175. package/dist/esm/internal/stm/tRef.js.map +1 -1
  176. package/dist/esm/internal/stm/tSubscriptionRef.js +166 -0
  177. package/dist/esm/internal/stm/tSubscriptionRef.js.map +1 -0
  178. package/dist/esm/internal/stream.js +33 -15
  179. package/dist/esm/internal/stream.js.map +1 -1
  180. package/dist/esm/internal/version.js +1 -1
  181. package/dist/esm/internal/version.js.map +1 -1
  182. package/package.json +68 -1
  183. package/src/Arbitrary.ts +563 -0
  184. package/src/Array.ts +4 -4
  185. package/src/Effect.ts +308 -37
  186. package/src/Either.ts +4 -4
  187. package/src/FastCheck.ts +9 -0
  188. package/src/Inspectable.ts +56 -2
  189. package/src/JSONSchema.ts +601 -0
  190. package/src/Micro.ts +4 -4
  191. package/src/Option.ts +4 -4
  192. package/src/ParseResult.ts +2027 -0
  193. package/src/Predicate.ts +3 -1
  194. package/src/Pretty.ts +204 -0
  195. package/src/STM.ts +4 -4
  196. package/src/Schema.ts +10388 -0
  197. package/src/SchemaAST.ts +2827 -0
  198. package/src/Stream.ts +87 -23
  199. package/src/TPubSub.ts +9 -0
  200. package/src/TQueue.ts +7 -7
  201. package/src/TRef.ts +2 -1
  202. package/src/TSubscriptionRef.ts +284 -0
  203. package/src/index.ts +40 -0
  204. package/src/internal/cause.ts +3 -3
  205. package/src/internal/core-effect.ts +6 -6
  206. package/src/internal/core.ts +4 -4
  207. package/src/internal/doNotation.ts +7 -6
  208. package/src/internal/fiberRuntime.ts +14 -12
  209. package/src/internal/groupBy.ts +2 -2
  210. package/src/internal/logger.ts +7 -6
  211. package/src/internal/redacted.ts +4 -0
  212. package/src/internal/schema/errors.ts +189 -0
  213. package/src/internal/schema/filters.ts +86 -0
  214. package/src/internal/schema/util.ts +113 -0
  215. package/src/internal/stm/core.ts +1 -2
  216. package/src/internal/stm/tPubSub.ts +1 -0
  217. package/src/internal/stm/tQueue.ts +2 -2
  218. package/src/internal/stm/tRef.ts +7 -2
  219. package/src/internal/stm/tSubscriptionRef.ts +286 -0
  220. package/src/internal/stream.ts +101 -24
  221. package/src/internal/version.ts +1 -1
package/src/Predicate.ts CHANGED
@@ -549,7 +549,9 @@ export const isNever: (input: unknown) => input is never = (_: unknown): _ is ne
549
549
  */
550
550
  export const isUnknown: (input: unknown) => input is unknown = (_): _ is unknown => true
551
551
 
552
- const isRecordOrArray = (input: unknown) => typeof input === "object" && input !== null
552
+ /** @internal */
553
+ export const isRecordOrArray = (input: unknown): input is { [x: PropertyKey]: unknown } =>
554
+ typeof input === "object" && input !== null
553
555
 
554
556
  /**
555
557
  * Tests if a value is an `object`.
package/src/Pretty.ts ADDED
@@ -0,0 +1,204 @@
1
+ /**
2
+ * @since 3.10.0
3
+ */
4
+ import * as Arr from "./Array.js"
5
+ import * as errors_ from "./internal/schema/errors.js"
6
+ import * as util_ from "./internal/schema/util.js"
7
+ import * as Option from "./Option.js"
8
+ import * as ParseResult from "./ParseResult.js"
9
+ import type * as Schema from "./Schema.js"
10
+ import * as AST from "./SchemaAST.js"
11
+
12
+ /**
13
+ * @category model
14
+ * @since 3.10.0
15
+ */
16
+ export interface Pretty<To> {
17
+ (a: To): string
18
+ }
19
+
20
+ /**
21
+ * @category annotations
22
+ * @since 3.10.0
23
+ */
24
+ export type PrettyAnnotation<A, TypeParameters extends ReadonlyArray<any> = readonly []> = (
25
+ ...pretties: { readonly [K in keyof TypeParameters]: Pretty<TypeParameters[K]> }
26
+ ) => Pretty<A>
27
+
28
+ /**
29
+ * @category prettify
30
+ * @since 3.10.0
31
+ */
32
+ export const make = <A, I, R>(schema: Schema.Schema<A, I, R>): (a: A) => string => compile(schema.ast, [])
33
+
34
+ const getPrettyAnnotation = AST.getAnnotation<PrettyAnnotation<any, any>>(AST.PrettyAnnotationId)
35
+
36
+ const getMatcher = (defaultPretty: Pretty<any>) => (ast: AST.AST): Pretty<any> =>
37
+ Option.match(getPrettyAnnotation(ast), {
38
+ onNone: () => defaultPretty,
39
+ onSome: (handler) => handler()
40
+ })
41
+
42
+ const toString = getMatcher((a) => String(a))
43
+
44
+ const stringify = getMatcher((a) => JSON.stringify(a))
45
+
46
+ const formatUnknown = getMatcher(util_.formatUnknown)
47
+
48
+ /**
49
+ * @since 3.10.0
50
+ */
51
+ export const match: AST.Match<Pretty<any>> = {
52
+ "Declaration": (ast, go, path) => {
53
+ const annotation = getPrettyAnnotation(ast)
54
+ if (Option.isSome(annotation)) {
55
+ return annotation.value(...ast.typeParameters.map((tp) => go(tp, path)))
56
+ }
57
+ throw new Error(errors_.getPrettyMissingAnnotationErrorMessage(path, ast))
58
+ },
59
+ "VoidKeyword": getMatcher(() => "void(0)"),
60
+ "NeverKeyword": getMatcher(() => {
61
+ throw new Error(errors_.getPrettyNeverErrorMessage)
62
+ }),
63
+ "Literal": getMatcher((literal: AST.LiteralValue): string =>
64
+ typeof literal === "bigint" ?
65
+ `${String(literal)}n` :
66
+ JSON.stringify(literal)
67
+ ),
68
+ "SymbolKeyword": toString,
69
+ "UniqueSymbol": toString,
70
+ "TemplateLiteral": stringify,
71
+ "UndefinedKeyword": toString,
72
+ "UnknownKeyword": formatUnknown,
73
+ "AnyKeyword": formatUnknown,
74
+ "ObjectKeyword": formatUnknown,
75
+ "StringKeyword": stringify,
76
+ "NumberKeyword": toString,
77
+ "BooleanKeyword": toString,
78
+ "BigIntKeyword": getMatcher((a) => `${String(a)}n`),
79
+ "Enums": stringify,
80
+ "TupleType": (ast, go, path) => {
81
+ const hook = getPrettyAnnotation(ast)
82
+ if (Option.isSome(hook)) {
83
+ return hook.value()
84
+ }
85
+ const elements = ast.elements.map((e, i) => go(e.type, path.concat(i)))
86
+ const rest = ast.rest.map((annotatedAST) => go(annotatedAST.type, path))
87
+ return (input: ReadonlyArray<unknown>) => {
88
+ const output: Array<string> = []
89
+ let i = 0
90
+ // ---------------------------------------------
91
+ // handle elements
92
+ // ---------------------------------------------
93
+ for (; i < elements.length; i++) {
94
+ if (input.length < i + 1) {
95
+ if (ast.elements[i].isOptional) {
96
+ continue
97
+ }
98
+ } else {
99
+ output.push(elements[i](input[i]))
100
+ }
101
+ }
102
+ // ---------------------------------------------
103
+ // handle rest element
104
+ // ---------------------------------------------
105
+ if (Arr.isNonEmptyReadonlyArray(rest)) {
106
+ const [head, ...tail] = rest
107
+ for (; i < input.length - tail.length; i++) {
108
+ output.push(head(input[i]))
109
+ }
110
+ // ---------------------------------------------
111
+ // handle post rest elements
112
+ // ---------------------------------------------
113
+ for (let j = 0; j < tail.length; j++) {
114
+ i += j
115
+ output.push(tail[j](input[i]))
116
+ }
117
+ }
118
+
119
+ return "[" + output.join(", ") + "]"
120
+ }
121
+ },
122
+ "TypeLiteral": (ast, go, path) => {
123
+ const hook = getPrettyAnnotation(ast)
124
+ if (Option.isSome(hook)) {
125
+ return hook.value()
126
+ }
127
+ const propertySignaturesTypes = ast.propertySignatures.map((ps) => go(ps.type, path.concat(ps.name)))
128
+ const indexSignatureTypes = ast.indexSignatures.map((is) => go(is.type, path))
129
+ const expectedKeys: any = {}
130
+ for (let i = 0; i < propertySignaturesTypes.length; i++) {
131
+ expectedKeys[ast.propertySignatures[i].name] = null
132
+ }
133
+ return (input: { readonly [x: PropertyKey]: unknown }) => {
134
+ const output: Array<string> = []
135
+ // ---------------------------------------------
136
+ // handle property signatures
137
+ // ---------------------------------------------
138
+ for (let i = 0; i < propertySignaturesTypes.length; i++) {
139
+ const ps = ast.propertySignatures[i]
140
+ const name = ps.name
141
+ if (ps.isOptional && !Object.prototype.hasOwnProperty.call(input, name)) {
142
+ continue
143
+ }
144
+ output.push(
145
+ `${util_.formatPropertyKey(name)}: ${propertySignaturesTypes[i](input[name])}`
146
+ )
147
+ }
148
+ // ---------------------------------------------
149
+ // handle index signatures
150
+ // ---------------------------------------------
151
+ if (indexSignatureTypes.length > 0) {
152
+ for (let i = 0; i < indexSignatureTypes.length; i++) {
153
+ const type = indexSignatureTypes[i]
154
+ const keys = util_.getKeysForIndexSignature(input, ast.indexSignatures[i].parameter)
155
+ for (const key of keys) {
156
+ if (Object.prototype.hasOwnProperty.call(expectedKeys, key)) {
157
+ continue
158
+ }
159
+ output.push(`${util_.formatPropertyKey(key)}: ${type(input[key])}`)
160
+ }
161
+ }
162
+ }
163
+
164
+ return Arr.isNonEmptyReadonlyArray(output) ? "{ " + output.join(", ") + " }" : "{}"
165
+ }
166
+ },
167
+ "Union": (ast, go, path) => {
168
+ const hook = getPrettyAnnotation(ast)
169
+ if (Option.isSome(hook)) {
170
+ return hook.value()
171
+ }
172
+ const types = ast.types.map((ast) => [ParseResult.is({ ast } as any), go(ast, path)] as const)
173
+ return (a) => {
174
+ const index = types.findIndex(([is]) => is(a))
175
+ if (index === -1) {
176
+ throw new Error(errors_.getPrettyNoMatchingSchemaErrorMessage(a, path, ast))
177
+ }
178
+ return types[index][1](a)
179
+ }
180
+ },
181
+ "Suspend": (ast, go, path) => {
182
+ return Option.match(getPrettyAnnotation(ast), {
183
+ onNone: () => {
184
+ const get = util_.memoizeThunk(() => go(ast.f(), path))
185
+ return (a) => get()(a)
186
+ },
187
+ onSome: (handler) => handler()
188
+ })
189
+ },
190
+ "Refinement": (ast, go, path) => {
191
+ return Option.match(getPrettyAnnotation(ast), {
192
+ onNone: () => go(ast.from, path),
193
+ onSome: (handler) => handler()
194
+ })
195
+ },
196
+ "Transformation": (ast, go, path) => {
197
+ return Option.match(getPrettyAnnotation(ast), {
198
+ onNone: () => go(ast.to, path),
199
+ onSome: (handler) => handler()
200
+ })
201
+ }
202
+ }
203
+
204
+ const compile = AST.getCompiler(match)
package/src/STM.ts CHANGED
@@ -3094,7 +3094,7 @@ export const bind: {
3094
3094
  */
3095
3095
  <N extends string, K, A, E2, R2>(
3096
3096
  tag: Exclude<N, keyof K>,
3097
- f: (_: K) => STM<A, E2, R2>
3097
+ f: (_: NoInfer<K>) => STM<A, E2, R2>
3098
3098
  ): <E, R>(self: STM<K, E, R>) => STM<MergeRecord<K, { [k in N]: A }>, E2 | E, R2 | R>
3099
3099
  /**
3100
3100
  * @category do notation
@@ -3103,19 +3103,19 @@ export const bind: {
3103
3103
  <K, E, R, N extends string, A, E2, R2>(
3104
3104
  self: STM<K, E, R>,
3105
3105
  tag: Exclude<N, keyof K>,
3106
- f: (_: K) => STM<A, E2, R2>
3106
+ f: (_: NoInfer<K>) => STM<A, E2, R2>
3107
3107
  ): STM<MergeRecord<K, { [k in N]: A }>, E | E2, R | R2>
3108
3108
  } = stm.bind
3109
3109
 
3110
3110
  const let_: {
3111
3111
  <N extends string, K, A>(
3112
3112
  tag: Exclude<N, keyof K>,
3113
- f: (_: K) => A
3113
+ f: (_: NoInfer<K>) => A
3114
3114
  ): <E, R>(self: STM<K, E, R>) => STM<MergeRecord<K, { [k in N]: A }>, E, R>
3115
3115
  <K, E, R, N extends string, A>(
3116
3116
  self: STM<K, E, R>,
3117
3117
  tag: Exclude<N, keyof K>,
3118
- f: (_: K) => A
3118
+ f: (_: NoInfer<K>) => A
3119
3119
  ): STM<MergeRecord<K, { [k in N]: A }>, E, R>
3120
3120
  } = stm.let_
3121
3121