effect 3.19.18 → 3.20.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.
- package/dist/cjs/Data.js.map +1 -1
- package/dist/cjs/ParseResult.js +4 -5
- package/dist/cjs/ParseResult.js.map +1 -1
- package/dist/cjs/Scheduler.js +78 -72
- package/dist/cjs/Scheduler.js.map +1 -1
- package/dist/cjs/SchemaAST.js +4 -0
- package/dist/cjs/SchemaAST.js.map +1 -1
- package/dist/cjs/internal/effect/circular.js +13 -9
- package/dist/cjs/internal/effect/circular.js.map +1 -1
- package/dist/cjs/internal/fiberRuntime.js +8 -4
- package/dist/cjs/internal/fiberRuntime.js.map +1 -1
- package/dist/cjs/internal/managedRuntime.js +5 -2
- package/dist/cjs/internal/managedRuntime.js.map +1 -1
- package/dist/cjs/internal/version.js +1 -1
- package/dist/cjs/internal/version.js.map +1 -1
- package/dist/dts/Cron.d.ts +1 -1
- package/dist/dts/Data.d.ts +11 -11
- package/dist/dts/Data.d.ts.map +1 -1
- package/dist/dts/Graph.d.ts +1 -1
- package/dist/dts/ParseResult.d.ts +1 -1
- package/dist/dts/ParseResult.d.ts.map +1 -1
- package/dist/dts/Scheduler.d.ts +22 -19
- package/dist/dts/Scheduler.d.ts.map +1 -1
- package/dist/dts/SchemaAST.d.ts.map +1 -1
- package/dist/dts/Types.d.ts +7 -0
- package/dist/dts/Types.d.ts.map +1 -1
- package/dist/dts/internal/fiberRuntime.d.ts.map +1 -1
- package/dist/esm/Data.js.map +1 -1
- package/dist/esm/ParseResult.js +4 -5
- package/dist/esm/ParseResult.js.map +1 -1
- package/dist/esm/Scheduler.js +76 -71
- package/dist/esm/Scheduler.js.map +1 -1
- package/dist/esm/SchemaAST.js +4 -0
- package/dist/esm/SchemaAST.js.map +1 -1
- package/dist/esm/internal/effect/circular.js +13 -9
- package/dist/esm/internal/effect/circular.js.map +1 -1
- package/dist/esm/internal/fiberRuntime.js +8 -4
- package/dist/esm/internal/fiberRuntime.js.map +1 -1
- package/dist/esm/internal/managedRuntime.js +5 -2
- package/dist/esm/internal/managedRuntime.js.map +1 -1
- package/dist/esm/internal/version.js +1 -1
- package/dist/esm/internal/version.js.map +1 -1
- package/package.json +1 -1
- package/src/Data.ts +7 -13
- package/src/ParseResult.ts +4 -5
- package/src/Scheduler.ts +84 -75
- package/src/SchemaAST.ts +4 -0
- package/src/Types.ts +8 -0
- package/src/internal/effect/circular.ts +24 -16
- package/src/internal/fiberRuntime.ts +30 -13
- package/src/internal/managedRuntime.ts +5 -2
- package/src/internal/version.ts +1 -1
package/src/Data.ts
CHANGED
|
@@ -19,8 +19,7 @@ export declare namespace Case {
|
|
|
19
19
|
*/
|
|
20
20
|
export interface Constructor<A, Tag extends keyof A = never> {
|
|
21
21
|
(
|
|
22
|
-
args: Types.
|
|
23
|
-
: { readonly [P in keyof A as P extends Tag ? never : P]: A[P] }
|
|
22
|
+
args: Types.VoidIfEmpty<{ readonly [P in keyof A as P extends Tag ? never : P]: A[P] }>
|
|
24
23
|
): A
|
|
25
24
|
}
|
|
26
25
|
}
|
|
@@ -202,8 +201,7 @@ export const tagged = <A extends { readonly _tag: string }>(
|
|
|
202
201
|
* @category constructors
|
|
203
202
|
*/
|
|
204
203
|
export const Class: new<A extends Record<string, any> = {}>(
|
|
205
|
-
args: Types.
|
|
206
|
-
: { readonly [P in keyof A]: A[P] }
|
|
204
|
+
args: Types.VoidIfEmpty<{ readonly [P in keyof A]: A[P] }>
|
|
207
205
|
) => Readonly<A> = internal.Structural as any
|
|
208
206
|
|
|
209
207
|
/**
|
|
@@ -234,8 +232,7 @@ export const Class: new<A extends Record<string, any> = {}>(
|
|
|
234
232
|
export const TaggedClass = <Tag extends string>(
|
|
235
233
|
tag: Tag
|
|
236
234
|
): new<A extends Record<string, any> = {}>(
|
|
237
|
-
args: Types.
|
|
238
|
-
: { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }
|
|
235
|
+
args: Types.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>
|
|
239
236
|
) => Readonly<A> & { readonly _tag: Tag } => {
|
|
240
237
|
class Base extends Class<any> {
|
|
241
238
|
readonly _tag = tag
|
|
@@ -248,8 +245,7 @@ export const TaggedClass = <Tag extends string>(
|
|
|
248
245
|
* @category constructors
|
|
249
246
|
*/
|
|
250
247
|
export const Structural: new<A>(
|
|
251
|
-
args: Types.
|
|
252
|
-
: { readonly [P in keyof A]: A[P] }
|
|
248
|
+
args: Types.VoidIfEmpty<{ readonly [P in keyof A]: A[P] }>
|
|
253
249
|
) => {} = internal.Structural as any
|
|
254
250
|
|
|
255
251
|
/**
|
|
@@ -339,7 +335,7 @@ export declare namespace TaggedEnum {
|
|
|
339
335
|
A extends { readonly _tag: string },
|
|
340
336
|
K extends A["_tag"],
|
|
341
337
|
E = Extract<A, { readonly _tag: K }>
|
|
342
|
-
> = { readonly [K in keyof E as K extends "_tag" ? never : K]: E[K] } extends infer T ?
|
|
338
|
+
> = { readonly [K in keyof E as K extends "_tag" ? never : K]: E[K] } extends infer T ? Types.VoidIfEmpty<T>
|
|
343
339
|
: never
|
|
344
340
|
|
|
345
341
|
/**
|
|
@@ -731,8 +727,7 @@ function taggedMatch<
|
|
|
731
727
|
* @category constructors
|
|
732
728
|
*/
|
|
733
729
|
export const Error: new<A extends Record<string, any> = {}>(
|
|
734
|
-
args: Types.
|
|
735
|
-
: { readonly [P in keyof A]: A[P] }
|
|
730
|
+
args: Types.VoidIfEmpty<{ readonly [P in keyof A]: A[P] }>
|
|
736
731
|
) => Cause.YieldableError & Readonly<A> = (function() {
|
|
737
732
|
const plainArgsSymbol = Symbol.for("effect/Data/Error/plainArgs")
|
|
738
733
|
const O = {
|
|
@@ -758,8 +753,7 @@ export const Error: new<A extends Record<string, any> = {}>(
|
|
|
758
753
|
* @category constructors
|
|
759
754
|
*/
|
|
760
755
|
export const TaggedError = <Tag extends string>(tag: Tag): new<A extends Record<string, any> = {}>(
|
|
761
|
-
args: Types.
|
|
762
|
-
: { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }
|
|
756
|
+
args: Types.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>
|
|
763
757
|
) => Cause.YieldableError & { readonly _tag: Tag } & Readonly<A> => {
|
|
764
758
|
const O = {
|
|
765
759
|
BaseEffectError: class extends Error<{}> {
|
package/src/ParseResult.ts
CHANGED
|
@@ -1071,15 +1071,15 @@ const go = (ast: AST.AST, isDecoding: boolean): Parser => {
|
|
|
1071
1071
|
// handle post rest elements
|
|
1072
1072
|
// ---------------------------------------------
|
|
1073
1073
|
for (let j = 0; j < tail.length; j++) {
|
|
1074
|
-
i
|
|
1075
|
-
if (len <
|
|
1074
|
+
const index = i + j
|
|
1075
|
+
if (len < index + 1) {
|
|
1076
1076
|
continue
|
|
1077
1077
|
} else {
|
|
1078
|
-
const te = tail[j](input[
|
|
1078
|
+
const te = tail[j](input[index], options)
|
|
1079
1079
|
if (isEither(te)) {
|
|
1080
1080
|
if (Either.isLeft(te)) {
|
|
1081
1081
|
// the input element is present but is not valid
|
|
1082
|
-
const e = new Pointer(
|
|
1082
|
+
const e = new Pointer(index, input, te.left)
|
|
1083
1083
|
if (allErrors) {
|
|
1084
1084
|
es.push([stepKey++, e])
|
|
1085
1085
|
continue
|
|
@@ -1090,7 +1090,6 @@ const go = (ast: AST.AST, isDecoding: boolean): Parser => {
|
|
|
1090
1090
|
output.push([stepKey++, te.right])
|
|
1091
1091
|
} else {
|
|
1092
1092
|
const nk = stepKey++
|
|
1093
|
-
const index = i
|
|
1094
1093
|
if (!queue) {
|
|
1095
1094
|
queue = []
|
|
1096
1095
|
}
|
package/src/Scheduler.ts
CHANGED
|
@@ -21,7 +21,69 @@ export type Task = () => void
|
|
|
21
21
|
*/
|
|
22
22
|
export interface Scheduler {
|
|
23
23
|
shouldYield(fiber: RuntimeFiber<unknown, unknown>): number | false
|
|
24
|
-
scheduleTask(task: Task, priority: number): void
|
|
24
|
+
scheduleTask(task: Task, priority: number, fiber?: RuntimeFiber<unknown, unknown>): void
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @since 3.20.0
|
|
29
|
+
* @category models
|
|
30
|
+
*/
|
|
31
|
+
export class SchedulerRunner {
|
|
32
|
+
running = false
|
|
33
|
+
tasks = new PriorityBuckets()
|
|
34
|
+
|
|
35
|
+
constructor(
|
|
36
|
+
readonly scheduleDrain: (depth: number, drain: (depth: number) => void) => void
|
|
37
|
+
) {}
|
|
38
|
+
|
|
39
|
+
private starveInternal = (depth: number) => {
|
|
40
|
+
const tasks = this.tasks.buckets
|
|
41
|
+
this.tasks.buckets = []
|
|
42
|
+
for (const [_, toRun] of tasks) {
|
|
43
|
+
for (let i = 0; i < toRun.length; i++) {
|
|
44
|
+
toRun[i]()
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (this.tasks.buckets.length === 0) {
|
|
48
|
+
this.running = false
|
|
49
|
+
} else {
|
|
50
|
+
this.starve(depth)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private starve(depth = 0) {
|
|
55
|
+
this.scheduleDrain(depth, this.starveInternal)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
scheduleTask(task: Task, priority: number) {
|
|
59
|
+
this.tasks.scheduleTask(task, priority)
|
|
60
|
+
if (!this.running) {
|
|
61
|
+
this.running = true
|
|
62
|
+
this.starve()
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* @since 3.20.0
|
|
67
|
+
* @category constructors
|
|
68
|
+
*/
|
|
69
|
+
static cached(
|
|
70
|
+
scheduleDrain: (depth: number, drain: (depth: number) => void) => void
|
|
71
|
+
) {
|
|
72
|
+
const fallback = new SchedulerRunner(scheduleDrain)
|
|
73
|
+
const runners = new WeakMap<RuntimeFiber<unknown, unknown>, SchedulerRunner>()
|
|
74
|
+
|
|
75
|
+
return (fiber?: RuntimeFiber<unknown, unknown>) => {
|
|
76
|
+
if (fiber === undefined) {
|
|
77
|
+
return fallback
|
|
78
|
+
}
|
|
79
|
+
let runner = runners.get(fiber)
|
|
80
|
+
if (runner === undefined) {
|
|
81
|
+
runner = new SchedulerRunner(scheduleDrain)
|
|
82
|
+
runners.set(fiber, runner)
|
|
83
|
+
}
|
|
84
|
+
return runner
|
|
85
|
+
}
|
|
86
|
+
}
|
|
25
87
|
}
|
|
26
88
|
|
|
27
89
|
/**
|
|
@@ -62,14 +124,13 @@ export class PriorityBuckets<in out T = Task> {
|
|
|
62
124
|
* @category constructors
|
|
63
125
|
*/
|
|
64
126
|
export class MixedScheduler implements Scheduler {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
tasks = new PriorityBuckets()
|
|
127
|
+
private readonly getRunner = SchedulerRunner.cached((depth, drain) => {
|
|
128
|
+
if (depth >= this.maxNextTickBeforeTimer) {
|
|
129
|
+
setTimeout(() => drain(0), 0)
|
|
130
|
+
} else {
|
|
131
|
+
Promise.resolve(void 0).then(() => drain(depth + 1))
|
|
132
|
+
}
|
|
133
|
+
})
|
|
73
134
|
|
|
74
135
|
constructor(
|
|
75
136
|
/**
|
|
@@ -78,35 +139,6 @@ export class MixedScheduler implements Scheduler {
|
|
|
78
139
|
readonly maxNextTickBeforeTimer: number
|
|
79
140
|
) {}
|
|
80
141
|
|
|
81
|
-
/**
|
|
82
|
-
* @since 2.0.0
|
|
83
|
-
*/
|
|
84
|
-
private starveInternal(depth: number) {
|
|
85
|
-
const tasks = this.tasks.buckets
|
|
86
|
-
this.tasks.buckets = []
|
|
87
|
-
for (const [_, toRun] of tasks) {
|
|
88
|
-
for (let i = 0; i < toRun.length; i++) {
|
|
89
|
-
toRun[i]()
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
if (this.tasks.buckets.length === 0) {
|
|
93
|
-
this.running = false
|
|
94
|
-
} else {
|
|
95
|
-
this.starve(depth)
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* @since 2.0.0
|
|
101
|
-
*/
|
|
102
|
-
private starve(depth = 0) {
|
|
103
|
-
if (depth >= this.maxNextTickBeforeTimer) {
|
|
104
|
-
setTimeout(() => this.starveInternal(0), 0)
|
|
105
|
-
} else {
|
|
106
|
-
Promise.resolve(void 0).then(() => this.starveInternal(depth + 1))
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
142
|
/**
|
|
111
143
|
* @since 2.0.0
|
|
112
144
|
*/
|
|
@@ -119,12 +151,8 @@ export class MixedScheduler implements Scheduler {
|
|
|
119
151
|
/**
|
|
120
152
|
* @since 2.0.0
|
|
121
153
|
*/
|
|
122
|
-
scheduleTask(task: Task, priority: number) {
|
|
123
|
-
this.
|
|
124
|
-
if (!this.running) {
|
|
125
|
-
this.running = true
|
|
126
|
-
this.starve()
|
|
127
|
-
}
|
|
154
|
+
scheduleTask(task: Task, priority: number, fiber?: RuntimeFiber<unknown, unknown>) {
|
|
155
|
+
this.getRunner(fiber).scheduleTask(task, priority)
|
|
128
156
|
}
|
|
129
157
|
}
|
|
130
158
|
|
|
@@ -155,9 +183,9 @@ export class SyncScheduler implements Scheduler {
|
|
|
155
183
|
/**
|
|
156
184
|
* @since 2.0.0
|
|
157
185
|
*/
|
|
158
|
-
scheduleTask(task: Task, priority: number) {
|
|
186
|
+
scheduleTask(task: Task, priority: number, fiber?: RuntimeFiber<unknown, unknown>) {
|
|
159
187
|
if (this.deferred) {
|
|
160
|
-
defaultScheduler.scheduleTask(task, priority)
|
|
188
|
+
defaultScheduler.scheduleTask(task, priority, fiber)
|
|
161
189
|
} else {
|
|
162
190
|
this.tasks.scheduleTask(task, priority)
|
|
163
191
|
}
|
|
@@ -207,9 +235,9 @@ export class ControlledScheduler implements Scheduler {
|
|
|
207
235
|
/**
|
|
208
236
|
* @since 2.0.0
|
|
209
237
|
*/
|
|
210
|
-
scheduleTask(task: Task, priority: number) {
|
|
238
|
+
scheduleTask(task: Task, priority: number, fiber?: RuntimeFiber<unknown, unknown>) {
|
|
211
239
|
if (this.deferred) {
|
|
212
|
-
defaultScheduler.scheduleTask(task, priority)
|
|
240
|
+
defaultScheduler.scheduleTask(task, priority, fiber)
|
|
213
241
|
} else {
|
|
214
242
|
this.tasks.scheduleTask(task, priority)
|
|
215
243
|
}
|
|
@@ -254,16 +282,16 @@ export const makeMatrix = (...record: Array<[number, Scheduler]>): Scheduler =>
|
|
|
254
282
|
}
|
|
255
283
|
return false
|
|
256
284
|
},
|
|
257
|
-
scheduleTask(task, priority) {
|
|
285
|
+
scheduleTask(task, priority, fiber) {
|
|
258
286
|
let scheduler: Scheduler | undefined = undefined
|
|
259
287
|
for (const i of index) {
|
|
260
288
|
if (priority >= i[0]) {
|
|
261
289
|
scheduler = i[1]
|
|
262
290
|
} else {
|
|
263
|
-
return (scheduler ?? defaultScheduler).scheduleTask(task, priority)
|
|
291
|
+
return (scheduler ?? defaultScheduler).scheduleTask(task, priority, fiber)
|
|
264
292
|
}
|
|
265
293
|
}
|
|
266
|
-
return (scheduler ?? defaultScheduler).scheduleTask(task, priority)
|
|
294
|
+
return (scheduler ?? defaultScheduler).scheduleTask(task, priority, fiber)
|
|
267
295
|
}
|
|
268
296
|
}
|
|
269
297
|
}
|
|
@@ -298,31 +326,12 @@ export const makeBatched = (
|
|
|
298
326
|
callback: (runBatch: () => void) => void,
|
|
299
327
|
shouldYield: Scheduler["shouldYield"] = defaultShouldYield
|
|
300
328
|
) => {
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
const tasksToRun = tasks.buckets
|
|
305
|
-
tasks.buckets = []
|
|
306
|
-
for (const [_, toRun] of tasksToRun) {
|
|
307
|
-
for (let i = 0; i < toRun.length; i++) {
|
|
308
|
-
toRun[i]()
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
if (tasks.buckets.length === 0) {
|
|
312
|
-
running = false
|
|
313
|
-
} else {
|
|
314
|
-
starve()
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
const starve = () => callback(starveInternal)
|
|
329
|
+
const getRunner = SchedulerRunner.cached((_, drain) => {
|
|
330
|
+
callback(() => drain(0))
|
|
331
|
+
})
|
|
319
332
|
|
|
320
|
-
return make((task, priority) => {
|
|
321
|
-
|
|
322
|
-
if (!running) {
|
|
323
|
-
running = true
|
|
324
|
-
starve()
|
|
325
|
-
}
|
|
333
|
+
return make((task, priority, fiber) => {
|
|
334
|
+
getRunner(fiber).scheduleTask(task, priority)
|
|
326
335
|
}, shouldYield)
|
|
327
336
|
}
|
|
328
337
|
|
package/src/SchemaAST.ts
CHANGED
|
@@ -2239,6 +2239,8 @@ const getIndexSignatures = (ast: AST): Array<IndexSignature> => {
|
|
|
2239
2239
|
return getIndexSignatures(ast.f())
|
|
2240
2240
|
case "Refinement":
|
|
2241
2241
|
return getIndexSignatures(ast.from)
|
|
2242
|
+
case "Transformation":
|
|
2243
|
+
return getIndexSignatures(ast.to)
|
|
2242
2244
|
}
|
|
2243
2245
|
return []
|
|
2244
2246
|
}
|
|
@@ -2336,6 +2338,8 @@ export const getPropertyKeyIndexedAccess = (ast: AST, name: PropertyKey): Proper
|
|
|
2336
2338
|
return getPropertyKeyIndexedAccess(ast.f(), name)
|
|
2337
2339
|
case "Refinement":
|
|
2338
2340
|
return getPropertyKeyIndexedAccess(ast.from, name)
|
|
2341
|
+
case "Transformation":
|
|
2342
|
+
return getPropertyKeyIndexedAccess(ast.to, name)
|
|
2339
2343
|
}
|
|
2340
2344
|
throw new Error(errors_.getASTUnsupportedSchemaErrorMessage(ast))
|
|
2341
2345
|
}
|
package/src/Types.ts
CHANGED
|
@@ -351,3 +351,11 @@ export type NoExcessProperties<T, U> = T & { readonly [K in Exclude<keyof U, key
|
|
|
351
351
|
* @since 3.15.0
|
|
352
352
|
*/
|
|
353
353
|
export type Ctor<T = {}> = new(...args: Array<any>) => T
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Conditional type that returns `void` if `S` is an empty object type,
|
|
357
|
+
* otherwise returns `S`.
|
|
358
|
+
*
|
|
359
|
+
* @since 3.19.20
|
|
360
|
+
*/
|
|
361
|
+
export type VoidIfEmpty<S> = keyof S extends never ? void : S
|
|
@@ -47,33 +47,41 @@ class Semaphore {
|
|
|
47
47
|
core.asyncInterrupt<number>((resume) => {
|
|
48
48
|
if (this.free < n) {
|
|
49
49
|
const observer = () => {
|
|
50
|
-
if (this.free < n)
|
|
51
|
-
return
|
|
52
|
-
}
|
|
50
|
+
if (this.free < n) return
|
|
53
51
|
this.waiters.delete(observer)
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
resume(core.suspend(() => {
|
|
53
|
+
if (this.free < n) return this.take(n)
|
|
54
|
+
this.taken += n
|
|
55
|
+
return core.succeed(n)
|
|
56
|
+
}))
|
|
56
57
|
}
|
|
57
58
|
this.waiters.add(observer)
|
|
58
59
|
return core.sync(() => {
|
|
59
60
|
this.waiters.delete(observer)
|
|
60
61
|
})
|
|
61
62
|
}
|
|
62
|
-
|
|
63
|
-
|
|
63
|
+
resume(core.suspend(() => {
|
|
64
|
+
if (this.free < n) return this.take(n)
|
|
65
|
+
this.taken += n
|
|
66
|
+
return core.succeed(n)
|
|
67
|
+
}))
|
|
64
68
|
})
|
|
65
69
|
|
|
66
70
|
updateTakenUnsafe(fiber: Fiber.RuntimeFiber<any, any>, f: (n: number) => number): Effect.Effect<number> {
|
|
67
71
|
this.taken = f(this.taken)
|
|
68
72
|
if (this.waiters.size > 0) {
|
|
69
|
-
fiber.getFiberRef(currentScheduler).scheduleTask(
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
item.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
fiber.getFiberRef(currentScheduler).scheduleTask(
|
|
74
|
+
() => {
|
|
75
|
+
const iter = this.waiters.values()
|
|
76
|
+
let item = iter.next()
|
|
77
|
+
while (item.done === false && this.free > 0) {
|
|
78
|
+
item.value()
|
|
79
|
+
item = iter.next()
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
fiber.getFiberRef(core.currentSchedulingPriority),
|
|
83
|
+
fiber
|
|
84
|
+
)
|
|
77
85
|
}
|
|
78
86
|
return core.succeed(this.free)
|
|
79
87
|
}
|
|
@@ -139,7 +147,7 @@ class Latch extends Effectable.Class<void> implements Effect.Latch {
|
|
|
139
147
|
return core.void
|
|
140
148
|
}
|
|
141
149
|
this.scheduled = true
|
|
142
|
-
fiber.currentScheduler.scheduleTask(this.flushWaiters, fiber.getFiberRef(core.currentSchedulingPriority))
|
|
150
|
+
fiber.currentScheduler.scheduleTask(this.flushWaiters, fiber.getFiberRef(core.currentSchedulingPriority), fiber)
|
|
143
151
|
return core.void
|
|
144
152
|
}
|
|
145
153
|
private flushWaiters = () => {
|
|
@@ -451,6 +451,10 @@ export class FiberRuntime<in out A, in out E = never> extends Effectable.Class<A
|
|
|
451
451
|
get await(): Effect.Effect<Exit.Exit<A, E>> {
|
|
452
452
|
return core.async((resume) => {
|
|
453
453
|
const cb = (exit: Exit.Exit<A, E>) => resume(core.succeed(exit))
|
|
454
|
+
if (this._exitValue !== null) {
|
|
455
|
+
cb(this._exitValue!)
|
|
456
|
+
return
|
|
457
|
+
}
|
|
454
458
|
this.tell(
|
|
455
459
|
FiberMessage.stateful((fiber, _) => {
|
|
456
460
|
if (fiber._exitValue !== null) {
|
|
@@ -704,7 +708,8 @@ export class FiberRuntime<in out A, in out E = never> extends Effectable.Class<A
|
|
|
704
708
|
drainQueueLaterOnExecutor() {
|
|
705
709
|
this.currentScheduler.scheduleTask(
|
|
706
710
|
this.run,
|
|
707
|
-
this.getFiberRef(core.currentSchedulingPriority)
|
|
711
|
+
this.getFiberRef(core.currentSchedulingPriority),
|
|
712
|
+
this
|
|
708
713
|
)
|
|
709
714
|
}
|
|
710
715
|
|
|
@@ -2205,9 +2210,13 @@ export const forEachConcurrentDiscard = <A, X, E, R>(
|
|
|
2205
2210
|
const results = new Array()
|
|
2206
2211
|
const interruptAll = () =>
|
|
2207
2212
|
fibers.forEach((fiber) => {
|
|
2208
|
-
fiber.currentScheduler.scheduleTask(
|
|
2209
|
-
|
|
2210
|
-
|
|
2213
|
+
fiber.currentScheduler.scheduleTask(
|
|
2214
|
+
() => {
|
|
2215
|
+
fiber.unsafeInterruptAsFork(parent.id())
|
|
2216
|
+
},
|
|
2217
|
+
0,
|
|
2218
|
+
fiber
|
|
2219
|
+
)
|
|
2211
2220
|
})
|
|
2212
2221
|
const startOrder = new Array<FiberRuntime<Exit.Exit<X, E> | Effect.Blocked<X, E>>>()
|
|
2213
2222
|
const joinOrder = new Array<FiberRuntime<Exit.Exit<X, E> | Effect.Blocked<X, E>>>()
|
|
@@ -2230,12 +2239,16 @@ export const forEachConcurrentDiscard = <A, X, E, R>(
|
|
|
2230
2239
|
parent.currentRuntimeFlags,
|
|
2231
2240
|
fiberScope.globalScope
|
|
2232
2241
|
)
|
|
2233
|
-
parent.currentScheduler.scheduleTask(
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2242
|
+
parent.currentScheduler.scheduleTask(
|
|
2243
|
+
() => {
|
|
2244
|
+
if (interruptImmediately) {
|
|
2245
|
+
fiber.unsafeInterruptAsFork(parent.id())
|
|
2246
|
+
}
|
|
2247
|
+
fiber.resume(runnable)
|
|
2248
|
+
},
|
|
2249
|
+
0,
|
|
2250
|
+
fiber
|
|
2251
|
+
)
|
|
2239
2252
|
return fiber
|
|
2240
2253
|
}
|
|
2241
2254
|
const onInterruptSignal = () => {
|
|
@@ -2291,9 +2304,13 @@ export const forEachConcurrentDiscard = <A, X, E, R>(
|
|
|
2291
2304
|
startOrder.push(fiber)
|
|
2292
2305
|
fibers.add(fiber)
|
|
2293
2306
|
if (interrupted) {
|
|
2294
|
-
fiber.currentScheduler.scheduleTask(
|
|
2295
|
-
|
|
2296
|
-
|
|
2307
|
+
fiber.currentScheduler.scheduleTask(
|
|
2308
|
+
() => {
|
|
2309
|
+
fiber.unsafeInterruptAsFork(parent.id())
|
|
2310
|
+
},
|
|
2311
|
+
0,
|
|
2312
|
+
fiber
|
|
2313
|
+
)
|
|
2297
2314
|
}
|
|
2298
2315
|
fiber.addObserver((wrapped) => {
|
|
2299
2316
|
let exit: Exit.Exit<any, any> | core.Blocked
|
|
@@ -7,6 +7,7 @@ import type * as M from "../ManagedRuntime.js"
|
|
|
7
7
|
import { pipeArguments } from "../Pipeable.js"
|
|
8
8
|
import { hasProperty } from "../Predicate.js"
|
|
9
9
|
import type * as Runtime from "../Runtime.js"
|
|
10
|
+
import * as Scheduler from "../Scheduler.js"
|
|
10
11
|
import * as Scope from "../Scope.js"
|
|
11
12
|
import type { Mutable } from "../Types.js"
|
|
12
13
|
import * as core from "./core.js"
|
|
@@ -57,8 +58,9 @@ export const make = <R, ER>(
|
|
|
57
58
|
memoMap = memoMap ?? internalLayer.unsafeMakeMemoMap()
|
|
58
59
|
const scope = internalRuntime.unsafeRunSyncEffect(fiberRuntime.scopeMake())
|
|
59
60
|
let buildFiber: Fiber.RuntimeFiber<Runtime.Runtime<R>, ER> | undefined
|
|
60
|
-
const runtimeEffect = core.
|
|
61
|
+
const runtimeEffect = core.suspend(() => {
|
|
61
62
|
if (!buildFiber) {
|
|
63
|
+
const scheduler = new Scheduler.SyncScheduler()
|
|
62
64
|
buildFiber = internalRuntime.unsafeForkEffect(
|
|
63
65
|
core.tap(
|
|
64
66
|
Scope.extend(
|
|
@@ -69,8 +71,9 @@ export const make = <R, ER>(
|
|
|
69
71
|
self.cachedRuntime = rt
|
|
70
72
|
}
|
|
71
73
|
),
|
|
72
|
-
{ scope, scheduler
|
|
74
|
+
{ scope, scheduler }
|
|
73
75
|
)
|
|
76
|
+
scheduler.flush()
|
|
74
77
|
}
|
|
75
78
|
return core.flatten(buildFiber.await)
|
|
76
79
|
})
|
package/src/internal/version.ts
CHANGED