()
| 315 | } |
| 316 | |
| 317 | get shutdown(): Effect<void> { |
| 318 | return core.suspend(() => { |
| 319 | if (this.isShuttingDown) return core.void |
| 320 | this.isShuttingDown = true |
| 321 | const size = this.items.size |
| 322 | const semaphore = circular.unsafeMakeSemaphore(size) |
| 323 | return core.forEachSequentialDiscard(this.items, (item) => { |
| 324 | if (item.refCount > 0) { |
| 325 | item.finalizer = core.zipLeft(item.finalizer, semaphore.release(1)) |
| 326 | this.invalidated.add(item) |
| 327 | return semaphore.take(1) |
| 328 | } |
| 329 | this.items.delete(item) |
| 330 | this.available.delete(item) |
| 331 | this.invalidated.delete(item) |
| 332 | return item.finalizer |
| 333 | }).pipe( |
| 334 | core.zipRight(this.semaphore.releaseAll), |
| 335 | core.zipRight(this.availableLatch.open), |
| 336 | core.zipRight(semaphore.take(size)) |
| 337 | ) |
| 338 | }) |
| 339 | } |
| 340 | |
| 341 | pipe() { |
| 342 | return pipeArguments(this, arguments) |
no test coverage detected