(key: Key)
| 448 | } |
| 449 | |
| 450 | refresh(key: Key): Effect.Effect<void, Error> { |
| 451 | return effect.clockWith((clock) => |
| 452 | core.suspend(() => { |
| 453 | const k = key |
| 454 | const deferred: Deferred.Deferred<Value, Error> = Deferred.unsafeMake(this.fiberId) |
| 455 | let value = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k)) |
| 456 | if (value === undefined) { |
| 457 | if (MutableHashMap.has(this.cacheState.map, k)) { |
| 458 | value = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k)) |
| 459 | } else { |
| 460 | MutableHashMap.set(this.cacheState.map, k, pending(makeMapKey(k), deferred)) |
| 461 | } |
| 462 | } |
| 463 | if (value === undefined) { |
| 464 | return core.asVoid(this.lookupValueOf(key, deferred)) |
| 465 | } else { |
| 466 | switch (value._tag) { |
| 467 | case "Complete": { |
| 468 | if (this.hasExpired(clock, value.timeToLiveMillis)) { |
| 469 | const found = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k)) |
| 470 | if (Equal.equals(found, value)) { |
| 471 | MutableHashMap.remove(this.cacheState.map, k) |
| 472 | } |
| 473 | return core.asVoid(this.get(key)) |
| 474 | } |
| 475 | // Only trigger the lookup if we're still the current value, `completedResult` |
| 476 | return pipe( |
| 477 | this.lookupValueOf(key, deferred), |
| 478 | effect.when(() => { |
| 479 | const current = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k)) |
| 480 | if (Equal.equals(current, value)) { |
| 481 | const mapValue = refreshing(deferred, value as Complete<Key, Value, Error>) |
| 482 | MutableHashMap.set(this.cacheState.map, k, mapValue) |
| 483 | return true |
| 484 | } |
| 485 | return false |
| 486 | }), |
| 487 | core.asVoid |
| 488 | ) |
| 489 | } |
| 490 | case "Pending": { |
| 491 | return Deferred.await(value.deferred) |
| 492 | } |
| 493 | case "Refreshing": { |
| 494 | return Deferred.await(value.deferred) |
| 495 | } |
| 496 | } |
| 497 | } |
| 498 | }) |
| 499 | ) |
| 500 | } |
| 501 | |
| 502 | set(key: Key, value: Value): Effect.Effect<void> { |
| 503 | return effect.clockWith((clock) => |
nothing calls this directly
no test coverage detected