effect 3.17.13 → 3.18.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 (65) hide show
  1. package/Graph/package.json +6 -0
  2. package/dist/cjs/Context.js +11 -3
  3. package/dist/cjs/Context.js.map +1 -1
  4. package/dist/cjs/Effect.js.map +1 -1
  5. package/dist/cjs/ExecutionPlan.js +4 -4
  6. package/dist/cjs/Graph.js +2964 -0
  7. package/dist/cjs/Graph.js.map +1 -0
  8. package/dist/cjs/Predicate.js +2 -3
  9. package/dist/cjs/Predicate.js.map +1 -1
  10. package/dist/cjs/Tracer.js.map +1 -1
  11. package/dist/cjs/index.js +4 -2
  12. package/dist/cjs/index.js.map +1 -1
  13. package/dist/cjs/internal/core-effect.js +1 -1
  14. package/dist/cjs/internal/core-effect.js.map +1 -1
  15. package/dist/cjs/internal/effect/circular.js +12 -2
  16. package/dist/cjs/internal/effect/circular.js.map +1 -1
  17. package/dist/cjs/internal/metric/hook.js +6 -1
  18. package/dist/cjs/internal/metric/hook.js.map +1 -1
  19. package/dist/cjs/internal/version.js +1 -1
  20. package/dist/cjs/internal/version.js.map +1 -1
  21. package/dist/dts/Context.d.ts +27 -3
  22. package/dist/dts/Context.d.ts.map +1 -1
  23. package/dist/dts/Effect.d.ts +4 -0
  24. package/dist/dts/Effect.d.ts.map +1 -1
  25. package/dist/dts/ExecutionPlan.d.ts +8 -8
  26. package/dist/dts/Graph.d.ts +1652 -0
  27. package/dist/dts/Graph.d.ts.map +1 -0
  28. package/dist/dts/Predicate.d.ts +2 -3
  29. package/dist/dts/Predicate.d.ts.map +1 -1
  30. package/dist/dts/Tracer.d.ts +1 -1
  31. package/dist/dts/Tracer.d.ts.map +1 -1
  32. package/dist/dts/index.d.ts +5 -0
  33. package/dist/dts/index.d.ts.map +1 -1
  34. package/dist/dts/internal/core-effect.d.ts.map +1 -1
  35. package/dist/esm/Context.js +10 -2
  36. package/dist/esm/Context.js.map +1 -1
  37. package/dist/esm/Effect.js.map +1 -1
  38. package/dist/esm/ExecutionPlan.js +4 -4
  39. package/dist/esm/Graph.js +2905 -0
  40. package/dist/esm/Graph.js.map +1 -0
  41. package/dist/esm/Predicate.js +2 -3
  42. package/dist/esm/Predicate.js.map +1 -1
  43. package/dist/esm/Tracer.js.map +1 -1
  44. package/dist/esm/index.js +5 -0
  45. package/dist/esm/index.js.map +1 -1
  46. package/dist/esm/internal/core-effect.js +1 -1
  47. package/dist/esm/internal/core-effect.js.map +1 -1
  48. package/dist/esm/internal/effect/circular.js +12 -2
  49. package/dist/esm/internal/effect/circular.js.map +1 -1
  50. package/dist/esm/internal/metric/hook.js +6 -1
  51. package/dist/esm/internal/metric/hook.js.map +1 -1
  52. package/dist/esm/internal/version.js +1 -1
  53. package/dist/esm/internal/version.js.map +1 -1
  54. package/package.json +9 -1
  55. package/src/Context.ts +28 -3
  56. package/src/Effect.ts +5 -0
  57. package/src/ExecutionPlan.ts +8 -8
  58. package/src/Graph.ts +3564 -0
  59. package/src/Predicate.ts +2 -3
  60. package/src/Tracer.ts +2 -1
  61. package/src/index.ts +6 -0
  62. package/src/internal/core-effect.ts +2 -1
  63. package/src/internal/effect/circular.ts +31 -17
  64. package/src/internal/metric/hook.ts +6 -1
  65. package/src/internal/version.ts +1 -1
package/src/Predicate.ts CHANGED
@@ -488,8 +488,7 @@ export const isMap = (input: unknown): input is Map<unknown, unknown> => input i
488
488
  export const isString = (input: unknown): input is string => typeof input === "string"
489
489
 
490
490
  /**
491
- * A refinement that checks if a value is a `number`. Note that this
492
- * check returns `false` for `NaN`.
491
+ * A refinement that checks if a value is a `number`.
493
492
  *
494
493
  * @example
495
494
  * ```ts
@@ -499,9 +498,9 @@ export const isString = (input: unknown): input is string => typeof input === "s
499
498
  * assert.strictEqual(isNumber(123), true)
500
499
  * assert.strictEqual(isNumber(0), true)
501
500
  * assert.strictEqual(isNumber(-1.5), true)
501
+ * assert.strictEqual(isNumber(NaN), true)
502
502
  *
503
503
  * assert.strictEqual(isNumber("123"), false)
504
- * assert.strictEqual(isNumber(NaN), false) // Special case: NaN is a number type but returns false
505
504
  * ```
506
505
  *
507
506
  * @category guards
package/src/Tracer.ts CHANGED
@@ -31,7 +31,8 @@ export interface Tracer {
31
31
  context: Context.Context<never>,
32
32
  links: ReadonlyArray<SpanLink>,
33
33
  startTime: bigint,
34
- kind: SpanKind
34
+ kind: SpanKind,
35
+ options?: SpanOptions
35
36
  ): Span
36
37
  context<X>(f: () => X, fiber: Fiber.RuntimeFiber<any, any>): X
37
38
  }
package/src/index.ts CHANGED
@@ -350,6 +350,12 @@ export * as Function from "./Function.js"
350
350
  */
351
351
  export * as GlobalValue from "./GlobalValue.js"
352
352
 
353
+ /**
354
+ * @experimental
355
+ * @since 3.18.0
356
+ */
357
+ export * as Graph from "./Graph.js"
358
+
353
359
  /**
354
360
  * @since 2.0.0
355
361
  */
@@ -2126,7 +2126,8 @@ export const unsafeMakeSpan = <XA, XE>(
2126
2126
  options.context ?? Context.empty(),
2127
2127
  links,
2128
2128
  timingEnabled ? clock.unsafeCurrentTimeNanos() : bigint0,
2129
- options.kind ?? "internal"
2129
+ options.kind ?? "internal",
2130
+ options
2130
2131
  )
2131
2132
 
2132
2133
  if (annotationsFromEnv._tag === "Some") {
@@ -37,7 +37,7 @@ class Semaphore {
37
37
  public waiters = new Set<() => void>()
38
38
  public taken = 0
39
39
 
40
- constructor(readonly permits: number) {}
40
+ constructor(public permits: number) {}
41
41
 
42
42
  get free() {
43
43
  return this.permits - this.taken
@@ -63,21 +63,35 @@ class Semaphore {
63
63
  return resume(core.succeed(n))
64
64
  })
65
65
 
66
- readonly updateTaken = (f: (n: number) => number): Effect.Effect<number> =>
67
- core.withFiberRuntime((fiber) => {
68
- this.taken = f(this.taken)
69
- if (this.waiters.size > 0) {
70
- fiber.getFiberRef(currentScheduler).scheduleTask(() => {
71
- const iter = this.waiters.values()
72
- let item = iter.next()
73
- while (item.done === false && this.free > 0) {
74
- item.value()
75
- item = iter.next()
76
- }
77
- }, fiber.getFiberRef(core.currentSchedulingPriority))
78
- }
79
- return core.succeed(this.free)
80
- })
66
+ updateTakenUnsafe(fiber: Fiber.RuntimeFiber<any, any>, f: (n: number) => number): Effect.Effect<number> {
67
+ this.taken = f(this.taken)
68
+ 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))
77
+ }
78
+ return core.succeed(this.free)
79
+ }
80
+
81
+ updateTaken(f: (n: number) => number): Effect.Effect<number> {
82
+ return core.withFiberRuntime((fiber) => this.updateTakenUnsafe(fiber, f))
83
+ }
84
+
85
+ readonly resize = (permits: number) =>
86
+ core.asVoid(
87
+ core.withFiberRuntime((fiber) => {
88
+ this.permits = permits
89
+ if (this.free < 0) {
90
+ return core.void
91
+ }
92
+ return this.updateTakenUnsafe(fiber, (taken) => taken)
93
+ })
94
+ )
81
95
 
82
96
  readonly release = (n: number): Effect.Effect<number> => this.updateTaken((taken) => taken - n)
83
97
 
@@ -104,7 +118,7 @@ class Semaphore {
104
118
  }
105
119
 
106
120
  /** @internal */
107
- export const unsafeMakeSemaphore = (permits: number): Semaphore => new Semaphore(permits)
121
+ export const unsafeMakeSemaphore = (permits: number): Effect.Semaphore => new Semaphore(permits)
108
122
 
109
123
  /** @internal */
110
124
  export const makeSemaphore = (permits: number) => core.sync(() => unsafeMakeSemaphore(permits))
@@ -140,7 +140,12 @@ export const histogram = (key: MetricKey.MetricKey.Histogram): MetricHook.Metric
140
140
  const bounds = key.keyType.boundaries.values
141
141
  const size = bounds.length
142
142
  const values = new Uint32Array(size + 1)
143
- const boundaries = new Float32Array(size)
143
+ // NOTE: while 64-bit floating point precision shoule be enough for any
144
+ // practical histogram boundary values, there is still a small chance that
145
+ // precision will be lost with very large / very small numbers. If we find
146
+ // that is the case, a more complex approach storing the histogram boundary
147
+ // values as a tuple of `[original: string, numeric: number]` may be warranted
148
+ const boundaries = new Float64Array(size)
144
149
  let count = 0
145
150
  let sum = 0
146
151
  let min = Number.MAX_VALUE
@@ -1,4 +1,4 @@
1
- let moduleVersion = "3.17.13"
1
+ let moduleVersion = "3.18.0"
2
2
 
3
3
  export const getCurrentVersion = () => moduleVersion
4
4