| 108 | ): Effect.Effect<A, E, R> => Effect.tap(effect, invalidate(keys)) |
| 109 | |
| 110 | const registerUnsafe = ( |
| 111 | keys: ReadonlyArray<unknown> | ReadonlyRecord<string, ReadonlyArray<unknown>>, |
| 112 | handler: () => void |
| 113 | ): () => void => { |
| 114 | const resolvedKeys: Array<string | number> = [] |
| 115 | keysToHashes(keys, (hash) => { |
| 116 | resolvedKeys.push(hash) |
| 117 | let set = handlers.get(hash) |
| 118 | if (set === undefined) { |
| 119 | set = new Set() |
| 120 | handlers.set(hash, set) |
| 121 | } |
| 122 | set.add(handler) |
| 123 | }) |
| 124 | return () => { |
| 125 | for (let i = 0; i < resolvedKeys.length; i++) { |
| 126 | const set = handlers.get(resolvedKeys[i])! |
| 127 | set.delete(handler) |
| 128 | if (set.size === 0) { |
| 129 | handlers.delete(resolvedKeys[i]) |
| 130 | } |
| 131 | } |
| 132 | } |
| 133 | } |
| 134 | |
| 135 | const query = <A, E, R>( |
| 136 | keys: ReadonlyArray<unknown> | ReadonlyRecord<string, ReadonlyArray<unknown>>, |