personal web client for Bluesky
typescript
solidjs
bluesky
atcute
1import { type QueryClient, type QueryFilters, matchQuery } from '@mary/solid-query';
2
3export interface CacheMatcher<T> {
4 filter: QueryFilters | QueryFilters[];
5 iterate: (data: any) => Generator<T>;
6}
7
8export function* iterateQueryCache<T>(queryClient: QueryClient, matchers: CacheMatcher<T>[]): Generator<T> {
9 const queries = queryClient.getQueryCache().getAll();
10 queries.sort((a, b) => b.state.dataUpdatedAt - a.state.dataUpdatedAt);
11
12 for (let i = 0, ilen = queries.length; i < ilen; i++) {
13 const query = queries[i];
14 const data = query.state.data;
15
16 if (data === undefined) {
17 continue;
18 }
19
20 for (let j = 0, jlen = matchers.length; j < jlen; j++) {
21 const matcher = matchers[j];
22 const filter = matcher.filter;
23
24 if (Array.isArray(filter) ? filter.some((f) => matchQuery(f, query)) : matchQuery(filter, query)) {
25 yield* matcher.iterate(data);
26 }
27 }
28 }
29}