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.
- package/dist/Array.d.ts +127 -299
- package/dist/Array.d.ts.map +1 -1
- package/dist/Array.js +102 -62
- package/dist/Array.js.map +1 -1
- package/dist/Cache.d.ts.map +1 -1
- package/dist/Cache.js +5 -4
- package/dist/Cache.js.map +1 -1
- package/dist/Channel.d.ts +97 -11
- package/dist/Channel.d.ts.map +1 -1
- package/dist/Channel.js +72 -29
- package/dist/Channel.js.map +1 -1
- package/dist/Chunk.d.ts +54 -247
- package/dist/Chunk.d.ts.map +1 -1
- package/dist/Chunk.js +36 -67
- package/dist/Chunk.js.map +1 -1
- package/dist/Effect.d.ts +337 -437
- package/dist/Effect.d.ts.map +1 -1
- package/dist/Effect.js +118 -134
- package/dist/Effect.js.map +1 -1
- package/dist/Filter.d.ts +0 -33
- package/dist/Filter.d.ts.map +1 -1
- package/dist/Filter.js +0 -13
- package/dist/Filter.js.map +1 -1
- package/dist/HashMap.d.ts +15 -14
- package/dist/HashMap.d.ts.map +1 -1
- package/dist/HashMap.js +4 -4
- package/dist/HashMap.js.map +1 -1
- package/dist/Iterable.d.ts +40 -39
- package/dist/Iterable.d.ts.map +1 -1
- package/dist/Iterable.js +94 -22
- package/dist/Iterable.js.map +1 -1
- package/dist/Option.d.ts +22 -15
- package/dist/Option.d.ts.map +1 -1
- package/dist/Option.js +14 -7
- package/dist/Option.js.map +1 -1
- package/dist/Pull.d.ts.map +1 -1
- package/dist/Pull.js +1 -1
- package/dist/Pull.js.map +1 -1
- package/dist/Record.d.ts +24 -120
- package/dist/Record.d.ts.map +1 -1
- package/dist/Record.js +21 -41
- package/dist/Record.js.map +1 -1
- package/dist/Sink.d.ts +11 -11
- package/dist/Sink.d.ts.map +1 -1
- package/dist/Sink.js +53 -6
- package/dist/Sink.js.map +1 -1
- package/dist/Stream.d.ts +198 -386
- package/dist/Stream.d.ts.map +1 -1
- package/dist/Stream.js +103 -59
- package/dist/Stream.js.map +1 -1
- package/dist/Trie.d.ts +18 -17
- package/dist/Trie.d.ts.map +1 -1
- package/dist/Trie.js +5 -5
- package/dist/Trie.js.map +1 -1
- package/dist/TxChunk.d.ts +37 -37
- package/dist/TxChunk.d.ts.map +1 -1
- package/dist/TxChunk.js +3 -3
- package/dist/TxChunk.js.map +1 -1
- package/dist/TxDeferred.d.ts +328 -0
- package/dist/TxDeferred.d.ts.map +1 -0
- package/dist/TxDeferred.js +196 -0
- package/dist/TxDeferred.js.map +1 -0
- package/dist/TxHashMap.d.ts +84 -83
- package/dist/TxHashMap.d.ts.map +1 -1
- package/dist/TxHashMap.js +24 -24
- package/dist/TxHashMap.js.map +1 -1
- package/dist/TxHashSet.d.ts +35 -35
- package/dist/TxHashSet.d.ts.map +1 -1
- package/dist/TxHashSet.js +14 -14
- package/dist/TxHashSet.js.map +1 -1
- package/dist/TxPriorityQueue.d.ts +609 -0
- package/dist/TxPriorityQueue.d.ts.map +1 -0
- package/dist/TxPriorityQueue.js +415 -0
- package/dist/TxPriorityQueue.js.map +1 -0
- package/dist/TxPubSub.d.ts +585 -0
- package/dist/TxPubSub.d.ts.map +1 -0
- package/dist/TxPubSub.js +521 -0
- package/dist/TxPubSub.js.map +1 -0
- package/dist/TxQueue.d.ts +32 -32
- package/dist/TxQueue.d.ts.map +1 -1
- package/dist/TxQueue.js +26 -26
- package/dist/TxQueue.js.map +1 -1
- package/dist/TxReentrantLock.d.ts +523 -0
- package/dist/TxReentrantLock.d.ts.map +1 -0
- package/dist/TxReentrantLock.js +504 -0
- package/dist/TxReentrantLock.js.map +1 -0
- package/dist/TxRef.d.ts +34 -34
- package/dist/TxRef.d.ts.map +1 -1
- package/dist/TxRef.js +21 -14
- package/dist/TxRef.js.map +1 -1
- package/dist/TxSemaphore.d.ts +8 -8
- package/dist/TxSemaphore.d.ts.map +1 -1
- package/dist/TxSemaphore.js +7 -7
- package/dist/TxSemaphore.js.map +1 -1
- package/dist/TxSubscriptionRef.d.ts +508 -0
- package/dist/TxSubscriptionRef.d.ts.map +1 -0
- package/dist/TxSubscriptionRef.js +293 -0
- package/dist/TxSubscriptionRef.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/effect.js +99 -42
- package/dist/internal/effect.js.map +1 -1
- package/dist/internal/hashMap.js +3 -2
- package/dist/internal/hashMap.js.map +1 -1
- package/dist/internal/trie.js +5 -4
- package/dist/internal/trie.js.map +1 -1
- package/dist/unstable/ai/Tool.d.ts.map +1 -1
- package/dist/unstable/ai/Tool.js +0 -9
- package/dist/unstable/ai/Tool.js.map +1 -1
- package/dist/unstable/cli/Command.d.ts +1 -1
- package/dist/unstable/cli/Command.d.ts.map +1 -1
- package/dist/unstable/cli/Command.js +1 -1
- package/dist/unstable/cli/Command.js.map +1 -1
- package/dist/unstable/cluster/K8sHttpClient.js +4 -4
- package/dist/unstable/cluster/K8sHttpClient.js.map +1 -1
- package/dist/unstable/cluster/Sharding.js +1 -1
- package/dist/unstable/cluster/Sharding.js.map +1 -1
- package/dist/unstable/encoding/Sse.js +1 -1
- package/dist/unstable/encoding/Sse.js.map +1 -1
- package/dist/unstable/rpc/RpcServer.d.ts.map +1 -1
- package/dist/unstable/rpc/RpcServer.js +1 -2
- package/dist/unstable/rpc/RpcServer.js.map +1 -1
- package/dist/unstable/socket/Socket.d.ts.map +1 -1
- package/dist/unstable/socket/Socket.js +3 -3
- package/dist/unstable/socket/Socket.js.map +1 -1
- package/package.json +1 -1
- package/src/Array.ts +190 -342
- package/src/Cache.ts +6 -5
- package/src/Channel.ts +506 -102
- package/src/Chunk.ts +81 -268
- package/src/Effect.ts +437 -518
- package/src/Filter.ts +0 -57
- package/src/HashMap.ts +15 -14
- package/src/Iterable.ts +105 -50
- package/src/Option.ts +30 -20
- package/src/Pull.ts +1 -1
- package/src/Record.ts +43 -152
- package/src/Sink.ts +75 -23
- package/src/Stream.ts +442 -502
- package/src/Trie.ts +18 -17
- package/src/TxChunk.ts +72 -53
- package/src/TxDeferred.ts +394 -0
- package/src/TxHashMap.ts +332 -285
- package/src/TxHashSet.ts +111 -116
- package/src/TxPriorityQueue.ts +767 -0
- package/src/TxPubSub.ts +789 -0
- package/src/TxQueue.ts +241 -251
- package/src/TxReentrantLock.ts +753 -0
- package/src/TxRef.ts +50 -38
- package/src/TxSemaphore.ts +29 -32
- package/src/TxSubscriptionRef.ts +639 -0
- package/src/index.ts +45 -0
- package/src/internal/effect.ts +368 -163
- package/src/internal/hashMap.ts +7 -5
- package/src/internal/trie.ts +16 -9
- package/src/unstable/ai/Tool.ts +0 -9
- package/src/unstable/cli/Command.ts +6 -4
- package/src/unstable/cluster/K8sHttpClient.ts +4 -4
- package/src/unstable/cluster/Sharding.ts +1 -1
- package/src/unstable/encoding/Sse.ts +1 -1
- package/src/unstable/rpc/RpcServer.ts +1 -7
- 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":[]}
|