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,504 @@
1
+ /**
2
+ * TxReentrantLock is a transactional read/write lock with reentrant semantics using Software
3
+ * Transactional Memory (STM). Multiple readers can hold the lock concurrently, OR a single
4
+ * writer can hold exclusive access. A fiber holding a write lock may acquire additional
5
+ * read or write locks (reentrancy).
6
+ *
7
+ * @since 4.0.0
8
+ */
9
+ import * as Effect from "./Effect.js";
10
+ import * as HashMap from "./HashMap.js";
11
+ import { NodeInspectSymbol, toJson } from "./Inspectable.js";
12
+ import * as Option from "./Option.js";
13
+ import { pipeArguments } from "./Pipeable.js";
14
+ import { hasProperty } from "./Predicate.js";
15
+ import * as TxRef from "./TxRef.js";
16
+ const TypeId = "~effect/transactions/TxReentrantLock";
17
+ const emptyState = {
18
+ readers: /*#__PURE__*/HashMap.empty(),
19
+ writer: /*#__PURE__*/Option.none()
20
+ };
21
+ const TxReentrantLockProto = {
22
+ [NodeInspectSymbol]() {
23
+ return toJson(this);
24
+ },
25
+ toJSON() {
26
+ return {
27
+ _id: "TxReentrantLock"
28
+ };
29
+ },
30
+ toString() {
31
+ return "TxReentrantLock";
32
+ },
33
+ pipe() {
34
+ return pipeArguments(this, arguments);
35
+ }
36
+ };
37
+ // =============================================================================
38
+ // Constructors
39
+ // =============================================================================
40
+ /**
41
+ * Creates a new TxReentrantLock.
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * import { Effect, TxReentrantLock } from "effect"
46
+ *
47
+ * const program = Effect.gen(function*() {
48
+ * const lock = yield* TxReentrantLock.make()
49
+ * const isLocked = yield* TxReentrantLock.locked(lock)
50
+ * console.log(isLocked) // false
51
+ * })
52
+ * ```
53
+ *
54
+ * @since 4.0.0
55
+ * @category constructors
56
+ */
57
+ export const make = () => Effect.gen(function* () {
58
+ const stateRef = yield* TxRef.make(emptyState);
59
+ const self = Object.create(TxReentrantLockProto);
60
+ self[TypeId] = TypeId;
61
+ self.stateRef = stateRef;
62
+ return self;
63
+ });
64
+ // =============================================================================
65
+ // Mutations
66
+ // =============================================================================
67
+ /**
68
+ * Acquires a read lock. Blocks if another fiber holds the write lock.
69
+ * If the current fiber already holds the write lock, the read lock is granted (reentrancy).
70
+ * Returns the current number of read locks held by this fiber.
71
+ *
72
+ * @example
73
+ * ```ts
74
+ * import { Effect, TxReentrantLock } from "effect"
75
+ *
76
+ * const program = Effect.gen(function*() {
77
+ * const lock = yield* TxReentrantLock.make()
78
+ * const count = yield* TxReentrantLock.acquireRead(lock)
79
+ * console.log(count) // 1
80
+ * yield* TxReentrantLock.releaseRead(lock)
81
+ * })
82
+ * ```
83
+ *
84
+ * @since 4.0.0
85
+ * @category mutations
86
+ */
87
+ export const acquireRead = self => Effect.withFiber(fiber => Effect.gen(function* () {
88
+ const state = yield* TxRef.get(self.stateRef);
89
+ const fiberId = fiber.id;
90
+ // If another fiber holds the write lock, retry
91
+ if (Option.isSome(state.writer) && state.writer.value[0] !== fiberId) {
92
+ return yield* Effect.retryTransaction;
93
+ }
94
+ // Grant read lock
95
+ const currentCount = Option.getOrElse(HashMap.get(state.readers, fiberId), () => 0);
96
+ const newCount = currentCount + 1;
97
+ yield* TxRef.set(self.stateRef, {
98
+ ...state,
99
+ readers: HashMap.set(state.readers, fiberId, newCount)
100
+ });
101
+ return newCount;
102
+ }));
103
+ /**
104
+ * Acquires a write lock. Blocks if any other fiber holds any lock.
105
+ * If the current fiber already holds the write lock, the count is incremented (reentrancy).
106
+ * If the current fiber holds a read lock, the write lock is granted (upgrade).
107
+ * Returns the current number of write locks held by this fiber.
108
+ *
109
+ * @example
110
+ * ```ts
111
+ * import { Effect, TxReentrantLock } from "effect"
112
+ *
113
+ * const program = Effect.gen(function*() {
114
+ * const lock = yield* TxReentrantLock.make()
115
+ * const count = yield* TxReentrantLock.acquireWrite(lock)
116
+ * console.log(count) // 1
117
+ * yield* TxReentrantLock.releaseWrite(lock)
118
+ * })
119
+ * ```
120
+ *
121
+ * @since 4.0.0
122
+ * @category mutations
123
+ */
124
+ export const acquireWrite = self => Effect.withFiber(fiber => Effect.gen(function* () {
125
+ const state = yield* TxRef.get(self.stateRef);
126
+ const fiberId = fiber.id;
127
+ // If another fiber holds the write lock, retry
128
+ if (Option.isSome(state.writer) && state.writer.value[0] !== fiberId) {
129
+ return yield* Effect.retryTransaction;
130
+ }
131
+ // If other fibers hold read locks, retry
132
+ for (const [readerId] of state.readers) {
133
+ if (readerId !== fiberId && Option.getOrElse(HashMap.get(state.readers, readerId), () => 0) > 0) {
134
+ return yield* Effect.retryTransaction;
135
+ }
136
+ }
137
+ // Grant write lock
138
+ if (Option.isSome(state.writer)) {
139
+ // Reentrant: increment write count
140
+ const newCount = state.writer.value[1] + 1;
141
+ yield* TxRef.set(self.stateRef, {
142
+ ...state,
143
+ writer: Option.some([fiberId, newCount])
144
+ });
145
+ return newCount;
146
+ }
147
+ // First write lock acquisition
148
+ yield* TxRef.set(self.stateRef, {
149
+ ...state,
150
+ writer: Option.some([fiberId, 1])
151
+ });
152
+ return 1;
153
+ }));
154
+ /**
155
+ * Releases a read lock held by the current fiber.
156
+ * Returns the remaining number of read locks held by this fiber.
157
+ *
158
+ * @example
159
+ * ```ts
160
+ * import { Effect, TxReentrantLock } from "effect"
161
+ *
162
+ * const program = Effect.gen(function*() {
163
+ * const lock = yield* TxReentrantLock.make()
164
+ * yield* TxReentrantLock.acquireRead(lock)
165
+ * const remaining = yield* TxReentrantLock.releaseRead(lock)
166
+ * console.log(remaining) // 0
167
+ * })
168
+ * ```
169
+ *
170
+ * @since 4.0.0
171
+ * @category mutations
172
+ */
173
+ export const releaseRead = self => Effect.withFiber(fiber => Effect.gen(function* () {
174
+ const state = yield* TxRef.get(self.stateRef);
175
+ const fiberId = fiber.id;
176
+ const currentCount = Option.getOrElse(HashMap.get(state.readers, fiberId), () => 0);
177
+ if (currentCount <= 0) return 0;
178
+ const newCount = currentCount - 1;
179
+ const newReaders = newCount === 0 ? HashMap.remove(state.readers, fiberId) : HashMap.set(state.readers, fiberId, newCount);
180
+ yield* TxRef.set(self.stateRef, {
181
+ ...state,
182
+ readers: newReaders
183
+ });
184
+ return newCount;
185
+ }));
186
+ /**
187
+ * Releases a write lock held by the current fiber.
188
+ * Returns the remaining number of write locks held by this fiber.
189
+ *
190
+ * @example
191
+ * ```ts
192
+ * import { Effect, TxReentrantLock } from "effect"
193
+ *
194
+ * const program = Effect.gen(function*() {
195
+ * const lock = yield* TxReentrantLock.make()
196
+ * yield* TxReentrantLock.acquireWrite(lock)
197
+ * const remaining = yield* TxReentrantLock.releaseWrite(lock)
198
+ * console.log(remaining) // 0
199
+ * })
200
+ * ```
201
+ *
202
+ * @since 4.0.0
203
+ * @category mutations
204
+ */
205
+ export const releaseWrite = self => Effect.withFiber(fiber => Effect.gen(function* () {
206
+ const state = yield* TxRef.get(self.stateRef);
207
+ const fiberId = fiber.id;
208
+ if (Option.isNone(state.writer) || state.writer.value[0] !== fiberId) return 0;
209
+ const newCount = state.writer.value[1] - 1;
210
+ const newWriter = newCount <= 0 ? Option.none() : Option.some([fiberId, newCount]);
211
+ yield* TxRef.set(self.stateRef, {
212
+ ...state,
213
+ writer: newWriter
214
+ });
215
+ return newCount;
216
+ }));
217
+ /**
218
+ * Acquires a read lock for the duration of the scope.
219
+ * The lock is automatically released when the scope closes.
220
+ *
221
+ * @example
222
+ * ```ts
223
+ * import { Effect, TxReentrantLock } from "effect"
224
+ *
225
+ * const program = Effect.gen(function*() {
226
+ * const lock = yield* TxReentrantLock.make()
227
+ *
228
+ * yield* Effect.scoped(
229
+ * Effect.gen(function*() {
230
+ * yield* TxReentrantLock.readLock(lock)
231
+ * // read lock is held for the duration of the scope
232
+ * })
233
+ * )
234
+ * // read lock is released
235
+ * })
236
+ * ```
237
+ *
238
+ * @since 4.0.0
239
+ * @category mutations
240
+ */
241
+ export const readLock = self => Effect.acquireRelease(Effect.transaction(acquireRead(self)), () => Effect.transaction(releaseRead(self)));
242
+ /**
243
+ * Acquires a write lock for the duration of the scope.
244
+ * The lock is automatically released when the scope closes.
245
+ *
246
+ * @example
247
+ * ```ts
248
+ * import { Effect, TxReentrantLock } from "effect"
249
+ *
250
+ * const program = Effect.gen(function*() {
251
+ * const lock = yield* TxReentrantLock.make()
252
+ *
253
+ * yield* Effect.scoped(
254
+ * Effect.gen(function*() {
255
+ * yield* TxReentrantLock.writeLock(lock)
256
+ * // write lock is held for the duration of the scope
257
+ * })
258
+ * )
259
+ * // write lock is released
260
+ * })
261
+ * ```
262
+ *
263
+ * @since 4.0.0
264
+ * @category mutations
265
+ */
266
+ export const writeLock = self => Effect.acquireRelease(Effect.transaction(acquireWrite(self)), () => Effect.transaction(releaseWrite(self)));
267
+ /**
268
+ * Alias for `writeLock`. Acquires a write lock for the duration of the scope.
269
+ *
270
+ * @example
271
+ * ```ts
272
+ * import { Effect, TxReentrantLock } from "effect"
273
+ *
274
+ * const program = Effect.gen(function*() {
275
+ * const lock = yield* TxReentrantLock.make()
276
+ *
277
+ * yield* Effect.scoped(
278
+ * Effect.gen(function*() {
279
+ * yield* TxReentrantLock.lock(lock)
280
+ * // exclusive lock is held
281
+ * })
282
+ * )
283
+ * })
284
+ * ```
285
+ *
286
+ * @since 4.0.0
287
+ * @category mutations
288
+ */
289
+ export const lock = writeLock;
290
+ /**
291
+ * Runs the provided effect while holding a read lock. The lock is automatically
292
+ * released after the effect completes, fails, or is interrupted.
293
+ *
294
+ * @example
295
+ * ```ts
296
+ * import { Effect, TxReentrantLock } from "effect"
297
+ *
298
+ * const program = Effect.gen(function*() {
299
+ * const lock = yield* TxReentrantLock.make()
300
+ * const result = yield* TxReentrantLock.withReadLock(
301
+ * lock,
302
+ * Effect.succeed("read data")
303
+ * )
304
+ * console.log(result) // "read data"
305
+ * })
306
+ * ```
307
+ *
308
+ * @since 4.0.0
309
+ * @category mutations
310
+ */
311
+ export const withReadLock = (...args) => {
312
+ if (args.length === 1) {
313
+ const [effect] = args;
314
+ return self => Effect.acquireUseRelease(Effect.transaction(acquireRead(self)), () => effect, () => Effect.transaction(releaseRead(self)));
315
+ }
316
+ const [self, effect] = args;
317
+ return Effect.acquireUseRelease(Effect.transaction(acquireRead(self)), () => effect, () => Effect.transaction(releaseRead(self)));
318
+ };
319
+ /**
320
+ * Runs the provided effect while holding a write lock. The lock is automatically
321
+ * released after the effect completes, fails, or is interrupted.
322
+ *
323
+ * @example
324
+ * ```ts
325
+ * import { Effect, TxReentrantLock } from "effect"
326
+ *
327
+ * const program = Effect.gen(function*() {
328
+ * const lock = yield* TxReentrantLock.make()
329
+ * const result = yield* TxReentrantLock.withWriteLock(
330
+ * lock,
331
+ * Effect.succeed("wrote data")
332
+ * )
333
+ * console.log(result) // "wrote data"
334
+ * })
335
+ * ```
336
+ *
337
+ * @since 4.0.0
338
+ * @category mutations
339
+ */
340
+ export const withWriteLock = (...args) => {
341
+ if (args.length === 1) {
342
+ const [effect] = args;
343
+ return self => Effect.acquireUseRelease(Effect.transaction(acquireWrite(self)), () => effect, () => Effect.transaction(releaseWrite(self)));
344
+ }
345
+ const [self, effect] = args;
346
+ return Effect.acquireUseRelease(Effect.transaction(acquireWrite(self)), () => effect, () => Effect.transaction(releaseWrite(self)));
347
+ };
348
+ /**
349
+ * Alias for `withWriteLock`. Runs the provided effect while holding a write lock.
350
+ *
351
+ * @example
352
+ * ```ts
353
+ * import { Effect, TxReentrantLock } from "effect"
354
+ *
355
+ * const program = Effect.gen(function*() {
356
+ * const lock = yield* TxReentrantLock.make()
357
+ * const result = yield* TxReentrantLock.withLock(
358
+ * lock,
359
+ * Effect.succeed("exclusive operation")
360
+ * )
361
+ * console.log(result) // "exclusive operation"
362
+ * })
363
+ * ```
364
+ *
365
+ * @since 4.0.0
366
+ * @category mutations
367
+ */
368
+ export const withLock = withWriteLock;
369
+ // =============================================================================
370
+ // Getters
371
+ // =============================================================================
372
+ /**
373
+ * Returns the total number of read locks held across all fibers.
374
+ *
375
+ * @example
376
+ * ```ts
377
+ * import { Effect, TxReentrantLock } from "effect"
378
+ *
379
+ * const program = Effect.gen(function*() {
380
+ * const lock = yield* TxReentrantLock.make()
381
+ * yield* TxReentrantLock.acquireRead(lock)
382
+ * const count = yield* TxReentrantLock.readLocks(lock)
383
+ * console.log(count) // 1
384
+ * yield* TxReentrantLock.releaseRead(lock)
385
+ * })
386
+ * ```
387
+ *
388
+ * @since 4.0.0
389
+ * @category getters
390
+ */
391
+ export const readLocks = self => Effect.gen(function* () {
392
+ const state = yield* TxRef.get(self.stateRef);
393
+ let total = 0;
394
+ for (const [, count] of state.readers) {
395
+ total += count;
396
+ }
397
+ return total;
398
+ });
399
+ /**
400
+ * Returns the number of write locks held (0 or the reentrant count).
401
+ *
402
+ * @example
403
+ * ```ts
404
+ * import { Effect, TxReentrantLock } from "effect"
405
+ *
406
+ * const program = Effect.gen(function*() {
407
+ * const lock = yield* TxReentrantLock.make()
408
+ * const count = yield* TxReentrantLock.writeLocks(lock)
409
+ * console.log(count) // 0
410
+ * })
411
+ * ```
412
+ *
413
+ * @since 4.0.0
414
+ * @category getters
415
+ */
416
+ export const writeLocks = self => Effect.gen(function* () {
417
+ const state = yield* TxRef.get(self.stateRef);
418
+ return Option.isSome(state.writer) ? state.writer.value[1] : 0;
419
+ });
420
+ /**
421
+ * Checks if the lock is held by any fiber (read or write).
422
+ *
423
+ * @example
424
+ * ```ts
425
+ * import { Effect, TxReentrantLock } from "effect"
426
+ *
427
+ * const program = Effect.gen(function*() {
428
+ * const lock = yield* TxReentrantLock.make()
429
+ * const isLocked = yield* TxReentrantLock.locked(lock)
430
+ * console.log(isLocked) // false
431
+ * })
432
+ * ```
433
+ *
434
+ * @since 4.0.0
435
+ * @category getters
436
+ */
437
+ export const locked = self => Effect.gen(function* () {
438
+ const state = yield* TxRef.get(self.stateRef);
439
+ return HashMap.size(state.readers) > 0 || Option.isSome(state.writer);
440
+ });
441
+ /**
442
+ * Checks if any fiber holds a read lock.
443
+ *
444
+ * @example
445
+ * ```ts
446
+ * import { Effect, TxReentrantLock } from "effect"
447
+ *
448
+ * const program = Effect.gen(function*() {
449
+ * const lock = yield* TxReentrantLock.make()
450
+ * const isReadLocked = yield* TxReentrantLock.readLocked(lock)
451
+ * console.log(isReadLocked) // false
452
+ * })
453
+ * ```
454
+ *
455
+ * @since 4.0.0
456
+ * @category getters
457
+ */
458
+ export const readLocked = self => Effect.gen(function* () {
459
+ const state = yield* TxRef.get(self.stateRef);
460
+ return HashMap.size(state.readers) > 0;
461
+ });
462
+ /**
463
+ * Checks if any fiber holds a write lock.
464
+ *
465
+ * @example
466
+ * ```ts
467
+ * import { Effect, TxReentrantLock } from "effect"
468
+ *
469
+ * const program = Effect.gen(function*() {
470
+ * const lock = yield* TxReentrantLock.make()
471
+ * const isWriteLocked = yield* TxReentrantLock.writeLocked(lock)
472
+ * console.log(isWriteLocked) // false
473
+ * })
474
+ * ```
475
+ *
476
+ * @since 4.0.0
477
+ * @category getters
478
+ */
479
+ export const writeLocked = self => Effect.gen(function* () {
480
+ const state = yield* TxRef.get(self.stateRef);
481
+ return Option.isSome(state.writer);
482
+ });
483
+ // =============================================================================
484
+ // Guards
485
+ // =============================================================================
486
+ /**
487
+ * Checks if the given value is a TxReentrantLock.
488
+ *
489
+ * @example
490
+ * ```ts
491
+ * import { TxReentrantLock } from "effect"
492
+ *
493
+ * declare const someValue: unknown
494
+ *
495
+ * if (TxReentrantLock.isTxReentrantLock(someValue)) {
496
+ * console.log("This is a TxReentrantLock")
497
+ * }
498
+ * ```
499
+ *
500
+ * @since 4.0.0
501
+ * @category guards
502
+ */
503
+ export const isTxReentrantLock = u => hasProperty(u, TypeId);
504
+ //# sourceMappingURL=TxReentrantLock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TxReentrantLock.js","names":["Effect","HashMap","NodeInspectSymbol","toJson","Option","pipeArguments","hasProperty","TxRef","TypeId","emptyState","readers","empty","writer","none","TxReentrantLockProto","toJSON","_id","toString","pipe","arguments","make","gen","stateRef","self","Object","create","acquireRead","withFiber","fiber","state","get","fiberId","id","isSome","value","retryTransaction","currentCount","getOrElse","newCount","set","acquireWrite","readerId","some","releaseRead","newReaders","remove","releaseWrite","isNone","newWriter","readLock","acquireRelease","transaction","writeLock","lock","withReadLock","args","length","effect","acquireUseRelease","withWriteLock","withLock","readLocks","total","count","writeLocks","locked","size","readLocked","writeLocked","isTxReentrantLock","u"],"sources":["../src/TxReentrantLock.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}