effect 3.5.9 → 3.6.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 (101) hide show
  1. package/DateTime/package.json +6 -0
  2. package/dist/cjs/DateTime.js +1514 -0
  3. package/dist/cjs/DateTime.js.map +1 -0
  4. package/dist/cjs/Effect.js.map +1 -1
  5. package/dist/cjs/List.js.map +1 -1
  6. package/dist/cjs/Metric.js.map +1 -1
  7. package/dist/cjs/Predicate.js +8 -0
  8. package/dist/cjs/Predicate.js.map +1 -1
  9. package/dist/cjs/Random.js +16 -1
  10. package/dist/cjs/Random.js.map +1 -1
  11. package/dist/cjs/Stream.js +82 -3
  12. package/dist/cjs/Stream.js.map +1 -1
  13. package/dist/cjs/Struct.js +23 -1
  14. package/dist/cjs/Struct.js.map +1 -1
  15. package/dist/cjs/index.js +4 -2
  16. package/dist/cjs/index.js.map +1 -1
  17. package/dist/cjs/internal/configProvider.js.map +1 -1
  18. package/dist/cjs/internal/core.js +1 -1
  19. package/dist/cjs/internal/core.js.map +1 -1
  20. package/dist/cjs/internal/defaultServices.js +9 -2
  21. package/dist/cjs/internal/defaultServices.js.map +1 -1
  22. package/dist/cjs/internal/metric.js.map +1 -1
  23. package/dist/cjs/internal/stream/emit.js +73 -1
  24. package/dist/cjs/internal/stream/emit.js.map +1 -1
  25. package/dist/cjs/internal/stream.js +30 -22
  26. package/dist/cjs/internal/stream.js.map +1 -1
  27. package/dist/cjs/internal/version.js +1 -1
  28. package/dist/dts/ConfigProvider.d.ts +2 -2
  29. package/dist/dts/ConfigProvider.d.ts.map +1 -1
  30. package/dist/dts/DateTime.d.ts +1265 -0
  31. package/dist/dts/DateTime.d.ts.map +1 -0
  32. package/dist/dts/Effect.d.ts +12 -0
  33. package/dist/dts/Effect.d.ts.map +1 -1
  34. package/dist/dts/List.d.ts +2 -1
  35. package/dist/dts/List.d.ts.map +1 -1
  36. package/dist/dts/Metric.d.ts +1 -1
  37. package/dist/dts/Metric.d.ts.map +1 -1
  38. package/dist/dts/MetricRegistry.d.ts +1 -1
  39. package/dist/dts/MetricRegistry.d.ts.map +1 -1
  40. package/dist/dts/Predicate.d.ts +63 -2
  41. package/dist/dts/Predicate.d.ts.map +1 -1
  42. package/dist/dts/Random.d.ts +18 -0
  43. package/dist/dts/Random.d.ts.map +1 -1
  44. package/dist/dts/Stream.d.ts +91 -0
  45. package/dist/dts/Stream.d.ts.map +1 -1
  46. package/dist/dts/StreamEmit.d.ts +44 -0
  47. package/dist/dts/StreamEmit.d.ts.map +1 -1
  48. package/dist/dts/Struct.d.ts +21 -0
  49. package/dist/dts/Struct.d.ts.map +1 -1
  50. package/dist/dts/index.d.ts +4 -0
  51. package/dist/dts/index.d.ts.map +1 -1
  52. package/dist/dts/internal/core.d.ts.map +1 -1
  53. package/dist/dts/internal/defaultServices.d.ts.map +1 -1
  54. package/dist/dts/internal/stream.d.ts.map +1 -1
  55. package/dist/esm/DateTime.js +1465 -0
  56. package/dist/esm/DateTime.js.map +1 -0
  57. package/dist/esm/Effect.js.map +1 -1
  58. package/dist/esm/List.js.map +1 -1
  59. package/dist/esm/Metric.js.map +1 -1
  60. package/dist/esm/Predicate.js +8 -0
  61. package/dist/esm/Predicate.js.map +1 -1
  62. package/dist/esm/Random.js +15 -0
  63. package/dist/esm/Random.js.map +1 -1
  64. package/dist/esm/Stream.js +79 -0
  65. package/dist/esm/Stream.js.map +1 -1
  66. package/dist/esm/Struct.js +21 -0
  67. package/dist/esm/Struct.js.map +1 -1
  68. package/dist/esm/index.js +4 -0
  69. package/dist/esm/index.js.map +1 -1
  70. package/dist/esm/internal/configProvider.js.map +1 -1
  71. package/dist/esm/internal/core.js +1 -1
  72. package/dist/esm/internal/core.js.map +1 -1
  73. package/dist/esm/internal/defaultServices.js +6 -0
  74. package/dist/esm/internal/defaultServices.js.map +1 -1
  75. package/dist/esm/internal/metric.js.map +1 -1
  76. package/dist/esm/internal/stream/emit.js +71 -0
  77. package/dist/esm/internal/stream/emit.js.map +1 -1
  78. package/dist/esm/internal/stream.js +24 -18
  79. package/dist/esm/internal/stream.js.map +1 -1
  80. package/dist/esm/internal/version.js +1 -1
  81. package/package.json +9 -1
  82. package/src/ConfigProvider.ts +2 -2
  83. package/src/DateTime.ts +2104 -0
  84. package/src/Effect.ts +22 -0
  85. package/src/List.ts +3 -2
  86. package/src/Metric.ts +1 -1
  87. package/src/MetricRegistry.ts +1 -1
  88. package/src/Predicate.ts +68 -8
  89. package/src/Random.ts +24 -0
  90. package/src/Stream.ts +105 -0
  91. package/src/StreamEmit.ts +53 -0
  92. package/src/Struct.ts +22 -0
  93. package/src/index.ts +5 -0
  94. package/src/internal/configProvider.ts +20 -20
  95. package/src/internal/core.ts +37 -12
  96. package/src/internal/defaultServices.ts +14 -0
  97. package/src/internal/metric/registry.ts +1 -1
  98. package/src/internal/metric.ts +2 -2
  99. package/src/internal/stream/emit.ts +77 -0
  100. package/src/internal/stream.ts +86 -18
  101. package/src/internal/version.ts +1 -1
@@ -1250,6 +1250,12 @@ export const tap = dual<
1250
1250
  ) => [X] extends [Effect.Effect<infer _A1, infer E1, infer R1>] ? Effect.Effect<A, E | E1, R | R1>
1251
1251
  : [X] extends [PromiseLike<infer _A1>] ? Effect.Effect<A, E | Cause.UnknownException, R>
1252
1252
  : Effect.Effect<A, E, R>
1253
+ <A, X, E1, R1>(
1254
+ f: (a: NoInfer<A>) => Effect.Effect<X, E1, R1>,
1255
+ options: { onlyEffect: true }
1256
+ ): <E, R>(
1257
+ self: Effect.Effect<A, E, R>
1258
+ ) => Effect.Effect<A, E | E1, R | R1>
1253
1259
  <X>(
1254
1260
  f: NotFunction<X>
1255
1261
  ): <A, E, R>(
@@ -1257,6 +1263,12 @@ export const tap = dual<
1257
1263
  ) => [X] extends [Effect.Effect<infer _A1, infer E1, infer R1>] ? Effect.Effect<A, E | E1, R | R1>
1258
1264
  : [X] extends [PromiseLike<infer _A1>] ? Effect.Effect<A, E | Cause.UnknownException, R>
1259
1265
  : Effect.Effect<A, E, R>
1266
+ <X, E1, R1>(
1267
+ f: Effect.Effect<X, E1, R1>,
1268
+ options: { onlyEffect: true }
1269
+ ): <A, E, R>(
1270
+ self: Effect.Effect<A, E, R>
1271
+ ) => Effect.Effect<A, E | E1, R | R1>
1260
1272
  },
1261
1273
  {
1262
1274
  <A, E, R, X>(
@@ -1265,25 +1277,38 @@ export const tap = dual<
1265
1277
  ): [X] extends [Effect.Effect<infer _A1, infer E1, infer R1>] ? Effect.Effect<A, E | E1, R | R1>
1266
1278
  : [X] extends [PromiseLike<infer _A1>] ? Effect.Effect<A, E | Cause.UnknownException, R>
1267
1279
  : Effect.Effect<A, E, R>
1280
+ <A, E, R, X, E1, R1>(
1281
+ self: Effect.Effect<A, E, R>,
1282
+ f: (a: NoInfer<A>) => Effect.Effect<X, E1, R1>,
1283
+ options: { onlyEffect: true }
1284
+ ): Effect.Effect<A, E | E1, R | R1>
1268
1285
  <A, E, R, X>(
1269
1286
  self: Effect.Effect<A, E, R>,
1270
1287
  f: NotFunction<X>
1271
1288
  ): [X] extends [Effect.Effect<infer _A1, infer E1, infer R1>] ? Effect.Effect<A, E | E1, R | R1>
1272
1289
  : [X] extends [PromiseLike<infer _A1>] ? Effect.Effect<A, E | Cause.UnknownException, R>
1273
1290
  : Effect.Effect<A, E, R>
1291
+ <A, E, R, X, E1, R1>(
1292
+ self: Effect.Effect<A, E, R>,
1293
+ f: Effect.Effect<X, E1, R1>,
1294
+ options: { onlyEffect: true }
1295
+ ): Effect.Effect<A, E | E1, R | R1>
1274
1296
  }
1275
- >(2, (self, f) =>
1276
- flatMap(self, (a) => {
1277
- const b = typeof f === "function" ? (f as any)(a) : f
1278
- if (isEffect(b)) {
1279
- return as(b, a)
1280
- } else if (isPromiseLike(b)) {
1281
- return async<any, Cause.UnknownException>((resume) => {
1282
- b.then((_) => resume(succeed(a)), (e) => resume(fail(new UnknownException(e))))
1283
- })
1284
- }
1285
- return succeed(a)
1286
- }))
1297
+ >(
1298
+ (args) => args.length === 3 || args.length === 2 && !(isObject(args[1]) && "onlyEffect" in args[1]),
1299
+ <A, E, R, X>(self: Effect.Effect<A, E, R>, f: X) =>
1300
+ flatMap(self, (a) => {
1301
+ const b = typeof f === "function" ? (f as any)(a) : f
1302
+ if (isEffect(b)) {
1303
+ return as(b, a)
1304
+ } else if (isPromiseLike(b)) {
1305
+ return async<any, Cause.UnknownException>((resume) => {
1306
+ b.then((_) => resume(succeed(a)), (e) => resume(fail(new UnknownException(e))))
1307
+ })
1308
+ }
1309
+ return succeed(a)
1310
+ })
1311
+ )
1287
1312
 
1288
1313
  /* @internal */
1289
1314
  export const transplant = <A, E, R>(
@@ -1,3 +1,4 @@
1
+ import * as Array from "../Array.js"
1
2
  import type * as Chunk from "../Chunk.js"
2
3
  import type * as Clock from "../Clock.js"
3
4
  import type * as Config from "../Config.js"
@@ -133,6 +134,19 @@ export const nextIntBetween = (min: number, max: number): Effect.Effect<number>
133
134
  export const shuffle = <A>(elements: Iterable<A>): Effect.Effect<Chunk.Chunk<A>> =>
134
135
  randomWith((random) => random.shuffle(elements))
135
136
 
137
+ /** @internal */
138
+ export const choice = <Self extends Iterable<unknown>>(
139
+ elements: Self
140
+ ) => {
141
+ const array = Array.fromIterable(elements)
142
+ return core.map(
143
+ array.length === 0
144
+ ? core.fail(new core.NoSuchElementException("Cannot select a random element from an empty array"))
145
+ : randomWith((random) => random.nextIntBetween(0, array.length)),
146
+ (i) => array[i]
147
+ ) as any
148
+ }
149
+
136
150
  // circular with Tracer
137
151
 
138
152
  /** @internal */
@@ -27,7 +27,7 @@ class MetricRegistryImpl implements MetricRegistry.MetricRegistry {
27
27
  MetricHook.MetricHook.Root
28
28
  >()
29
29
 
30
- snapshot(): ReadonlyArray<MetricPair.MetricPair.Untyped> {
30
+ snapshot(): Array<MetricPair.MetricPair.Untyped> {
31
31
  const result: Array<MetricPair.MetricPair.Untyped> = []
32
32
  for (const [key, hook] of this.map) {
33
33
  result.push(metricPair.unsafeMake(key, hook.get()))
@@ -525,9 +525,9 @@ export const zip = dual<
525
525
  )
526
526
 
527
527
  /** @internal */
528
- export const unsafeSnapshot = (): ReadonlyArray<MetricPair.MetricPair.Untyped> => globalMetricRegistry.snapshot()
528
+ export const unsafeSnapshot = (): Array<MetricPair.MetricPair.Untyped> => globalMetricRegistry.snapshot()
529
529
 
530
530
  /** @internal */
531
- export const snapshot: Effect.Effect<ReadonlyArray<MetricPair.MetricPair.Untyped>> = core.sync(
531
+ export const snapshot: Effect.Effect<Array<MetricPair.MetricPair.Untyped>> = core.sync(
532
532
  unsafeSnapshot
533
533
  )
@@ -4,6 +4,8 @@ import * as Effect from "../../Effect.js"
4
4
  import * as Exit from "../../Exit.js"
5
5
  import { pipe } from "../../Function.js"
6
6
  import * as Option from "../../Option.js"
7
+ import type * as Queue from "../../Queue.js"
8
+ import type * as Scheduler from "../../Scheduler.js"
7
9
  import type * as Emit from "../../StreamEmit.js"
8
10
 
9
11
  /** @internal */
@@ -44,3 +46,78 @@ export const make = <R, E, A, B>(
44
46
  }
45
47
  return Object.assign(emit, ops)
46
48
  }
49
+
50
+ /** @internal */
51
+ export const makePush = <E, A>(
52
+ queue: Queue.Queue<Array<A> | Exit.Exit<void, E>>,
53
+ scheduler: Scheduler.Scheduler
54
+ ): Emit.EmitOpsPush<E, A> => {
55
+ let finished = false
56
+ let buffer: Array<A> = []
57
+ let running = false
58
+ function array(items: ReadonlyArray<A>) {
59
+ if (finished) return false
60
+ if (items.length <= 50_000) {
61
+ buffer.push.apply(buffer, items as Array<A>)
62
+ } else {
63
+ for (let i = 0; i < items.length; i++) {
64
+ buffer.push(items[0])
65
+ }
66
+ }
67
+ if (!running) {
68
+ running = true
69
+ scheduler.scheduleTask(flush, 0)
70
+ }
71
+ return true
72
+ }
73
+ function flush() {
74
+ running = false
75
+ if (buffer.length > 0) {
76
+ queue.unsafeOffer(buffer)
77
+ buffer = []
78
+ }
79
+ }
80
+ function done(exit: Exit.Exit<A, E>) {
81
+ if (finished) return
82
+ finished = true
83
+ if (exit._tag === "Success") {
84
+ buffer.push(exit.value)
85
+ }
86
+ flush()
87
+ queue.unsafeOffer(exit._tag === "Success" ? Exit.void : exit)
88
+ }
89
+ return {
90
+ single(value: A) {
91
+ if (finished) return false
92
+ buffer.push(value)
93
+ if (!running) {
94
+ running = true
95
+ scheduler.scheduleTask(flush, 0)
96
+ }
97
+ return true
98
+ },
99
+ array,
100
+ chunk(chunk) {
101
+ return array(Chunk.toReadonlyArray(chunk))
102
+ },
103
+ done,
104
+ end() {
105
+ if (finished) return
106
+ finished = true
107
+ flush()
108
+ queue.unsafeOffer(Exit.void)
109
+ },
110
+ halt(cause: Cause.Cause<E>) {
111
+ return done(Exit.failCause(cause))
112
+ },
113
+ fail(error: E) {
114
+ return done(Exit.fail(error))
115
+ },
116
+ die<Err>(defect: Err): void {
117
+ return done(Exit.die(defect))
118
+ },
119
+ dieMessage(message: string): void {
120
+ return done(Exit.die(new Error(message)))
121
+ }
122
+ }
123
+ }
@@ -10,6 +10,7 @@ import * as Either from "../Either.js"
10
10
  import * as Equal from "../Equal.js"
11
11
  import * as Exit from "../Exit.js"
12
12
  import * as Fiber from "../Fiber.js"
13
+ import * as FiberRef from "../FiberRef.js"
13
14
  import type { LazyArg } from "../Function.js"
14
15
  import { constTrue, dual, identity, pipe } from "../Function.js"
15
16
  import * as Layer from "../Layer.js"
@@ -597,6 +598,51 @@ export const asyncEffect = <A, E = never, R = never>(
597
598
  fromChannel
598
599
  )
599
600
 
601
+ const queueFromBufferOptionsPush = <A, E>(
602
+ options?: { readonly bufferSize: "unbounded" } | {
603
+ readonly bufferSize?: number | undefined
604
+ readonly strategy?: "dropping" | "sliding" | undefined
605
+ } | undefined
606
+ ): Effect.Effect<Queue.Queue<Array<A> | Exit.Exit<void, E>>> => {
607
+ if (options?.bufferSize === "unbounded" || (options?.bufferSize === undefined && options?.strategy === undefined)) {
608
+ return Queue.unbounded()
609
+ }
610
+ switch (options?.strategy) {
611
+ case "sliding":
612
+ return Queue.sliding(options.bufferSize ?? 16)
613
+ default:
614
+ return Queue.dropping(options?.bufferSize ?? 16)
615
+ }
616
+ }
617
+
618
+ /** @internal */
619
+ export const asyncPush = <A, E = never, R = never>(
620
+ register: (emit: Emit.EmitOpsPush<E, A>) => Effect.Effect<unknown, never, R | Scope.Scope>,
621
+ options?: {
622
+ readonly bufferSize: "unbounded"
623
+ } | {
624
+ readonly bufferSize?: number | undefined
625
+ readonly strategy?: "dropping" | "sliding" | undefined
626
+ } | undefined
627
+ ): Stream.Stream<A, E, Exclude<R, Scope.Scope>> =>
628
+ Effect.acquireRelease(
629
+ queueFromBufferOptionsPush<A, E>(options),
630
+ Queue.shutdown
631
+ ).pipe(
632
+ Effect.tap((queue) =>
633
+ FiberRef.getWith(FiberRef.currentScheduler, (scheduler) => register(emit.makePush(queue, scheduler)))
634
+ ),
635
+ Effect.map((queue) => {
636
+ const loop: Channel.Channel<Chunk.Chunk<A>, unknown, E> = core.flatMap(Queue.take(queue), (item) =>
637
+ Exit.isExit(item)
638
+ ? Exit.isSuccess(item) ? core.void : core.failCause(item.cause)
639
+ : channel.zipRight(core.write(Chunk.unsafeFromArray(item)), loop))
640
+ return loop
641
+ }),
642
+ channel.unwrapScoped,
643
+ fromChannel
644
+ )
645
+
600
646
  /** @internal */
601
647
  export const asyncScoped = <A, E = never, R = never>(
602
648
  register: (emit: Emit.Emit<R, E, A, void>) => Effect.Effect<unknown, E, R | Scope.Scope>,
@@ -4116,6 +4162,23 @@ export const mkString = <E, R>(self: Stream.Stream<string, E, R>): Effect.Effect
4116
4162
  /** @internal */
4117
4163
  export const never: Stream.Stream<never> = fromEffect(Effect.never)
4118
4164
 
4165
+ /** @internal */
4166
+ export const onEnd: {
4167
+ <_, E2, R2>(
4168
+ effect: Effect.Effect<_, E2, R2>
4169
+ ): <A, E, R>(self: Stream.Stream<A, E, R>) => Stream.Stream<A, E2 | E, R2 | R>
4170
+ <A, E, R, _, E2, R2>(
4171
+ self: Stream.Stream<A, E, R>,
4172
+ effect: Effect.Effect<_, E2, R2>
4173
+ ): Stream.Stream<A, E | E2, R | R2>
4174
+ } = dual(
4175
+ 2,
4176
+ <A, E, R, _, E2, R2>(
4177
+ self: Stream.Stream<A, E, R>,
4178
+ effect: Effect.Effect<_, E2, R2>
4179
+ ): Stream.Stream<A, E | E2, R | R2> => concat(self, drain(fromEffect(effect)))
4180
+ )
4181
+
4119
4182
  /** @internal */
4120
4183
  export const onError = dual<
4121
4184
  <E, X, R2>(
@@ -4154,6 +4217,23 @@ export const onDone = dual<
4154
4217
  )
4155
4218
  )
4156
4219
 
4220
+ /** @internal */
4221
+ export const onStart: {
4222
+ <_, E2, R2>(
4223
+ effect: Effect.Effect<_, E2, R2>
4224
+ ): <A, E, R>(self: Stream.Stream<A, E, R>) => Stream.Stream<A, E2 | E, R2 | R>
4225
+ <A, E, R, _, E2, R2>(
4226
+ self: Stream.Stream<A, E, R>,
4227
+ effect: Effect.Effect<_, E2, R2>
4228
+ ): Stream.Stream<A, E | E2, R | R2>
4229
+ } = dual(
4230
+ 2,
4231
+ <A, E, R, _, E2, R2>(
4232
+ self: Stream.Stream<A, E, R>,
4233
+ effect: Effect.Effect<_, E2, R2>
4234
+ ): Stream.Stream<A, E | E2, R | R2> => unwrap(Effect.as(effect, self))
4235
+ )
4236
+
4157
4237
  /** @internal */
4158
4238
  export const orDie = <A, E, R>(self: Stream.Stream<A, E, R>): Stream.Stream<A, never, R> =>
4159
4239
  pipe(self, orDieWith(identity))
@@ -8324,23 +8404,11 @@ export const fromEventListener = <A = unknown>(
8324
8404
  readonly capture?: boolean
8325
8405
  readonly passive?: boolean
8326
8406
  readonly once?: boolean
8407
+ readonly bufferSize?: number | "unbounded" | undefined
8327
8408
  } | undefined
8328
8409
  ): Stream.Stream<A> =>
8329
- _async<A>((emit) => {
8330
- let batch: Array<A> = []
8331
- let taskRunning = false
8332
- function cb(e: A) {
8333
- batch.push(e)
8334
- if (!taskRunning) {
8335
- taskRunning = true
8336
- queueMicrotask(() => {
8337
- const events = batch
8338
- batch = []
8339
- taskRunning = false
8340
- emit.chunk(Chunk.unsafeFromArray(events))
8341
- })
8342
- }
8343
- }
8344
- target.addEventListener(type, cb as any, options)
8345
- return Effect.sync(() => target.removeEventListener(type, cb, options))
8346
- }, "unbounded")
8410
+ asyncPush<A>((emit) =>
8411
+ Effect.acquireRelease(
8412
+ Effect.sync(() => target.addEventListener(type, emit.single as any, options)),
8413
+ () => Effect.sync(() => target.removeEventListener(type, emit.single, options))
8414
+ ), { bufferSize: typeof options === "object" ? options.bufferSize : undefined })
@@ -1,4 +1,4 @@
1
- let moduleVersion = "3.5.9"
1
+ let moduleVersion = "3.6.0"
2
2
 
3
3
  export const getCurrentVersion = () => moduleVersion
4
4