effect 4.0.0-beta.17 → 4.0.0-beta.19

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 (164) hide show
  1. package/dist/Array.d.ts +127 -299
  2. package/dist/Array.d.ts.map +1 -1
  3. package/dist/Array.js +102 -62
  4. package/dist/Array.js.map +1 -1
  5. package/dist/Cache.d.ts.map +1 -1
  6. package/dist/Cache.js +5 -4
  7. package/dist/Cache.js.map +1 -1
  8. package/dist/Channel.d.ts +97 -11
  9. package/dist/Channel.d.ts.map +1 -1
  10. package/dist/Channel.js +72 -29
  11. package/dist/Channel.js.map +1 -1
  12. package/dist/Chunk.d.ts +54 -247
  13. package/dist/Chunk.d.ts.map +1 -1
  14. package/dist/Chunk.js +36 -67
  15. package/dist/Chunk.js.map +1 -1
  16. package/dist/Effect.d.ts +337 -437
  17. package/dist/Effect.d.ts.map +1 -1
  18. package/dist/Effect.js +118 -134
  19. package/dist/Effect.js.map +1 -1
  20. package/dist/Filter.d.ts +0 -33
  21. package/dist/Filter.d.ts.map +1 -1
  22. package/dist/Filter.js +0 -13
  23. package/dist/Filter.js.map +1 -1
  24. package/dist/HashMap.d.ts +15 -14
  25. package/dist/HashMap.d.ts.map +1 -1
  26. package/dist/HashMap.js +4 -4
  27. package/dist/HashMap.js.map +1 -1
  28. package/dist/Iterable.d.ts +40 -39
  29. package/dist/Iterable.d.ts.map +1 -1
  30. package/dist/Iterable.js +94 -22
  31. package/dist/Iterable.js.map +1 -1
  32. package/dist/Option.d.ts +22 -15
  33. package/dist/Option.d.ts.map +1 -1
  34. package/dist/Option.js +14 -7
  35. package/dist/Option.js.map +1 -1
  36. package/dist/Pull.d.ts.map +1 -1
  37. package/dist/Pull.js +1 -1
  38. package/dist/Pull.js.map +1 -1
  39. package/dist/Record.d.ts +24 -120
  40. package/dist/Record.d.ts.map +1 -1
  41. package/dist/Record.js +21 -41
  42. package/dist/Record.js.map +1 -1
  43. package/dist/Sink.d.ts +11 -11
  44. package/dist/Sink.d.ts.map +1 -1
  45. package/dist/Sink.js +53 -6
  46. package/dist/Sink.js.map +1 -1
  47. package/dist/Stream.d.ts +198 -386
  48. package/dist/Stream.d.ts.map +1 -1
  49. package/dist/Stream.js +103 -59
  50. package/dist/Stream.js.map +1 -1
  51. package/dist/Trie.d.ts +18 -17
  52. package/dist/Trie.d.ts.map +1 -1
  53. package/dist/Trie.js +5 -5
  54. package/dist/Trie.js.map +1 -1
  55. package/dist/TxChunk.d.ts +37 -37
  56. package/dist/TxChunk.d.ts.map +1 -1
  57. package/dist/TxChunk.js +3 -3
  58. package/dist/TxChunk.js.map +1 -1
  59. package/dist/TxDeferred.d.ts +328 -0
  60. package/dist/TxDeferred.d.ts.map +1 -0
  61. package/dist/TxDeferred.js +196 -0
  62. package/dist/TxDeferred.js.map +1 -0
  63. package/dist/TxHashMap.d.ts +84 -83
  64. package/dist/TxHashMap.d.ts.map +1 -1
  65. package/dist/TxHashMap.js +24 -24
  66. package/dist/TxHashMap.js.map +1 -1
  67. package/dist/TxHashSet.d.ts +35 -35
  68. package/dist/TxHashSet.d.ts.map +1 -1
  69. package/dist/TxHashSet.js +14 -14
  70. package/dist/TxHashSet.js.map +1 -1
  71. package/dist/TxPriorityQueue.d.ts +609 -0
  72. package/dist/TxPriorityQueue.d.ts.map +1 -0
  73. package/dist/TxPriorityQueue.js +415 -0
  74. package/dist/TxPriorityQueue.js.map +1 -0
  75. package/dist/TxPubSub.d.ts +585 -0
  76. package/dist/TxPubSub.d.ts.map +1 -0
  77. package/dist/TxPubSub.js +521 -0
  78. package/dist/TxPubSub.js.map +1 -0
  79. package/dist/TxQueue.d.ts +32 -32
  80. package/dist/TxQueue.d.ts.map +1 -1
  81. package/dist/TxQueue.js +26 -26
  82. package/dist/TxQueue.js.map +1 -1
  83. package/dist/TxReentrantLock.d.ts +523 -0
  84. package/dist/TxReentrantLock.d.ts.map +1 -0
  85. package/dist/TxReentrantLock.js +504 -0
  86. package/dist/TxReentrantLock.js.map +1 -0
  87. package/dist/TxRef.d.ts +34 -34
  88. package/dist/TxRef.d.ts.map +1 -1
  89. package/dist/TxRef.js +21 -14
  90. package/dist/TxRef.js.map +1 -1
  91. package/dist/TxSemaphore.d.ts +8 -8
  92. package/dist/TxSemaphore.d.ts.map +1 -1
  93. package/dist/TxSemaphore.js +7 -7
  94. package/dist/TxSemaphore.js.map +1 -1
  95. package/dist/TxSubscriptionRef.d.ts +508 -0
  96. package/dist/TxSubscriptionRef.d.ts.map +1 -0
  97. package/dist/TxSubscriptionRef.js +293 -0
  98. package/dist/TxSubscriptionRef.js.map +1 -0
  99. package/dist/index.d.ts +40 -0
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +40 -0
  102. package/dist/index.js.map +1 -1
  103. package/dist/internal/effect.js +99 -42
  104. package/dist/internal/effect.js.map +1 -1
  105. package/dist/internal/hashMap.js +3 -2
  106. package/dist/internal/hashMap.js.map +1 -1
  107. package/dist/internal/trie.js +5 -4
  108. package/dist/internal/trie.js.map +1 -1
  109. package/dist/unstable/ai/Tool.d.ts.map +1 -1
  110. package/dist/unstable/ai/Tool.js +0 -9
  111. package/dist/unstable/ai/Tool.js.map +1 -1
  112. package/dist/unstable/cli/Command.d.ts +1 -1
  113. package/dist/unstable/cli/Command.d.ts.map +1 -1
  114. package/dist/unstable/cli/Command.js +1 -1
  115. package/dist/unstable/cli/Command.js.map +1 -1
  116. package/dist/unstable/cluster/K8sHttpClient.js +4 -4
  117. package/dist/unstable/cluster/K8sHttpClient.js.map +1 -1
  118. package/dist/unstable/cluster/Sharding.js +1 -1
  119. package/dist/unstable/cluster/Sharding.js.map +1 -1
  120. package/dist/unstable/encoding/Sse.js +1 -1
  121. package/dist/unstable/encoding/Sse.js.map +1 -1
  122. package/dist/unstable/rpc/RpcServer.d.ts.map +1 -1
  123. package/dist/unstable/rpc/RpcServer.js +1 -2
  124. package/dist/unstable/rpc/RpcServer.js.map +1 -1
  125. package/dist/unstable/socket/Socket.d.ts.map +1 -1
  126. package/dist/unstable/socket/Socket.js +3 -3
  127. package/dist/unstable/socket/Socket.js.map +1 -1
  128. package/package.json +1 -1
  129. package/src/Array.ts +190 -342
  130. package/src/Cache.ts +6 -5
  131. package/src/Channel.ts +506 -102
  132. package/src/Chunk.ts +81 -268
  133. package/src/Effect.ts +437 -518
  134. package/src/Filter.ts +0 -57
  135. package/src/HashMap.ts +15 -14
  136. package/src/Iterable.ts +105 -50
  137. package/src/Option.ts +30 -20
  138. package/src/Pull.ts +1 -1
  139. package/src/Record.ts +43 -152
  140. package/src/Sink.ts +75 -23
  141. package/src/Stream.ts +442 -502
  142. package/src/Trie.ts +18 -17
  143. package/src/TxChunk.ts +72 -53
  144. package/src/TxDeferred.ts +394 -0
  145. package/src/TxHashMap.ts +332 -285
  146. package/src/TxHashSet.ts +111 -116
  147. package/src/TxPriorityQueue.ts +767 -0
  148. package/src/TxPubSub.ts +789 -0
  149. package/src/TxQueue.ts +241 -251
  150. package/src/TxReentrantLock.ts +753 -0
  151. package/src/TxRef.ts +50 -38
  152. package/src/TxSemaphore.ts +29 -32
  153. package/src/TxSubscriptionRef.ts +639 -0
  154. package/src/index.ts +45 -0
  155. package/src/internal/effect.ts +368 -163
  156. package/src/internal/hashMap.ts +7 -5
  157. package/src/internal/trie.ts +16 -9
  158. package/src/unstable/ai/Tool.ts +0 -9
  159. package/src/unstable/cli/Command.ts +6 -4
  160. package/src/unstable/cluster/K8sHttpClient.ts +4 -4
  161. package/src/unstable/cluster/Sharding.ts +1 -1
  162. package/src/unstable/encoding/Sse.ts +1 -1
  163. package/src/unstable/rpc/RpcServer.ts +1 -7
  164. package/src/unstable/socket/Socket.ts +9 -11
@@ -0,0 +1,521 @@
1
+ /**
2
+ * TxPubSub is a transactional publish/subscribe hub that provides Software Transactional Memory
3
+ * (STM) semantics for message broadcasting. Publishers broadcast messages to all current
4
+ * subscribers, with each subscriber receiving its own copy of every published message.
5
+ *
6
+ * Supports multiple queue strategies: bounded, unbounded, dropping, and sliding.
7
+ *
8
+ * @since 4.0.0
9
+ */
10
+ import * as Effect from "./Effect.js";
11
+ import { dual } from "./Function.js";
12
+ import { NodeInspectSymbol, toJson } from "./Inspectable.js";
13
+ import { pipeArguments } from "./Pipeable.js";
14
+ import { hasProperty } from "./Predicate.js";
15
+ import * as TxQueue from "./TxQueue.js";
16
+ import * as TxRef from "./TxRef.js";
17
+ const TypeId = "~effect/transactions/TxPubSub";
18
+ const TxPubSubProto = {
19
+ [NodeInspectSymbol]() {
20
+ return toJson(this);
21
+ },
22
+ toJSON() {
23
+ return {
24
+ _id: "TxPubSub",
25
+ strategy: this.strategy,
26
+ capacity: this.capacity
27
+ };
28
+ },
29
+ toString() {
30
+ return `TxPubSub(${this.strategy}, ${this.capacity})`;
31
+ },
32
+ pipe() {
33
+ return pipeArguments(this, arguments);
34
+ }
35
+ };
36
+ const makeTxPubSub = (subscribersRef, shutdownRef, strategy, cap) => {
37
+ const self = Object.create(TxPubSubProto);
38
+ self[TypeId] = TypeId;
39
+ self.subscribersRef = subscribersRef;
40
+ self.shutdownRef = shutdownRef;
41
+ self.strategy = strategy;
42
+ self.capacity = cap;
43
+ return self;
44
+ };
45
+ // =============================================================================
46
+ // Constructors
47
+ // =============================================================================
48
+ /**
49
+ * Creates a bounded TxPubSub with the specified capacity. When a subscriber's
50
+ * queue is full, the publisher will retry the transaction until space is available.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * import { Effect, TxPubSub, TxQueue } from "effect"
55
+ *
56
+ * const program = Effect.gen(function*() {
57
+ * const hub = yield* TxPubSub.bounded<number>(16)
58
+ *
59
+ * yield* Effect.scoped(
60
+ * Effect.gen(function*() {
61
+ * const sub = yield* TxPubSub.subscribe(hub)
62
+ * yield* TxPubSub.publish(hub, 42)
63
+ * const value = yield* TxQueue.take(sub)
64
+ * console.log(value) // 42
65
+ * })
66
+ * )
67
+ * })
68
+ * ```
69
+ *
70
+ * @since 4.0.0
71
+ * @category constructors
72
+ */
73
+ export const bounded = capacity => Effect.gen(function* () {
74
+ const subscribersRef = yield* TxRef.make([]);
75
+ const shutdownRef = yield* TxRef.make(false);
76
+ return makeTxPubSub(subscribersRef, shutdownRef, "bounded", capacity);
77
+ });
78
+ /**
79
+ * Creates a dropping TxPubSub with the specified capacity. When a subscriber's
80
+ * queue is full, the message is dropped for that subscriber.
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * import { Effect, TxPubSub, TxQueue } from "effect"
85
+ *
86
+ * const program = Effect.gen(function*() {
87
+ * const hub = yield* TxPubSub.dropping<number>(2)
88
+ *
89
+ * yield* Effect.scoped(
90
+ * Effect.gen(function*() {
91
+ * const sub = yield* TxPubSub.subscribe(hub)
92
+ * yield* TxPubSub.publish(hub, 1)
93
+ * yield* TxPubSub.publish(hub, 2)
94
+ * yield* TxPubSub.publish(hub, 3) // dropped
95
+ * const v1 = yield* TxQueue.take(sub)
96
+ * const v2 = yield* TxQueue.take(sub)
97
+ * console.log(v1, v2) // 1 2
98
+ * })
99
+ * )
100
+ * })
101
+ * ```
102
+ *
103
+ * @since 4.0.0
104
+ * @category constructors
105
+ */
106
+ export const dropping = capacity => Effect.gen(function* () {
107
+ const subscribersRef = yield* TxRef.make([]);
108
+ const shutdownRef = yield* TxRef.make(false);
109
+ return makeTxPubSub(subscribersRef, shutdownRef, "dropping", capacity);
110
+ });
111
+ /**
112
+ * Creates a sliding TxPubSub with the specified capacity. When a subscriber's
113
+ * queue is full, the oldest message in that subscriber's queue is dropped.
114
+ *
115
+ * @example
116
+ * ```ts
117
+ * import { Effect, TxPubSub, TxQueue } from "effect"
118
+ *
119
+ * const program = Effect.gen(function*() {
120
+ * const hub = yield* TxPubSub.sliding<number>(2)
121
+ *
122
+ * yield* Effect.scoped(
123
+ * Effect.gen(function*() {
124
+ * const sub = yield* TxPubSub.subscribe(hub)
125
+ * yield* TxPubSub.publish(hub, 1)
126
+ * yield* TxPubSub.publish(hub, 2)
127
+ * yield* TxPubSub.publish(hub, 3) // evicts 1
128
+ * const v1 = yield* TxQueue.take(sub)
129
+ * console.log(v1) // 2
130
+ * })
131
+ * )
132
+ * })
133
+ * ```
134
+ *
135
+ * @since 4.0.0
136
+ * @category constructors
137
+ */
138
+ export const sliding = capacity => Effect.gen(function* () {
139
+ const subscribersRef = yield* TxRef.make([]);
140
+ const shutdownRef = yield* TxRef.make(false);
141
+ return makeTxPubSub(subscribersRef, shutdownRef, "sliding", capacity);
142
+ });
143
+ /**
144
+ * Creates an unbounded TxPubSub with unlimited capacity. Messages are always accepted.
145
+ *
146
+ * @example
147
+ * ```ts
148
+ * import { Effect, TxPubSub, TxQueue } from "effect"
149
+ *
150
+ * const program = Effect.gen(function*() {
151
+ * const hub = yield* TxPubSub.unbounded<string>()
152
+ *
153
+ * yield* Effect.scoped(
154
+ * Effect.gen(function*() {
155
+ * const sub = yield* TxPubSub.subscribe(hub)
156
+ * yield* TxPubSub.publish(hub, "msg")
157
+ * const msg = yield* TxQueue.take(sub)
158
+ * console.log(msg) // "msg"
159
+ * })
160
+ * )
161
+ * })
162
+ * ```
163
+ *
164
+ * @since 4.0.0
165
+ * @category constructors
166
+ */
167
+ export const unbounded = () => Effect.gen(function* () {
168
+ const subscribersRef = yield* TxRef.make([]);
169
+ const shutdownRef = yield* TxRef.make(false);
170
+ return makeTxPubSub(subscribersRef, shutdownRef, "unbounded", Number.POSITIVE_INFINITY);
171
+ });
172
+ // =============================================================================
173
+ // Getters
174
+ // =============================================================================
175
+ /**
176
+ * Returns the capacity of the TxPubSub.
177
+ *
178
+ * @example
179
+ * ```ts
180
+ * import { Effect, TxPubSub } from "effect"
181
+ *
182
+ * const program = Effect.gen(function*() {
183
+ * const hub = yield* TxPubSub.bounded<number>(16)
184
+ * console.log(TxPubSub.capacity(hub)) // 16
185
+ * })
186
+ * ```
187
+ *
188
+ * @since 4.0.0
189
+ * @category getters
190
+ */
191
+ export const capacity = self => self.capacity;
192
+ /**
193
+ * Returns the current number of messages across all subscriber queues (the max).
194
+ *
195
+ * @example
196
+ * ```ts
197
+ * import { Effect, TxPubSub, TxQueue } from "effect"
198
+ *
199
+ * const program = Effect.gen(function*() {
200
+ * const hub = yield* TxPubSub.unbounded<number>()
201
+ *
202
+ * yield* Effect.scoped(
203
+ * Effect.gen(function*() {
204
+ * const sub = yield* TxPubSub.subscribe(hub)
205
+ * yield* TxPubSub.publish(hub, 1)
206
+ * yield* TxPubSub.publish(hub, 2)
207
+ * const s = yield* TxPubSub.size(hub)
208
+ * console.log(s) // 2
209
+ * })
210
+ * )
211
+ * })
212
+ * ```
213
+ *
214
+ * @since 4.0.0
215
+ * @category getters
216
+ */
217
+ export const size = self => Effect.gen(function* () {
218
+ const subscribers = yield* TxRef.get(self.subscribersRef);
219
+ let maxSize = 0;
220
+ for (const queue of subscribers) {
221
+ const s = yield* TxQueue.size(queue);
222
+ if (s > maxSize) maxSize = s;
223
+ }
224
+ return maxSize;
225
+ });
226
+ /**
227
+ * Checks if the TxPubSub has no pending messages (all subscriber queues are empty).
228
+ *
229
+ * @example
230
+ * ```ts
231
+ * import { Effect, TxPubSub } from "effect"
232
+ *
233
+ * const program = Effect.gen(function*() {
234
+ * const hub = yield* TxPubSub.unbounded<number>()
235
+ * const empty = yield* TxPubSub.isEmpty(hub)
236
+ * console.log(empty) // true
237
+ * })
238
+ * ```
239
+ *
240
+ * @since 4.0.0
241
+ * @category getters
242
+ */
243
+ export const isEmpty = self => Effect.map(size(self), s => s === 0);
244
+ /**
245
+ * Checks if any subscriber queue is at capacity.
246
+ *
247
+ * @example
248
+ * ```ts
249
+ * import { Effect, TxPubSub } from "effect"
250
+ *
251
+ * const program = Effect.gen(function*() {
252
+ * const hub = yield* TxPubSub.bounded<number>(2)
253
+ * const full = yield* TxPubSub.isFull(hub)
254
+ * console.log(full) // false
255
+ * })
256
+ * ```
257
+ *
258
+ * @since 4.0.0
259
+ * @category getters
260
+ */
261
+ export const isFull = self => Effect.gen(function* () {
262
+ if (self.capacity === Number.POSITIVE_INFINITY) return false;
263
+ const subscribers = yield* TxRef.get(self.subscribersRef);
264
+ for (const queue of subscribers) {
265
+ if (yield* TxQueue.isFull(queue)) return true;
266
+ }
267
+ return false;
268
+ });
269
+ /**
270
+ * Checks if the TxPubSub has been shut down.
271
+ *
272
+ * @example
273
+ * ```ts
274
+ * import { Effect, TxPubSub } from "effect"
275
+ *
276
+ * const program = Effect.gen(function*() {
277
+ * const hub = yield* TxPubSub.unbounded<number>()
278
+ * console.log(yield* TxPubSub.isShutdown(hub)) // false
279
+ * yield* TxPubSub.shutdown(hub)
280
+ * console.log(yield* TxPubSub.isShutdown(hub)) // true
281
+ * })
282
+ * ```
283
+ *
284
+ * @since 4.0.0
285
+ * @category getters
286
+ */
287
+ export const isShutdown = self => TxRef.get(self.shutdownRef);
288
+ // =============================================================================
289
+ // Mutations
290
+ // =============================================================================
291
+ /**
292
+ * Publishes a message to all current subscribers.
293
+ *
294
+ * Returns `true` if the message was delivered to all subscribers, or `false` if
295
+ * the hub is shut down or the message was dropped for any subscriber (dropping strategy).
296
+ *
297
+ * For bounded strategy, retries the transaction if any subscriber queue is full.
298
+ * For sliding strategy, drops oldest messages in full subscriber queues.
299
+ * For dropping strategy, drops the message for full subscriber queues and returns `false`.
300
+ *
301
+ * @example
302
+ * ```ts
303
+ * import { Effect, TxPubSub, TxQueue } from "effect"
304
+ *
305
+ * const program = Effect.gen(function*() {
306
+ * const hub = yield* TxPubSub.unbounded<string>()
307
+ *
308
+ * // No subscribers - publish is a no-op
309
+ * const r1 = yield* TxPubSub.publish(hub, "no one listening")
310
+ * console.log(r1) // true
311
+ *
312
+ * yield* Effect.scoped(
313
+ * Effect.gen(function*() {
314
+ * const sub = yield* TxPubSub.subscribe(hub)
315
+ * yield* TxPubSub.publish(hub, "hello")
316
+ * const msg = yield* TxQueue.take(sub)
317
+ * console.log(msg) // "hello"
318
+ * })
319
+ * )
320
+ * })
321
+ * ```
322
+ *
323
+ * @since 4.0.0
324
+ * @category mutations
325
+ */
326
+ export const publish = /*#__PURE__*/dual(2, (self, value) => Effect.gen(function* () {
327
+ if (yield* TxRef.get(self.shutdownRef)) return false;
328
+ const subscribers = yield* TxRef.get(self.subscribersRef);
329
+ let allAccepted = true;
330
+ for (const queue of subscribers) {
331
+ const accepted = yield* TxQueue.offer(queue, value);
332
+ if (!accepted) allAccepted = false;
333
+ }
334
+ return allAccepted;
335
+ }));
336
+ /**
337
+ * Publishes all messages from an iterable to all current subscribers.
338
+ *
339
+ * Returns `true` if all messages were delivered to all subscribers.
340
+ *
341
+ * @example
342
+ * ```ts
343
+ * import { Effect, TxPubSub, TxQueue } from "effect"
344
+ *
345
+ * const program = Effect.gen(function*() {
346
+ * const hub = yield* TxPubSub.unbounded<number>()
347
+ *
348
+ * yield* Effect.scoped(
349
+ * Effect.gen(function*() {
350
+ * const sub = yield* TxPubSub.subscribe(hub)
351
+ * yield* TxPubSub.publishAll(hub, [1, 2, 3])
352
+ * const v1 = yield* TxQueue.take(sub)
353
+ * const v2 = yield* TxQueue.take(sub)
354
+ * const v3 = yield* TxQueue.take(sub)
355
+ * console.log(v1, v2, v3) // 1 2 3
356
+ * })
357
+ * )
358
+ * })
359
+ * ```
360
+ *
361
+ * @since 4.0.0
362
+ * @category mutations
363
+ */
364
+ export const publishAll = /*#__PURE__*/dual(2, (self, values) => Effect.gen(function* () {
365
+ if (yield* TxRef.get(self.shutdownRef)) return false;
366
+ let allAccepted = true;
367
+ for (const value of values) {
368
+ const accepted = yield* publish(self, value);
369
+ if (!accepted) allAccepted = false;
370
+ }
371
+ return allAccepted;
372
+ }));
373
+ /**
374
+ * Subscribes to the TxPubSub, returning a TxQueue that receives all messages
375
+ * published after subscription. The subscription is automatically removed when
376
+ * the scope is closed.
377
+ *
378
+ * @example
379
+ * ```ts
380
+ * import { Effect, TxPubSub, TxQueue } from "effect"
381
+ *
382
+ * const program = Effect.gen(function*() {
383
+ * const hub = yield* TxPubSub.unbounded<string>()
384
+ *
385
+ * yield* Effect.scoped(
386
+ * Effect.gen(function*() {
387
+ * const sub1 = yield* TxPubSub.subscribe(hub)
388
+ * const sub2 = yield* TxPubSub.subscribe(hub)
389
+ *
390
+ * yield* TxPubSub.publish(hub, "broadcast")
391
+ *
392
+ * const msg1 = yield* TxQueue.take(sub1)
393
+ * const msg2 = yield* TxQueue.take(sub2)
394
+ * console.log(msg1, msg2) // "broadcast" "broadcast"
395
+ * })
396
+ * )
397
+ * })
398
+ * ```
399
+ *
400
+ * @since 4.0.0
401
+ * @category mutations
402
+ */
403
+ export const subscribe = self => Effect.acquireRelease(Effect.transaction(acquireSubscriber(self)), queue => Effect.transaction(releaseSubscriber(self, queue)));
404
+ /**
405
+ * Creates a subscriber queue and registers it with the pub/sub.
406
+ *
407
+ * This is the transactional acquire step of `subscribe`, exposed so that
408
+ * callers can compose it with other Tx operations in a single transaction
409
+ * (e.g. `TxSubscriptionRef.changes`).
410
+ *
411
+ * @since 4.0.0
412
+ * @category mutations
413
+ */
414
+ export const acquireSubscriber = self => Effect.gen(function* () {
415
+ const queue = yield* makeSubscriberQueue(self.strategy, self.capacity);
416
+ yield* TxRef.update(self.subscribersRef, subs => [...subs, queue]);
417
+ return queue;
418
+ });
419
+ /**
420
+ * Removes a subscriber queue from the pub/sub and shuts it down.
421
+ *
422
+ * This is the transactional release step of `subscribe`, exposed so that
423
+ * callers can compose it with other Tx operations in a single transaction.
424
+ *
425
+ * @since 4.0.0
426
+ * @category mutations
427
+ */
428
+ export const releaseSubscriber = /*#__PURE__*/dual(2, (self, queue) => Effect.gen(function* () {
429
+ yield* TxRef.update(self.subscribersRef, subs => subs.filter(q => q !== queue));
430
+ yield* TxQueue.shutdown(queue);
431
+ }));
432
+ const makeSubscriberQueue = (strategy, cap) => {
433
+ switch (strategy) {
434
+ case "bounded":
435
+ return TxQueue.bounded(cap);
436
+ case "dropping":
437
+ return TxQueue.dropping(cap);
438
+ case "sliding":
439
+ return TxQueue.sliding(cap);
440
+ case "unbounded":
441
+ return TxQueue.unbounded();
442
+ }
443
+ };
444
+ /**
445
+ * Shuts down the TxPubSub and all subscriber queues. Subsequent publish operations
446
+ * will return `false`. Subsequent subscribe operations will receive an already-shutdown queue.
447
+ *
448
+ * @example
449
+ * ```ts
450
+ * import { Effect, TxPubSub } from "effect"
451
+ *
452
+ * const program = Effect.gen(function*() {
453
+ * const hub = yield* TxPubSub.unbounded<number>()
454
+ * yield* TxPubSub.shutdown(hub)
455
+ *
456
+ * const shut = yield* TxPubSub.isShutdown(hub)
457
+ * console.log(shut) // true
458
+ *
459
+ * const accepted = yield* TxPubSub.publish(hub, 1)
460
+ * console.log(accepted) // false
461
+ * })
462
+ * ```
463
+ *
464
+ * @since 4.0.0
465
+ * @category mutations
466
+ */
467
+ export const shutdown = self => Effect.gen(function* () {
468
+ const alreadyShutdown = yield* TxRef.get(self.shutdownRef);
469
+ if (alreadyShutdown) return;
470
+ yield* TxRef.set(self.shutdownRef, true);
471
+ const subscribers = yield* TxRef.get(self.subscribersRef);
472
+ for (const queue of subscribers) {
473
+ yield* TxQueue.shutdown(queue);
474
+ }
475
+ });
476
+ /**
477
+ * Waits for the TxPubSub to be shut down.
478
+ *
479
+ * @example
480
+ * ```ts
481
+ * import { Effect, TxPubSub } from "effect"
482
+ *
483
+ * const program = Effect.gen(function*() {
484
+ * const hub = yield* TxPubSub.unbounded<number>()
485
+ *
486
+ * const fiber = yield* Effect.forkChild(TxPubSub.awaitShutdown(hub))
487
+ * yield* TxPubSub.shutdown(hub)
488
+ * yield* fiber.await
489
+ * })
490
+ * ```
491
+ *
492
+ * @since 4.0.0
493
+ * @category mutations
494
+ */
495
+ export const awaitShutdown = self => Effect.gen(function* () {
496
+ const shut = yield* TxRef.get(self.shutdownRef);
497
+ if (shut) return;
498
+ return yield* Effect.retryTransaction;
499
+ });
500
+ // =============================================================================
501
+ // Guards
502
+ // =============================================================================
503
+ /**
504
+ * Checks if the given value is a TxPubSub.
505
+ *
506
+ * @example
507
+ * ```ts
508
+ * import { TxPubSub } from "effect"
509
+ *
510
+ * declare const someValue: unknown
511
+ *
512
+ * if (TxPubSub.isTxPubSub(someValue)) {
513
+ * console.log("This is a TxPubSub")
514
+ * }
515
+ * ```
516
+ *
517
+ * @since 4.0.0
518
+ * @category guards
519
+ */
520
+ export const isTxPubSub = u => hasProperty(u, TypeId);
521
+ //# sourceMappingURL=TxPubSub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TxPubSub.js","names":["Effect","dual","NodeInspectSymbol","toJson","pipeArguments","hasProperty","TxQueue","TxRef","TypeId","TxPubSubProto","toJSON","_id","strategy","capacity","toString","pipe","arguments","makeTxPubSub","subscribersRef","shutdownRef","cap","self","Object","create","bounded","gen","make","dropping","sliding","unbounded","Number","POSITIVE_INFINITY","size","subscribers","get","maxSize","queue","s","isEmpty","map","isFull","isShutdown","publish","value","allAccepted","accepted","offer","publishAll","values","subscribe","acquireRelease","transaction","acquireSubscriber","releaseSubscriber","makeSubscriberQueue","update","subs","filter","q","shutdown","alreadyShutdown","set","awaitShutdown","shut","retryTransaction","isTxPubSub","u"],"sources":["../src/TxPubSub.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}