QueryClient work
All checks were successful
Lint / lint (push) Successful in 13s

This commit is contained in:
Julien Valverdé
2025-12-11 21:28:44 +01:00
parent cb5e3a84ae
commit edf06b5f99

View File

@@ -8,7 +8,7 @@ export type QueryClientServiceTypeId = typeof QueryClientServiceTypeId
export interface QueryClientService extends Pipeable.Pipeable { export interface QueryClientService extends Pipeable.Pipeable {
readonly [QueryClientServiceTypeId]: QueryClientServiceTypeId readonly [QueryClientServiceTypeId]: QueryClientServiceTypeId
readonly cache: Ref.Ref<HashMap.HashMap<Query.Query.AnyKey, Result.Final<unknown, unknown, unknown>>> readonly cache: Ref.Ref<HashMap.HashMap<QueryClientCacheKey, QueryClientCacheEntry>>
readonly defaultTtl: Duration.DurationInput readonly defaultTtl: Duration.DurationInput
} }
@@ -16,11 +16,13 @@ export class QueryClient extends Effect.Service<QueryClient>()("@effect-fc/Query
scoped: Effect.suspend(() => service()) scoped: Effect.suspend(() => service())
}) {} }) {}
export class QueryClientServiceImpl extends Pipeable.Class() implements QueryClientService { export class QueryClientServiceImpl
extends Pipeable.Class()
implements QueryClientService {
readonly [QueryClientServiceTypeId]: QueryClientServiceTypeId = QueryClientServiceTypeId readonly [QueryClientServiceTypeId]: QueryClientServiceTypeId = QueryClientServiceTypeId
constructor( constructor(
readonly cache: Ref.Ref<HashMap.HashMap<Query.Query.AnyKey, Result.Final<unknown, unknown, unknown>>>, readonly cache: Ref.Ref<HashMap.HashMap<QueryClientCacheKey, QueryClientCacheEntry>>,
readonly defaultTtl: Duration.DurationInput, readonly defaultTtl: Duration.DurationInput,
) { ) {
super() super()
@@ -37,7 +39,7 @@ export declare namespace make {
export const make = Effect.fnUntraced(function* (options: make.Options = {}): Effect.fn.Return<QueryClientService> { export const make = Effect.fnUntraced(function* (options: make.Options = {}): Effect.fn.Return<QueryClientService> {
return new QueryClientServiceImpl( return new QueryClientServiceImpl(
yield* Ref.make(HashMap.empty<Query.Query.AnyKey, Result.Final<unknown, unknown, unknown>>()), yield* Ref.make(HashMap.empty<QueryClientCacheKey, QueryClientCacheEntry>()),
options.defaultTtl ?? "5 minutes", options.defaultTtl ?? "5 minutes",
) )
}) })
@@ -57,9 +59,13 @@ export const service = (options?: service.Options): Effect.Effect<QueryClientSer
export const QueryClientCacheKeyTypeId: unique symbol = Symbol.for("@effect-fc/QueryClient/QueryClientCacheKey") export const QueryClientCacheKeyTypeId: unique symbol = Symbol.for("@effect-fc/QueryClient/QueryClientCacheKey")
export type QueryClientCacheKeyTypeId = typeof QueryClientCacheKeyTypeId export type QueryClientCacheKeyTypeId = typeof QueryClientCacheKeyTypeId
export class QueryClientCacheKey implements Equal.Equal { export class QueryClientCacheKey
extends Pipeable.Class()
implements Pipeable.Pipeable, Equal.Equal {
readonly [QueryClientCacheKeyTypeId]: QueryClientCacheKeyTypeId = QueryClientCacheKeyTypeId readonly [QueryClientCacheKeyTypeId]: QueryClientCacheKeyTypeId = QueryClientCacheKeyTypeId
constructor(readonly key: Query.Query.AnyKey) {} constructor(readonly key: Query.Query.AnyKey) {
super()
}
[Equal.symbol](that: Equal.Equal) { [Equal.symbol](that: Equal.Equal) {
return isQueryClientCacheKey(that) && Equivalence.array(Equal.equivalence())(this.key, that.key) return isQueryClientCacheKey(that) && Equivalence.array(Equal.equivalence())(this.key, that.key)
@@ -75,14 +81,9 @@ export const isQueryClientCacheKey = (u: unknown): u is QueryClientCacheKey => P
export const QueryClientCacheEntryTypeId: unique symbol = Symbol.for("@effect-fc/QueryClient/QueryClientCacheEntry") export const QueryClientCacheEntryTypeId: unique symbol = Symbol.for("@effect-fc/QueryClient/QueryClientCacheEntry")
export type QueryClientCacheEntryTypeId = typeof QueryClientCacheEntryTypeId export type QueryClientCacheEntryTypeId = typeof QueryClientCacheEntryTypeId
export interface QueryClientCacheEntry extends Pipeable.Pipeable { export class QueryClientCacheEntry
readonly [QueryClientCacheEntryTypeId]: QueryClientCacheEntryTypeId extends Pipeable.Class()
readonly at: DateTime.DateTime implements Pipeable.Pipeable {
readonly ttl: Duration.DurationInput
readonly result: Result.Final<unknown, unknown, unknown>
}
export class QueryClientCacheEntryImpl extends Pipeable.Class() implements QueryClientCacheEntry {
readonly [QueryClientCacheEntryTypeId]: QueryClientCacheEntryTypeId = QueryClientCacheEntryTypeId readonly [QueryClientCacheEntryTypeId]: QueryClientCacheEntryTypeId = QueryClientCacheEntryTypeId
constructor( constructor(