@typed/fx 1.27.3 → 1.28.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 (191) hide show
  1. package/dist/cjs/AsyncData.js +1 -1
  2. package/dist/cjs/AsyncData.js.map +1 -1
  3. package/dist/cjs/Emitter.js +3 -3
  4. package/dist/cjs/Emitter.js.map +1 -1
  5. package/dist/cjs/Form.js +15 -15
  6. package/dist/cjs/Form.js.map +1 -1
  7. package/dist/cjs/FormEntry.js +3 -3
  8. package/dist/cjs/FormEntry.js.map +1 -1
  9. package/dist/cjs/Fx.js +11 -9
  10. package/dist/cjs/Fx.js.map +1 -1
  11. package/dist/cjs/Idle.js +8 -8
  12. package/dist/cjs/Idle.js.map +1 -1
  13. package/dist/cjs/Match.js +17 -17
  14. package/dist/cjs/Match.js.map +1 -1
  15. package/dist/cjs/Pull.js +3 -3
  16. package/dist/cjs/Pull.js.map +1 -1
  17. package/dist/cjs/Push.js +1 -1
  18. package/dist/cjs/Push.js.map +1 -1
  19. package/dist/cjs/RefArray.js +2 -2
  20. package/dist/cjs/RefArray.js.map +1 -1
  21. package/dist/cjs/RefChunk.js +1 -1
  22. package/dist/cjs/RefChunk.js.map +1 -1
  23. package/dist/cjs/RefHashMap.js +1 -1
  24. package/dist/cjs/RefHashMap.js.map +1 -1
  25. package/dist/cjs/RefHashSet.js +1 -1
  26. package/dist/cjs/RefHashSet.js.map +1 -1
  27. package/dist/cjs/RefSubject.js +150 -75
  28. package/dist/cjs/RefSubject.js.map +1 -1
  29. package/dist/cjs/Sink.js +14 -14
  30. package/dist/cjs/Sink.js.map +1 -1
  31. package/dist/cjs/Stream.js +1 -1
  32. package/dist/cjs/Stream.js.map +1 -1
  33. package/dist/cjs/Subject.js +27 -22
  34. package/dist/cjs/Subject.js.map +1 -1
  35. package/dist/cjs/Typeclass.js +1 -1
  36. package/dist/cjs/Typeclass.js.map +1 -1
  37. package/dist/cjs/Versioned.js +4 -4
  38. package/dist/cjs/Versioned.js.map +1 -1
  39. package/dist/cjs/index.js +1 -1
  40. package/dist/cjs/index.js.map +1 -1
  41. package/dist/cjs/internal/DeferredRef.js +14 -11
  42. package/dist/cjs/internal/DeferredRef.js.map +1 -1
  43. package/dist/cjs/internal/core.js +71 -42
  44. package/dist/cjs/internal/core.js.map +1 -1
  45. package/dist/cjs/internal/diff.js +1 -1
  46. package/dist/cjs/internal/diff.js.map +1 -1
  47. package/dist/cjs/internal/effect-loop-operator.js +1 -1
  48. package/dist/cjs/internal/effect-loop-operator.js.map +1 -1
  49. package/dist/cjs/internal/effect-operator.js +3 -3
  50. package/dist/cjs/internal/effect-operator.js.map +1 -1
  51. package/dist/cjs/internal/effect-producer.js +3 -3
  52. package/dist/cjs/internal/effect-producer.js.map +1 -1
  53. package/dist/cjs/internal/helpers.js +63 -42
  54. package/dist/cjs/internal/helpers.js.map +1 -1
  55. package/dist/cjs/internal/keyed.js +34 -26
  56. package/dist/cjs/internal/keyed.js.map +1 -1
  57. package/dist/cjs/internal/loop-operator.js +1 -1
  58. package/dist/cjs/internal/loop-operator.js.map +1 -1
  59. package/dist/cjs/internal/operator.js +1 -1
  60. package/dist/cjs/internal/operator.js.map +1 -1
  61. package/dist/cjs/internal/protos.js +1 -1
  62. package/dist/cjs/internal/protos.js.map +1 -1
  63. package/dist/cjs/internal/provide.js +1 -1
  64. package/dist/cjs/internal/provide.js.map +1 -1
  65. package/dist/cjs/internal/share.js +8 -13
  66. package/dist/cjs/internal/share.js.map +1 -1
  67. package/dist/cjs/internal/sync-operator.js +4 -4
  68. package/dist/cjs/internal/sync-operator.js.map +1 -1
  69. package/dist/cjs/internal/sync-producer.js +27 -23
  70. package/dist/cjs/internal/sync-producer.js.map +1 -1
  71. package/dist/cjs/internal/withKey.js +7 -7
  72. package/dist/cjs/internal/withKey.js.map +1 -1
  73. package/dist/dts/AsyncData.d.ts +2 -2
  74. package/dist/dts/AsyncData.d.ts.map +1 -1
  75. package/dist/dts/Emitter.d.ts +1 -1
  76. package/dist/dts/Emitter.d.ts.map +1 -1
  77. package/dist/dts/Fx.d.ts +39 -13
  78. package/dist/dts/Fx.d.ts.map +1 -1
  79. package/dist/dts/Idle.d.ts.map +1 -1
  80. package/dist/dts/Match.d.ts +1 -1
  81. package/dist/dts/Match.d.ts.map +1 -1
  82. package/dist/dts/Push.d.ts +4 -1
  83. package/dist/dts/Push.d.ts.map +1 -1
  84. package/dist/dts/RefArray.d.ts +1 -2
  85. package/dist/dts/RefArray.d.ts.map +1 -1
  86. package/dist/dts/RefChunk.d.ts.map +1 -1
  87. package/dist/dts/RefHashMap.d.ts +1 -1
  88. package/dist/dts/RefHashMap.d.ts.map +1 -1
  89. package/dist/dts/RefHashSet.d.ts.map +1 -1
  90. package/dist/dts/RefSubject.d.ts +64 -3
  91. package/dist/dts/RefSubject.d.ts.map +1 -1
  92. package/dist/dts/Sink.d.ts +2 -1
  93. package/dist/dts/Sink.d.ts.map +1 -1
  94. package/dist/dts/Subject.d.ts +2 -1
  95. package/dist/dts/Subject.d.ts.map +1 -1
  96. package/dist/dts/Versioned.d.ts +3 -1
  97. package/dist/dts/Versioned.d.ts.map +1 -1
  98. package/dist/dts/internal/DeferredRef.d.ts +6 -4
  99. package/dist/dts/internal/DeferredRef.d.ts.map +1 -1
  100. package/dist/dts/internal/core.d.ts +25 -12
  101. package/dist/dts/internal/core.d.ts.map +1 -1
  102. package/dist/dts/internal/diff.d.ts +1 -1
  103. package/dist/dts/internal/diff.d.ts.map +1 -1
  104. package/dist/dts/internal/effect-operator.d.ts.map +1 -1
  105. package/dist/dts/internal/helpers.d.ts +8 -6
  106. package/dist/dts/internal/helpers.d.ts.map +1 -1
  107. package/dist/dts/internal/keyed.d.ts +2 -2
  108. package/dist/dts/internal/keyed.d.ts.map +1 -1
  109. package/dist/dts/internal/loop-operator.d.ts +1 -1
  110. package/dist/dts/internal/loop-operator.d.ts.map +1 -1
  111. package/dist/dts/internal/protos.d.ts +1 -1
  112. package/dist/dts/internal/protos.d.ts.map +1 -1
  113. package/dist/dts/internal/provide.d.ts.map +1 -1
  114. package/dist/dts/internal/share.d.ts +1 -1
  115. package/dist/dts/internal/share.d.ts.map +1 -1
  116. package/dist/dts/internal/strategies.d.ts.map +1 -1
  117. package/dist/dts/internal/sync-operator.d.ts.map +1 -1
  118. package/dist/dts/internal/sync-producer.d.ts +4 -4
  119. package/dist/dts/internal/sync-producer.d.ts.map +1 -1
  120. package/dist/esm/Emitter.js +1 -1
  121. package/dist/esm/Emitter.js.map +1 -1
  122. package/dist/esm/Form.js +14 -14
  123. package/dist/esm/Form.js.map +1 -1
  124. package/dist/esm/FormEntry.js +2 -2
  125. package/dist/esm/FormEntry.js.map +1 -1
  126. package/dist/esm/Fx.js +16 -5
  127. package/dist/esm/Fx.js.map +1 -1
  128. package/dist/esm/Idle.js +7 -7
  129. package/dist/esm/Idle.js.map +1 -1
  130. package/dist/esm/Match.js +17 -17
  131. package/dist/esm/Match.js.map +1 -1
  132. package/dist/esm/Pull.js +2 -2
  133. package/dist/esm/Push.js.map +1 -1
  134. package/dist/esm/RefArray.js +1 -1
  135. package/dist/esm/RefArray.js.map +1 -1
  136. package/dist/esm/RefHashMap.js.map +1 -1
  137. package/dist/esm/RefSubject.js +140 -59
  138. package/dist/esm/RefSubject.js.map +1 -1
  139. package/dist/esm/Sink.js +13 -13
  140. package/dist/esm/Sink.js.map +1 -1
  141. package/dist/esm/Subject.js +29 -20
  142. package/dist/esm/Subject.js.map +1 -1
  143. package/dist/esm/Versioned.js +1 -1
  144. package/dist/esm/Versioned.js.map +1 -1
  145. package/dist/esm/internal/DeferredRef.js +13 -10
  146. package/dist/esm/internal/DeferredRef.js.map +1 -1
  147. package/dist/esm/internal/core.js +70 -37
  148. package/dist/esm/internal/core.js.map +1 -1
  149. package/dist/esm/internal/diff.js.map +1 -1
  150. package/dist/esm/internal/effect-operator.js +2 -2
  151. package/dist/esm/internal/effect-producer.js +1 -1
  152. package/dist/esm/internal/helpers.js +62 -39
  153. package/dist/esm/internal/helpers.js.map +1 -1
  154. package/dist/esm/internal/keyed.js +26 -17
  155. package/dist/esm/internal/keyed.js.map +1 -1
  156. package/dist/esm/internal/share.js +7 -12
  157. package/dist/esm/internal/share.js.map +1 -1
  158. package/dist/esm/internal/sync-operator.js +3 -3
  159. package/dist/esm/internal/sync-operator.js.map +1 -1
  160. package/dist/esm/internal/sync-producer.js +7 -5
  161. package/dist/esm/internal/sync-producer.js.map +1 -1
  162. package/dist/esm/internal/withKey.js +6 -6
  163. package/dist/esm/internal/withKey.js.map +1 -1
  164. package/package.json +8 -7
  165. package/src/Emitter.ts +2 -1
  166. package/src/Form.ts +22 -30
  167. package/src/FormEntry.ts +2 -2
  168. package/src/Fx.ts +54 -36
  169. package/src/Idle.ts +7 -7
  170. package/src/Match.ts +24 -26
  171. package/src/Pull.ts +2 -2
  172. package/src/Push.ts +4 -1
  173. package/src/RefArray.ts +1 -1
  174. package/src/RefHashMap.ts +1 -1
  175. package/src/RefSubject.ts +262 -98
  176. package/src/Sink.ts +15 -14
  177. package/src/Subject.ts +55 -39
  178. package/src/Versioned.ts +4 -2
  179. package/src/internal/DeferredRef.ts +21 -11
  180. package/src/internal/core.ts +92 -61
  181. package/src/internal/diff.ts +1 -1
  182. package/src/internal/effect-operator.ts +2 -2
  183. package/src/internal/effect-producer.ts +3 -3
  184. package/src/internal/helpers.ts +89 -42
  185. package/src/internal/keyed.ts +47 -42
  186. package/src/internal/loop-operator.ts +1 -1
  187. package/src/internal/protos.ts +1 -1
  188. package/src/internal/share.ts +11 -26
  189. package/src/internal/sync-operator.ts +3 -3
  190. package/src/internal/sync-producer.ts +7 -5
  191. package/src/internal/withKey.ts +6 -6
@@ -1,3 +1,4 @@
1
+ import { MutableRef } from "effect";
1
2
  import * as Deferred from "effect/Deferred";
2
3
  import * as Effect from "effect/Effect";
3
4
  import * as Exit from "effect/Exit";
@@ -6,29 +7,31 @@ import { EffectBase } from "./protos.js";
6
7
  export class DeferredRef extends EffectBase {
7
8
  id;
8
9
  eq;
9
- // Keep track of the latest value emitted by the stream
10
10
  current;
11
+ // Keep track of the latest value emitted by the stream
11
12
  version;
12
13
  deferred;
13
- constructor(id, eq) {
14
+ constructor(id, eq, current) {
14
15
  super();
15
16
  this.id = id;
16
17
  this.eq = eq;
18
+ this.current = current;
17
19
  this.reset();
18
20
  }
19
21
  toEffect() {
20
22
  return Effect.suspend(() => {
21
- if (Option.isNone(this.current)) {
23
+ const current = MutableRef.get(this.current);
24
+ if (Option.isNone(current)) {
22
25
  return Deferred.await(this.deferred);
23
26
  }
24
27
  else {
25
- return this.current.value;
28
+ return current.value;
26
29
  }
27
30
  });
28
31
  }
29
32
  done(exit) {
30
- const current = this.current;
31
- this.current = Option.some(exit);
33
+ const current = MutableRef.get(this.current);
34
+ MutableRef.set(this.current, Option.some(exit));
32
35
  if (Option.isSome(current) && this.eq(current.value, exit)) {
33
36
  return false;
34
37
  }
@@ -37,7 +40,7 @@ export class DeferredRef extends EffectBase {
37
40
  return true;
38
41
  }
39
42
  reset() {
40
- this.current = Option.none();
43
+ MutableRef.set(this.current, Option.none());
41
44
  this.version = -1;
42
45
  if (this.deferred) {
43
46
  Deferred.unsafeDone(this.deferred, Exit.interrupt(this.id));
@@ -46,9 +49,9 @@ export class DeferredRef extends EffectBase {
46
49
  }
47
50
  }
48
51
  export function make(eq) {
49
- return Effect.map(Effect.fiberId, (id) => new DeferredRef(id, eq));
52
+ return Effect.map(Effect.fiberId, (id) => new DeferredRef(id, eq, MutableRef.make(Option.none())));
50
53
  }
51
- export function unsafeMake(id, eq) {
52
- return new DeferredRef(id, eq);
54
+ export function unsafeMake(id, eq, current) {
55
+ return new DeferredRef(id, eq, current);
53
56
  }
54
57
  //# sourceMappingURL=DeferredRef.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DeferredRef.js","sourceRoot":"","sources":["../../../src/internal/DeferredRef.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,OAAO,WAAkB,SAAQ,UAAuB;IAMxC;IAA6B;IALjD,uDAAuD;IAChD,OAAO,CAAiC;IACxC,OAAO,CAAS;IAChB,QAAQ,CAA0B;IAEzC,YAAoB,EAAmB,EAAU,EAA4C;QAC3F,KAAK,EAAE,CAAA;QADW,OAAE,GAAF,EAAE,CAAiB;QAAU,OAAE,GAAF,EAAE,CAA0C;QAE3F,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,QAAQ;QACN,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;YACzB,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACtC,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAA;YAC3B,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,CAAC,IAAqB;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEhC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAA;QACd,CAAC;QAED,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QACxC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;QAEjB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA;QAEjB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QAC7D,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC9C,CAAC;CACF;AAED,MAAM,UAAU,IAAI,CAAO,EAA4C;IACrE,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;AACpE,CAAC;AAED,MAAM,UAAU,UAAU,CAAO,EAAmB,EAAE,EAA4C;IAChG,OAAO,IAAI,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;AAChC,CAAC"}
1
+ {"version":3,"file":"DeferredRef.js","sourceRoot":"","sources":["../../../src/internal/DeferredRef.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AAEnC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,OAAO,WAAkB,SAAQ,UAAuB;IAMlD;IACA;IACC;IAPX,uDAAuD;IAChD,OAAO,CAAS;IAChB,QAAQ,CAA0B;IAEzC,YACU,EAAmB,EACnB,EAA4C,EAC3C,OAA8D;QAEvE,KAAK,EAAE,CAAA;QAJC,OAAE,GAAF,EAAE,CAAiB;QACnB,OAAE,GAAF,EAAE,CAA0C;QAC3C,YAAO,GAAP,OAAO,CAAuD;QAGvE,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,QAAQ;QACN,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;YACzB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC5C,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACtC,CAAC;iBAAM,CAAC;gBACN,OAAO,OAAO,CAAC,KAAK,CAAA;YACtB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,CAAC,IAAqB;QACxB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAE5C,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAE/C,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAA;QACd,CAAC;QAED,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QACxC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;QAEjB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK;QACH,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QAC3C,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA;QAEjB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QAC7D,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC9C,CAAC;CACF;AAED,MAAM,UAAU,IAAI,CAAO,EAA4C;IACrE,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AACpG,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,EAAmB,EACnB,EAA4C,EAC5C,OAA8D;IAE9D,OAAO,IAAI,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;AACzC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import * as Context from "@typed/context";
2
- import { Unify } from "effect";
2
+ import { Data, Record } from "effect";
3
3
  import * as Boolean from "effect/Boolean";
4
4
  import * as Cause from "effect/Cause";
5
5
  import * as Clock from "effect/Clock";
@@ -18,6 +18,7 @@ import * as Predicate from "effect/Predicate";
18
18
  import * as Ref from "effect/Ref";
19
19
  import * as Scope from "effect/Scope";
20
20
  import * as Tracer from "effect/Tracer";
21
+ import * as Unify from "effect/Unify";
21
22
  import * as Sink from "../Sink.js";
22
23
  import { boundsFrom, isInfiniteBounds, isNilBounds, mergeBounds } from "./bounds.js";
23
24
  import * as EffectLoopOp from "./effect-loop-operator.js";
@@ -194,7 +195,7 @@ export const filterMapLoop = (fx, seed, f) => Transformer.make(fx, SyncLoopOp.Fi
194
195
  export const loopEffect = (fx, seed, f) => Transformer.make(fx, EffectLoopOp.LoopEffectOperator(seed, f));
195
196
  export const filterMapLoopEffect = (fx, seed, f) => Transformer.make(fx, EffectLoopOp.FilterMapLoopEffectOperator(seed, f));
196
197
  export const observe = (fx, f) => Observe.make(fx, f);
197
- const constUnit = () => Effect.unit;
198
+ const constUnit = () => Effect.void;
198
199
  export const drain = (fx) => Observe.make(fx, constUnit);
199
200
  class Observe extends EffectBase {
200
201
  i0;
@@ -208,12 +209,12 @@ class Observe extends EffectBase {
208
209
  return Effect.asyncEffect((resume) => {
209
210
  const { i0: fx, i1: f } = this;
210
211
  const onFailure = (cause) => Effect.sync(() => resume(Effect.failCause(cause)));
211
- return Effect.zipRight(fx.run(Sink.make(onFailure, (a) => Effect.catchAllCause(f(a), onFailure))), Effect.sync(() => resume(Effect.unit)));
212
+ return Effect.zipRight(fx.run(Sink.make(onFailure, (a) => Effect.catchAllCause(f(a), onFailure))), Effect.sync(() => resume(Effect.void)));
212
213
  });
213
214
  }
214
215
  static make(fx, f) {
215
216
  if (isEmpty(fx)) {
216
- return Effect.unit;
217
+ return Effect.void;
217
218
  }
218
219
  else if (isNever(fx)) {
219
220
  return Effect.never;
@@ -225,13 +226,13 @@ class Observe extends EffectBase {
225
226
  return Op.matchOperator(fx.i1, {
226
227
  SyncOperator: (op) => SyncOp.matchSyncOperator(op, {
227
228
  Map: (op) => SyncProducer.effectOnce(() => SyncProducer.runEffect(fx.i0, (a) => f(op.f(a)))),
228
- Filter: (op) => SyncProducer.effectOnce(() => SyncProducer.runEffect(fx.i0, Unify.unify((a) => op.f(a) ? f(a) : Effect.unit))),
229
- FilterMap: (op) => SyncProducer.effectOnce(() => SyncProducer.runEffect(fx.i0, Unify.unify((a) => Option.match(op.f(a), { onNone: () => Effect.unit, onSome: f }))))
229
+ Filter: (op) => SyncProducer.effectOnce(() => SyncProducer.runEffect(fx.i0, Unify.unify((a) => op.f(a) ? f(a) : Effect.void))),
230
+ FilterMap: (op) => SyncProducer.effectOnce(() => SyncProducer.runEffect(fx.i0, Unify.unify((a) => Option.match(op.f(a), { onNone: () => Effect.void, onSome: f }))))
230
231
  }),
231
232
  EffectOperator: (op) => EffectOp.matchEffectOperator(op, {
232
233
  MapEffect: (op) => SyncProducer.runEffect(fx.i0, (a) => Effect.flatMap(op.f(a), f)),
233
- FilterMapEffect: (op) => SyncProducer.runEffect(fx.i0, (a) => Effect.flatMap(op.f(a), Unify.unify(Option.match({ onNone: () => Effect.unit, onSome: f })))),
234
- FilterEffect: (op) => SyncProducer.runEffect(fx.i0, Unify.unify((a) => Effect.flatMap(op.f(a), Unify.unify((b) => b ? f(a) : Effect.unit)))),
234
+ FilterMapEffect: (op) => SyncProducer.runEffect(fx.i0, (a) => Effect.flatMap(op.f(a), Unify.unify(Option.match({ onNone: () => Effect.void, onSome: f })))),
235
+ FilterEffect: (op) => SyncProducer.runEffect(fx.i0, Unify.unify((a) => Effect.flatMap(op.f(a), Unify.unify((b) => b ? f(a) : Effect.void)))),
235
236
  TapEffect: (op) => SyncProducer.runEffect(fx.i0, (a) => Effect.flatMap(op.f(a), () => f(a)))
236
237
  }),
237
238
  SyncLoopOperator: (op) => SyncLoopOp.matchSyncLoopOperator(op, {
@@ -260,13 +261,13 @@ class Observe extends EffectBase {
260
261
  return Op.matchOperator(fx.i1, {
261
262
  SyncOperator: (op) => SyncOp.matchSyncOperator(op, {
262
263
  Map: (op) => SyncProducer.effectOnce(() => EffectProducer.runEffect(fx.i0, (a) => f(op.f(a)))),
263
- Filter: (op) => SyncProducer.effectOnce(() => EffectProducer.runEffect(fx.i0, Unify.unify((a) => op.f(a) ? f(a) : Effect.unit))),
264
- FilterMap: (op) => SyncProducer.effectOnce(() => EffectProducer.runEffect(fx.i0, Unify.unify((a) => Option.match(op.f(a), { onNone: () => Effect.unit, onSome: f }))))
264
+ Filter: (op) => SyncProducer.effectOnce(() => EffectProducer.runEffect(fx.i0, Unify.unify((a) => op.f(a) ? f(a) : Effect.void))),
265
+ FilterMap: (op) => SyncProducer.effectOnce(() => EffectProducer.runEffect(fx.i0, Unify.unify((a) => Option.match(op.f(a), { onNone: () => Effect.void, onSome: f }))))
265
266
  }),
266
267
  EffectOperator: (op) => EffectOp.matchEffectOperator(op, {
267
268
  MapEffect: (op) => EffectProducer.runEffect(fx.i0, (a) => Effect.flatMap(op.f(a), f)),
268
- FilterMapEffect: (op) => EffectProducer.runEffect(fx.i0, (a) => Effect.flatMap(op.f(a), Unify.unify(Option.match({ onNone: () => Effect.unit, onSome: f })))),
269
- FilterEffect: (op) => EffectProducer.runEffect(fx.i0, Unify.unify((a) => Effect.flatMap(op.f(a), Unify.unify((b) => b ? f(a) : Effect.unit)))),
269
+ FilterMapEffect: (op) => EffectProducer.runEffect(fx.i0, (a) => Effect.flatMap(op.f(a), Unify.unify(Option.match({ onNone: () => Effect.void, onSome: f })))),
270
+ FilterEffect: (op) => EffectProducer.runEffect(fx.i0, Unify.unify((a) => Effect.flatMap(op.f(a), Unify.unify((b) => b ? f(a) : Effect.void)))),
270
271
  TapEffect: (op) => EffectProducer.runEffect(fx.i0, (a) => Effect.flatMap(op.f(a), () => f(a)))
271
272
  }),
272
273
  SyncLoopOperator: (op) => SyncLoopOp.matchSyncLoopOperator(op, {
@@ -417,8 +418,43 @@ export function skipRepeatsWith(fx, eq) {
417
418
  }
418
419
  });
419
420
  }
421
+ const toDeepEquals = (u) => {
422
+ switch (typeof u) {
423
+ case "object": {
424
+ if (Predicate.isNullable(u)) {
425
+ return u;
426
+ }
427
+ else if (Equal.symbol in u) {
428
+ return u;
429
+ }
430
+ else if (Array.isArray(u)) {
431
+ return Data.tuple(u.map(toDeepEquals));
432
+ }
433
+ else if (u instanceof Set) {
434
+ return Data.tuple(Array.from(u, toDeepEquals));
435
+ }
436
+ else if (u instanceof Map) {
437
+ return Data.tuple(Array.from(u, ([k, v]) => Data.tuple([toDeepEquals(k), toDeepEquals(v)])));
438
+ }
439
+ else {
440
+ return Data.struct(Record.map(u, toDeepEquals));
441
+ }
442
+ }
443
+ default:
444
+ return u;
445
+ }
446
+ };
447
+ /**
448
+ * @internal
449
+ */
450
+ export const deepEquals = (a, b) => {
451
+ // Attempt reference equality first for performance
452
+ if (Object.is(a, b))
453
+ return true;
454
+ return Equal.equals(toDeepEquals(a), toDeepEquals(b));
455
+ };
420
456
  export function skipRepeats(fx) {
421
- return skipRepeatsWith(fx, Equal.equals);
457
+ return skipRepeatsWith(fx, deepEquals);
422
458
  }
423
459
  class ProducerEffectTransformer extends FxBase {
424
460
  i0;
@@ -440,7 +476,7 @@ export function isProducerEffectTransformer(fx) {
440
476
  }
441
477
  class Empty extends FxBase {
442
478
  run() {
443
- return Effect.unit;
479
+ return Effect.void;
444
480
  }
445
481
  }
446
482
  /**
@@ -709,10 +745,10 @@ class OrElse extends FxBase {
709
745
  this.i1 = i1;
710
746
  }
711
747
  run(sink) {
712
- return Effect.catchAll(Effect.asyncEffect((resume) => Effect.asUnit(Effect.zipRight(this.i0.run(Sink.make((cause) => Either.match(Cause.failureOrCause(cause), {
748
+ return Effect.catchAll(Effect.asyncEffect((resume) => Effect.asVoid(Effect.zipRight(this.i0.run(Sink.make((cause) => Either.match(Cause.failureOrCause(cause), {
713
749
  onLeft: (e) => Effect.succeed(resume(Effect.fail(e))),
714
750
  onRight: (cause) => sink.onFailure(cause)
715
- }), sink.onSuccess)), Effect.sync(() => resume(Effect.unit))))), (error) => this.i1(error).run(sink));
751
+ }), sink.onSuccess)), Effect.sync(() => resume(Effect.void))))), (error) => this.i1(error).run(sink));
716
752
  }
717
753
  static make(fx, f) {
718
754
  if (isEmpty(fx))
@@ -804,9 +840,9 @@ function runUnordered(fx, sink, concurrency) {
804
840
  return Effect.forEach(fx, (fx) => fx.run(sink), { concurrency, discard: true });
805
841
  }
806
842
  function runOrdered(fx, sink, concurrency) {
807
- return Effect.suspend(() => {
808
- const buffers = withBuffers(fx.length, sink);
809
- return Effect.forEach(fx, (fx, i) => Effect.flatMap(fx.run(Sink.make((cause) => Cause.isInterruptedOnly(cause) ? Effect.unit : sink.onFailure(cause), (a) => buffers.onSuccess(i, a))), () => buffers.onEnd(i)), {
843
+ return Effect.fiberIdWith((id) => {
844
+ const buffers = withBuffers(fx.length, sink, id);
845
+ return Effect.forEach(fx, (fx, i) => Effect.flatMap(fx.run(Sink.make((cause) => Cause.isInterruptedOnly(cause) ? buffers.onEnd(i) : sink.onFailure(cause), (a) => buffers.onSuccess(i, a))), () => buffers.onEnd(i)), {
810
846
  concurrency,
811
847
  discard: true
812
848
  });
@@ -985,7 +1021,7 @@ class During extends FxBase {
985
1021
  return take(nested, 1).run(Sink.make(onFailure, () => s.earlyExit));
986
1022
  }))), () => Effect.zipRight(
987
1023
  // Allow fibers to start
988
- adjustTime(1), this.i0.run(Sink.make(onFailure, (a) => taking ? s.onSuccess(a) : Effect.unit))));
1024
+ adjustTime(1), this.i0.run(Sink.make(onFailure, (a) => taking ? s.onSuccess(a) : Effect.void))));
989
1025
  }), ExecutionStrategy.sequential);
990
1026
  }
991
1027
  static make(fx, window) {
@@ -1429,14 +1465,14 @@ class FromAsyncIterable extends FxBase {
1429
1465
  return Effect.asyncEffect((cb) => {
1430
1466
  const iterator = this.i0[Symbol.asyncIterator]();
1431
1467
  const loop = (result) => result.done
1432
- ? Effect.sync(() => cb(Effect.unit))
1468
+ ? Effect.sync(() => cb(Effect.void))
1433
1469
  : Effect.zipRight(sink.onSuccess(result.value), Effect.flatMap(Effect.promise(() => iterator.next()), loop));
1434
- return Effect.asUnit(Effect.flatMap(Effect.promise(() => iterator.next()), loop));
1470
+ return Effect.asVoid(Effect.flatMap(Effect.promise(() => iterator.next()), loop));
1435
1471
  });
1436
1472
  }
1437
1473
  }
1438
1474
  export function findFirst(fx, predicate) {
1439
- return Effect.asyncEffect((cb) => observe(fx, (a) => predicate(a) ? Effect.sync(() => cb(Effect.succeed(a))) : Effect.unit));
1475
+ return Effect.asyncEffect((cb) => observe(fx, (a) => predicate(a) ? Effect.sync(() => cb(Effect.succeed(a))) : Effect.void));
1440
1476
  }
1441
1477
  export function first(fx) {
1442
1478
  return findFirst(fx, constTrue);
@@ -1473,9 +1509,9 @@ class MergeRace extends FxBase {
1473
1509
  }
1474
1510
  run(sink) {
1475
1511
  return Effect.gen(this, function* (_) {
1476
- const fiber1 = yield* _(Effect.fork(this.i0.run(Sink.make(sink.onFailure, (a) => Effect.flatMap(sink.onSuccess(a), () => Fiber.interrupt(fiber2))))));
1477
- const fiber2 = yield* _(Effect.fork(this.i1.run(sink)));
1478
- return yield* _(Fiber.joinAll([fiber1, fiber2]));
1512
+ const fiber1 = yield* Effect.fork(this.i0.run(Sink.make(sink.onFailure, (a) => Effect.flatMap(sink.onSuccess(a), () => Fiber.interrupt(fiber2)))));
1513
+ const fiber2 = yield* Effect.fork(this.i1.run(sink));
1514
+ return yield* Fiber.joinAll([fiber1, fiber2]);
1479
1515
  });
1480
1516
  }
1481
1517
  }
@@ -1493,15 +1529,15 @@ class RaceAll extends FxBase {
1493
1529
  }
1494
1530
  run(sink) {
1495
1531
  return Effect.gen(this, function* (_) {
1496
- const winner = yield* _(Deferred.make());
1532
+ const winner = yield* Deferred.make();
1497
1533
  const fibers = [];
1498
1534
  for (const fx of this.i0) {
1499
- const fiber = yield* _(Effect.fork(fx.run(Sink.make(sink.onFailure, (a) => Effect.flatMap(Deferred.succeed(winner, fiber), () => sink.onSuccess(a))))));
1535
+ const fiber = yield* Effect.fork(fx.run(Sink.make(sink.onFailure, (a) => Effect.flatMap(Deferred.succeed(winner, fiber), () => sink.onSuccess(a)))));
1500
1536
  fibers.push(fiber);
1501
1537
  }
1502
- const winningFiber = yield* _(Deferred.await(winner));
1503
- yield* _(Fiber.interruptAll(fibers.filter((x) => x !== winningFiber)));
1504
- return yield* _(Fiber.join(winningFiber));
1538
+ const winningFiber = yield* Deferred.await(winner);
1539
+ yield* Fiber.interruptAll(fibers.filter((x) => x !== winningFiber));
1540
+ return yield* Fiber.join(winningFiber);
1505
1541
  });
1506
1542
  }
1507
1543
  }
@@ -1525,7 +1561,7 @@ class Snapshot extends FxBase {
1525
1561
  return Effect.flatMap(Ref.make(Option.none()), (ref) => Effect.all([
1526
1562
  this.i1.run(Sink.make(sink.onFailure, (b) => Ref.set(ref, Option.some(b)))),
1527
1563
  this.i0.run(Sink.make(sink.onFailure, (a) => Effect.flatMap(Ref.get(ref), Option.match({
1528
- onNone: () => Effect.unit,
1564
+ onNone: () => Effect.void,
1529
1565
  onSome: (b) => sink.onSuccess(this.i2(a, b))
1530
1566
  }))))
1531
1567
  ], UNBOUNDED));
@@ -1546,7 +1582,7 @@ class SnapshotEffect extends FxBase {
1546
1582
  }
1547
1583
  run(sink) {
1548
1584
  return Effect.flatMap(Ref.make(Option.none()), (ref) => Effect.flatMap(Effect.tap(Effect.fork(this.i1.run(Sink.make(sink.onFailure, (b) => Ref.set(ref, Option.some(b))))), () => this.i0.run(Sink.make(sink.onFailure, (a) => Effect.flatMap(Ref.get(ref), Option.match({
1549
- onNone: () => Effect.unit,
1585
+ onNone: () => Effect.void,
1550
1586
  onSome: (b) => Effect.matchCauseEffect(this.i2(a, b), sink)
1551
1587
  }))))), Fiber.interrupt));
1552
1588
  }
@@ -1556,10 +1592,7 @@ function if_(bool, options) {
1556
1592
  }
1557
1593
  export { if_ as if };
1558
1594
  export function when(bool, options) {
1559
- return if_(bool, {
1560
- onTrue: succeed(options.onTrue),
1561
- onFalse: succeed(options.onFalse)
1562
- });
1595
+ return map(skipRepeatsWith(bool, boolean), (b) => (b ? options.onTrue : options.onFalse));
1563
1596
  }
1564
1597
  export function mapBoth(fx, f, g) {
1565
1598
  return map(mapError(fx, f), g);