(key: Key)
| 392 | } |
| 393 | |
| 394 | getEither(key: Key): Effect.Effect<Either.Either<Value, Value>, Error> { |
| 395 | return core.suspend((): Effect.Effect<Either.Either<Value, Value>, Error> => { |
| 396 | const k = key |
| 397 | let mapKey: MapKey<Key> | undefined = undefined |
| 398 | let deferred: Deferred.Deferred<Value, Error> | undefined = undefined |
| 399 | let value = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k)) |
| 400 | if (value === undefined) { |
| 401 | deferred = Deferred.unsafeMake<Value, Error>(this.fiberId) |
| 402 | mapKey = makeMapKey(k) |
| 403 | if (MutableHashMap.has(this.cacheState.map, k)) { |
| 404 | value = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k)) |
| 405 | } else { |
| 406 | MutableHashMap.set(this.cacheState.map, k, pending(mapKey, deferred)) |
| 407 | } |
| 408 | } |
| 409 | if (value === undefined) { |
| 410 | this.trackAccess(mapKey!) |
| 411 | this.trackMiss() |
| 412 | return core.map(this.lookupValueOf(key, deferred!), Either.right) |
| 413 | } else { |
| 414 | return core.flatMap( |
| 415 | this.resolveMapValue(value), |
| 416 | Option.match({ |
| 417 | onNone: () => this.getEither(key), |
| 418 | onSome: (value) => core.succeed(Either.left(value)) |
| 419 | }) |
| 420 | ) |
| 421 | } |
| 422 | }) |
| 423 | } |
| 424 | |
| 425 | invalidate(key: Key): Effect.Effect<void> { |
| 426 | return core.sync(() => { |
no test coverage detected