effect 3.3.5 → 3.4.1

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 (98) hide show
  1. package/Micro/package.json +6 -0
  2. package/dist/cjs/Array.js +18 -3
  3. package/dist/cjs/Array.js.map +1 -1
  4. package/dist/cjs/Chunk.js +13 -2
  5. package/dist/cjs/Chunk.js.map +1 -1
  6. package/dist/cjs/Effect.js +236 -15
  7. package/dist/cjs/Effect.js.map +1 -1
  8. package/dist/cjs/Either.js +31 -1
  9. package/dist/cjs/Either.js.map +1 -1
  10. package/dist/cjs/ManagedRuntime.js.map +1 -1
  11. package/dist/cjs/Micro.js +2383 -0
  12. package/dist/cjs/Micro.js.map +1 -0
  13. package/dist/cjs/Option.js +1 -2
  14. package/dist/cjs/Option.js.map +1 -1
  15. package/dist/cjs/Schedule.js +2 -2
  16. package/dist/cjs/Stream.js.map +1 -1
  17. package/dist/cjs/Tuple.js +16 -9
  18. package/dist/cjs/Tuple.js.map +1 -1
  19. package/dist/cjs/index.js +4 -2
  20. package/dist/cjs/index.js.map +1 -1
  21. package/dist/cjs/internal/core-effect.js +4 -2
  22. package/dist/cjs/internal/core-effect.js.map +1 -1
  23. package/dist/cjs/internal/core.js +12 -2
  24. package/dist/cjs/internal/core.js.map +1 -1
  25. package/dist/cjs/internal/fiberRuntime.js +32 -0
  26. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  27. package/dist/cjs/internal/stream.js.map +1 -1
  28. package/dist/cjs/internal/version.js +1 -1
  29. package/dist/dts/Array.d.ts +14 -0
  30. package/dist/dts/Array.d.ts.map +1 -1
  31. package/dist/dts/Cause.d.ts +1 -1
  32. package/dist/dts/Chunk.d.ts +11 -0
  33. package/dist/dts/Chunk.d.ts.map +1 -1
  34. package/dist/dts/Effect.d.ts +235 -12
  35. package/dist/dts/Effect.d.ts.map +1 -1
  36. package/dist/dts/Either.d.ts +35 -0
  37. package/dist/dts/Either.d.ts.map +1 -1
  38. package/dist/dts/ManagedRuntime.d.ts +15 -0
  39. package/dist/dts/ManagedRuntime.d.ts.map +1 -1
  40. package/dist/dts/Micro.d.ts +2010 -0
  41. package/dist/dts/Micro.d.ts.map +1 -0
  42. package/dist/dts/Option.d.ts +2 -0
  43. package/dist/dts/Option.d.ts.map +1 -1
  44. package/dist/dts/Schedule.d.ts +2 -2
  45. package/dist/dts/Stream.d.ts +45 -6
  46. package/dist/dts/Stream.d.ts.map +1 -1
  47. package/dist/dts/Tuple.d.ts +18 -0
  48. package/dist/dts/Tuple.d.ts.map +1 -1
  49. package/dist/dts/index.d.ts +7 -0
  50. package/dist/dts/index.d.ts.map +1 -1
  51. package/dist/dts/internal/core-effect.d.ts.map +1 -1
  52. package/dist/dts/internal/core.d.ts.map +1 -1
  53. package/dist/dts/internal/fiberRuntime.d.ts.map +1 -1
  54. package/dist/esm/Array.js +14 -0
  55. package/dist/esm/Array.js.map +1 -1
  56. package/dist/esm/Chunk.js +11 -0
  57. package/dist/esm/Chunk.js.map +1 -1
  58. package/dist/esm/Effect.js +233 -12
  59. package/dist/esm/Effect.js.map +1 -1
  60. package/dist/esm/Either.js +30 -0
  61. package/dist/esm/Either.js.map +1 -1
  62. package/dist/esm/ManagedRuntime.js.map +1 -1
  63. package/dist/esm/Micro.js +2307 -0
  64. package/dist/esm/Micro.js.map +1 -0
  65. package/dist/esm/Option.js +1 -1
  66. package/dist/esm/Option.js.map +1 -1
  67. package/dist/esm/Schedule.js +2 -2
  68. package/dist/esm/Stream.js.map +1 -1
  69. package/dist/esm/Tuple.js +15 -8
  70. package/dist/esm/Tuple.js.map +1 -1
  71. package/dist/esm/index.js +7 -0
  72. package/dist/esm/index.js.map +1 -1
  73. package/dist/esm/internal/core-effect.js +2 -0
  74. package/dist/esm/internal/core-effect.js.map +1 -1
  75. package/dist/esm/internal/core.js +10 -1
  76. package/dist/esm/internal/core.js.map +1 -1
  77. package/dist/esm/internal/fiberRuntime.js +32 -0
  78. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  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/Array.ts +15 -0
  83. package/src/Cause.ts +1 -1
  84. package/src/Chunk.ts +12 -0
  85. package/src/Effect.ts +243 -12
  86. package/src/Either.ts +51 -0
  87. package/src/ManagedRuntime.ts +16 -0
  88. package/src/Micro.ts +3835 -0
  89. package/src/Option.ts +12 -1
  90. package/src/Schedule.ts +2 -2
  91. package/src/Stream.ts +60 -8
  92. package/src/Tuple.ts +18 -8
  93. package/src/index.ts +8 -0
  94. package/src/internal/core-effect.ts +33 -0
  95. package/src/internal/core.ts +18 -1
  96. package/src/internal/fiberRuntime.ts +32 -0
  97. package/src/internal/stream.ts +8 -4
  98. package/src/internal/version.ts +1 -1
package/src/Option.ts CHANGED
@@ -1115,7 +1115,18 @@ export const lift2 = <A, B, C>(f: (a: A, b: B) => C): {
1115
1115
  export const liftPredicate: { // Note: I intentionally avoid using the NoInfer pattern here.
1116
1116
  <A, B extends A>(refinement: Refinement<A, B>): (a: A) => Option<B>
1117
1117
  <B extends A, A = B>(predicate: Predicate<A>): (b: B) => Option<B>
1118
- } = <B extends A, A = B>(predicate: Predicate<A>) => (b: B): Option<B> => predicate(b) ? some(b) : none()
1118
+ <A, B extends A>(
1119
+ self: A,
1120
+ refinement: Refinement<A, B>
1121
+ ): Option<B>
1122
+ <B extends A, A = B>(
1123
+ self: B,
1124
+ predicate: Predicate<A>
1125
+ ): Option<B>
1126
+ } = dual(
1127
+ 2,
1128
+ <B extends A, A = B>(b: B, predicate: Predicate<A>): Option<B> => predicate(b) ? some(b) : none()
1129
+ )
1119
1130
 
1120
1131
  /**
1121
1132
  * Returns a function that checks if a `Option` contains a given value using a provided `isEquivalent` function.
package/src/Schedule.ts CHANGED
@@ -1262,7 +1262,7 @@ export const upTo: {
1262
1262
  } = internal.upTo
1263
1263
 
1264
1264
  /**
1265
- * Returns a new schedule that continues for as long the specified predicate
1265
+ * Returns a new schedule that continues for as long as the specified predicate
1266
1266
  * on the input evaluates to true.
1267
1267
  *
1268
1268
  * @since 2.0.0
@@ -1274,7 +1274,7 @@ export const whileInput: {
1274
1274
  } = internal.whileInput
1275
1275
 
1276
1276
  /**
1277
- * Returns a new schedule that continues for as long the specified effectful
1277
+ * Returns a new schedule that continues for as long as the specified effectful
1278
1278
  * predicate on the input evaluates to true.
1279
1279
  *
1280
1280
  * @since 2.0.0
package/src/Stream.ts CHANGED
@@ -112,13 +112,37 @@ export declare namespace Stream {
112
112
  * @category models
113
113
  */
114
114
  export interface Variance<out A, out E, out R> {
115
- readonly [StreamTypeId]: {
116
- _A: Covariant<A>
117
- _E: Covariant<E>
118
- _R: Covariant<R>
119
- }
115
+ readonly [StreamTypeId]: VarianceStruct<A, E, R>
116
+ }
117
+
118
+ /**
119
+ * @since 3.4.0
120
+ * @category models
121
+ */
122
+ export interface VarianceStruct<out A, out E, out R> {
123
+ readonly _A: Covariant<A>
124
+ readonly _E: Covariant<E>
125
+ readonly _R: Covariant<R>
120
126
  }
121
127
 
128
+ /**
129
+ * @since 3.4.0
130
+ * @category type-level
131
+ */
132
+ export type Success<T extends Stream<any, any, any>> = [T] extends [Stream<infer _A, infer _E, infer _R>] ? _A : never
133
+
134
+ /**
135
+ * @since 3.4.0
136
+ * @category type-level
137
+ */
138
+ export type Error<T extends Stream<any, any, any>> = [T] extends [Stream<infer _A, infer _E, infer _R>] ? _E : never
139
+
140
+ /**
141
+ * @since 3.4.0
142
+ * @category type-level
143
+ */
144
+ export type Context<T extends Stream<any, any, any>> = [T] extends [Stream<infer _A, infer _E, infer _R>] ? _R : never
145
+
122
146
  /**
123
147
  * @since 2.0.0
124
148
  * @category models
@@ -4735,12 +4759,40 @@ export const decodeText: {
4735
4759
  */
4736
4760
  export const encodeText: <E, R>(self: Stream<string, E, R>) => Stream<Uint8Array, E, R> = internal.encodeText
4737
4761
 
4762
+ /**
4763
+ * @since 3.4.0
4764
+ * @category models
4765
+ */
4766
+ export interface EventListener<A> {
4767
+ addEventListener(
4768
+ event: string,
4769
+ f: (event: A) => void,
4770
+ options?: {
4771
+ readonly capture?: boolean
4772
+ readonly passive?: boolean
4773
+ readonly once?: boolean
4774
+ readonly signal?: AbortSignal
4775
+ } | boolean
4776
+ ): void
4777
+ removeEventListener(
4778
+ event: string,
4779
+ f: (event: A) => void,
4780
+ options?: {
4781
+ readonly capture?: boolean
4782
+ } | boolean
4783
+ ): void
4784
+ }
4785
+
4738
4786
  /**
4739
4787
  * Creates a `Stream` using addEventListener.
4740
4788
  * @since 3.1.0
4741
4789
  */
4742
- export const fromEventListener: <A = Event>(
4743
- target: EventTarget,
4790
+ export const fromEventListener: <A = unknown>(
4791
+ target: EventListener<A>,
4744
4792
  type: string,
4745
- options?: boolean | Omit<AddEventListenerOptions, "signal">
4793
+ options?: boolean | {
4794
+ readonly capture?: boolean
4795
+ readonly passive?: boolean
4796
+ readonly once?: boolean
4797
+ } | undefined
4746
4798
  ) => Stream<A> = internal.fromEventListener
package/src/Tuple.ts CHANGED
@@ -194,14 +194,24 @@ export const appendElement: {
194
194
  <A extends ReadonlyArray<unknown>, B>(self: A, that: B): [...A, B]
195
195
  } = dual(2, <A extends ReadonlyArray<unknown>, B>(self: A, that: B): [...A, B] => [...self, that])
196
196
 
197
- /*
198
-
199
- TODO:
200
-
201
- - at
202
- - swap
203
-
204
- */
197
+ /**
198
+ * Retrieves the element at a specified index from a tuple.
199
+ *
200
+ * @param self - A tuple from which to retrieve the element.
201
+ * @param index - The index of the element to retrieve.
202
+ *
203
+ * @example
204
+ * import { Tuple } from "effect"
205
+ *
206
+ * assert.deepStrictEqual(Tuple.at([1, 'hello', true], 1), 'hello')
207
+ *
208
+ * @category getters
209
+ * @since 3.4.0
210
+ */
211
+ export const at: {
212
+ <N extends number>(index: N): <A extends ReadonlyArray<unknown>>(self: A) => A[N]
213
+ <A extends ReadonlyArray<unknown>, N extends number>(self: A, index: N): A[N]
214
+ } = dual(2, <A extends ReadonlyArray<unknown>, N extends number>(self: A, index: N): A[N] => self[index])
205
215
 
206
216
  export {
207
217
  /**
package/src/index.ts CHANGED
@@ -479,6 +479,14 @@ export * as MetricRegistry from "./MetricRegistry.js"
479
479
  */
480
480
  export * as MetricState from "./MetricState.js"
481
481
 
482
+ /**
483
+ * A lightweight alternative to the `Effect` data type, with a subset of the functionality.
484
+ *
485
+ * @since 3.4.0
486
+ * @experimental
487
+ */
488
+ export * as Micro from "./Micro.js"
489
+
482
490
  /**
483
491
  * @since 2.0.0
484
492
  *
@@ -582,6 +582,39 @@ export const filterOrElse: {
582
582
  (a) => predicate(a) ? core.succeed<A | B>(a) : orElse(a)
583
583
  ))
584
584
 
585
+ /** @internal */
586
+ export const liftPredicate = dual<
587
+ {
588
+ <A, B extends A, E>(
589
+ refinement: Predicate.Refinement<NoInfer<A>, B>,
590
+ orFailWith: (a: NoInfer<A>) => E
591
+ ): (a: A) => Effect.Effect<B, E>
592
+ <A, E>(
593
+ predicate: Predicate.Predicate<NoInfer<A>>,
594
+ orFailWith: (a: NoInfer<A>) => E
595
+ ): (a: A) => Effect.Effect<A, E>
596
+ },
597
+ {
598
+ <A, E, B extends A>(
599
+ self: A,
600
+ refinement: Predicate.Refinement<A, B>,
601
+ orFailWith: (a: A) => E
602
+ ): Effect.Effect<B, E>
603
+ <A, E>(
604
+ self: A,
605
+ predicate: Predicate.Predicate<NoInfer<A>>,
606
+ orFailWith: (a: NoInfer<A>) => E
607
+ ): Effect.Effect<A, E>
608
+ }
609
+ >(
610
+ 3,
611
+ <A, E>(
612
+ self: A,
613
+ predicate: Predicate.Predicate<NoInfer<A>>,
614
+ orFailWith: (a: NoInfer<A>) => E
615
+ ): Effect.Effect<A, E> => core.suspend(() => predicate(self) ? core.succeed(self) : core.fail(orFailWith(self)))
616
+ )
617
+
585
618
  /* @internal */
586
619
  export const filterOrFail: {
587
620
  <A, B extends A, E2>(
@@ -149,7 +149,6 @@ export class RevertFlags {
149
149
  }
150
150
  }
151
151
 
152
- /** @internal */
153
152
  class EffectPrimitive {
154
153
  public effect_instruction_i0 = undefined
155
154
  public effect_instruction_i1 = undefined
@@ -504,6 +503,24 @@ export const custom: {
504
503
  return wrapper
505
504
  }
506
505
 
506
+ /* @internal */
507
+ export const unsafeAsync = <A, E = never, R = never>(
508
+ register: (
509
+ callback: (_: Effect.Effect<A, E, R>) => void
510
+ ) => void | Effect.Effect<void, never, R>,
511
+ blockingOn: FiberId.FiberId = FiberId.none
512
+ ): Effect.Effect<A, E, R> => {
513
+ const effect = new EffectPrimitive(OpCodes.OP_ASYNC) as any
514
+ let cancelerRef: Effect.Effect<void, never, R> | void = undefined
515
+ effect.effect_instruction_i0 = (resume: (_: Effect.Effect<A, E, R>) => void) => {
516
+ cancelerRef = register(resume)
517
+ }
518
+ effect.effect_instruction_i1 = blockingOn
519
+ return cancelerRef !== undefined ?
520
+ onInterrupt(effect, (_) => cancelerRef!) :
521
+ effect
522
+ }
523
+
507
524
  /* @internal */
508
525
  export const async = <A, E = never, R = never>(
509
526
  register: (
@@ -28,6 +28,7 @@ import * as Inspectable from "../Inspectable.js"
28
28
  import type { Logger } from "../Logger.js"
29
29
  import * as LogLevel from "../LogLevel.js"
30
30
  import type * as MetricLabel from "../MetricLabel.js"
31
+ import * as Micro from "../Micro.js"
31
32
  import * as MRef from "../MutableRef.js"
32
33
  import * as Option from "../Option.js"
33
34
  import { pipeArguments } from "../Pipeable.js"
@@ -1073,6 +1074,37 @@ export class FiberRuntime<in out A, in out E = never> implements Fiber.RuntimeFi
1073
1074
  return core.exitSucceed(op.value)
1074
1075
  }
1075
1076
 
1077
+ ["Micro"](op: Micro.Micro<any, any, never> & { _op: "Micro" }) {
1078
+ return core.unsafeAsync<any, any>((microResume) => {
1079
+ const env = Micro.envUnsafeMakeEmpty().pipe(
1080
+ Micro.envSet(Micro.currentContext, this.getFiberRef(core.currentContext))
1081
+ )
1082
+ let resume = microResume
1083
+ op[Micro.runSymbol](env, (result) => {
1084
+ if (result._tag === "Right") {
1085
+ return resume(core.exitSucceed(result.right))
1086
+ }
1087
+ switch (result.left._tag) {
1088
+ case "Aborted": {
1089
+ return resume(core.exitFailCause(internalCause.interrupt(FiberId.none)))
1090
+ }
1091
+ case "Expected": {
1092
+ return resume(core.fail(result.left.error))
1093
+ }
1094
+ case "Unexpected": {
1095
+ return resume(core.die(result.left.defect))
1096
+ }
1097
+ }
1098
+ })
1099
+ return core.async<void>((abortResume) => {
1100
+ resume = (_: any) => {
1101
+ abortResume(core.void)
1102
+ }
1103
+ Micro.envGet(env, Micro.currentAbortController).abort()
1104
+ })
1105
+ })
1106
+ }
1107
+
1076
1108
  [OpCodes.OP_SYNC](op: core.Primitive & { _op: OpCodes.OP_SYNC }) {
1077
1109
  const value = internalCall(() => op.effect_instruction_i0())
1078
1110
  const cont = this.getNextSuccessCont()
@@ -8103,10 +8103,14 @@ export const encodeText = <E, R>(self: Stream.Stream<string, E, R>): Stream.Stre
8103
8103
  })
8104
8104
 
8105
8105
  /** @internal */
8106
- export const fromEventListener = <A = Event>(
8107
- target: EventTarget,
8106
+ export const fromEventListener = <A = unknown>(
8107
+ target: Stream.EventListener<A>,
8108
8108
  type: string,
8109
- options?: boolean | Omit<AddEventListenerOptions, "signal">
8109
+ options?: boolean | {
8110
+ readonly capture?: boolean
8111
+ readonly passive?: boolean
8112
+ readonly once?: boolean
8113
+ } | undefined
8110
8114
  ): Stream.Stream<A> =>
8111
8115
  _async<A>((emit) => {
8112
8116
  let batch: Array<A> = []
@@ -8124,5 +8128,5 @@ export const fromEventListener = <A = Event>(
8124
8128
  }
8125
8129
  }
8126
8130
  target.addEventListener(type, cb as any, options)
8127
- return Effect.sync(() => target.removeEventListener(type, cb as any, options))
8131
+ return Effect.sync(() => target.removeEventListener(type, cb, options))
8128
8132
  })
@@ -1,4 +1,4 @@
1
- let moduleVersion = "3.3.5"
1
+ let moduleVersion = "3.4.1"
2
2
 
3
3
  export const getCurrentVersion = () => moduleVersion
4
4