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.
Files changed (52) hide show
  1. package/dist/cjs/Data.js.map +1 -1
  2. package/dist/cjs/ParseResult.js +4 -5
  3. package/dist/cjs/ParseResult.js.map +1 -1
  4. package/dist/cjs/Scheduler.js +78 -72
  5. package/dist/cjs/Scheduler.js.map +1 -1
  6. package/dist/cjs/SchemaAST.js +4 -0
  7. package/dist/cjs/SchemaAST.js.map +1 -1
  8. package/dist/cjs/internal/effect/circular.js +13 -9
  9. package/dist/cjs/internal/effect/circular.js.map +1 -1
  10. package/dist/cjs/internal/fiberRuntime.js +8 -4
  11. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  12. package/dist/cjs/internal/managedRuntime.js +5 -2
  13. package/dist/cjs/internal/managedRuntime.js.map +1 -1
  14. package/dist/cjs/internal/version.js +1 -1
  15. package/dist/cjs/internal/version.js.map +1 -1
  16. package/dist/dts/Cron.d.ts +1 -1
  17. package/dist/dts/Data.d.ts +11 -11
  18. package/dist/dts/Data.d.ts.map +1 -1
  19. package/dist/dts/Graph.d.ts +1 -1
  20. package/dist/dts/ParseResult.d.ts +1 -1
  21. package/dist/dts/ParseResult.d.ts.map +1 -1
  22. package/dist/dts/Scheduler.d.ts +22 -19
  23. package/dist/dts/Scheduler.d.ts.map +1 -1
  24. package/dist/dts/SchemaAST.d.ts.map +1 -1
  25. package/dist/dts/Types.d.ts +7 -0
  26. package/dist/dts/Types.d.ts.map +1 -1
  27. package/dist/dts/internal/fiberRuntime.d.ts.map +1 -1
  28. package/dist/esm/Data.js.map +1 -1
  29. package/dist/esm/ParseResult.js +4 -5
  30. package/dist/esm/ParseResult.js.map +1 -1
  31. package/dist/esm/Scheduler.js +76 -71
  32. package/dist/esm/Scheduler.js.map +1 -1
  33. package/dist/esm/SchemaAST.js +4 -0
  34. package/dist/esm/SchemaAST.js.map +1 -1
  35. package/dist/esm/internal/effect/circular.js +13 -9
  36. package/dist/esm/internal/effect/circular.js.map +1 -1
  37. package/dist/esm/internal/fiberRuntime.js +8 -4
  38. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  39. package/dist/esm/internal/managedRuntime.js +5 -2
  40. package/dist/esm/internal/managedRuntime.js.map +1 -1
  41. package/dist/esm/internal/version.js +1 -1
  42. package/dist/esm/internal/version.js.map +1 -1
  43. package/package.json +1 -1
  44. package/src/Data.ts +7 -13
  45. package/src/ParseResult.ts +4 -5
  46. package/src/Scheduler.ts +84 -75
  47. package/src/SchemaAST.ts +4 -0
  48. package/src/Types.ts +8 -0
  49. package/src/internal/effect/circular.ts +24 -16
  50. package/src/internal/fiberRuntime.ts +30 -13
  51. package/src/internal/managedRuntime.ts +5 -2
  52. 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.Equals<Omit<A, Tag>, {}> extends true ? void
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.Equals<A, {}> extends true ? void
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.Equals<A, {}> extends true ? void
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.Equals<A, {}> extends true ? void
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 ? {} extends T ? void : 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.Equals<A, {}> extends true ? void
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.Equals<A, {}> extends true ? void
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<{}> {
@@ -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 += j
1075
- if (len < i + 1) {
1074
+ const index = i + j
1075
+ if (len < index + 1) {
1076
1076
  continue
1077
1077
  } else {
1078
- const te = tail[j](input[i], options)
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(i, input, te.left)
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
- * @since 2.0.0
67
- */
68
- running = false
69
- /**
70
- * @since 2.0.0
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.tasks.scheduleTask(task, priority)
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
- let running = false
302
- const tasks = new PriorityBuckets()
303
- const starveInternal = () => {
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
- tasks.scheduleTask(task, priority)
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
- this.taken += n
55
- resume(core.succeed(n))
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
- this.taken += n
63
- return resume(core.succeed(n))
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
- const iter = this.waiters.values()
71
- let item = iter.next()
72
- while (item.done === false && this.free > 0) {
73
- item.value()
74
- item = iter.next()
75
- }
76
- }, fiber.getFiberRef(core.currentSchedulingPriority))
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
- fiber.unsafeInterruptAsFork(parent.id())
2210
- }, 0)
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
- if (interruptImmediately) {
2235
- fiber.unsafeInterruptAsFork(parent.id())
2236
- }
2237
- fiber.resume(runnable)
2238
- }, 0)
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
- fiber.unsafeInterruptAsFork(parent.id())
2296
- }, 0)
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.withFiberRuntime<Runtime.Runtime<R>, ER>((fiber) => {
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: fiber.currentScheduler }
74
+ { scope, scheduler }
73
75
  )
76
+ scheduler.flush()
74
77
  }
75
78
  return core.flatten(buildFiber.await)
76
79
  })
@@ -1,4 +1,4 @@
1
- let moduleVersion = "3.19.18"
1
+ let moduleVersion = "3.20.0"
2
2
 
3
3
  export const getCurrentVersion = () => moduleVersion
4
4