0.2.2 #31

Merged
Thilawyn merged 184 commits from next into master 2026-01-16 17:05:31 +01:00
Showing only changes of commit edf06b5f99 - Show all commits

View File

@@ -8,7 +8,7 @@ export type QueryClientServiceTypeId = typeof QueryClientServiceTypeId
export interface QueryClientService extends Pipeable.Pipeable {
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
}
@@ -16,11 +16,13 @@ export class QueryClient extends Effect.Service<QueryClient>()("@effect-fc/Query
scoped: Effect.suspend(() => service())
}) {}
export class QueryClientServiceImpl extends Pipeable.Class() implements QueryClientService {
export class QueryClientServiceImpl
extends Pipeable.Class()
implements QueryClientService {
readonly [QueryClientServiceTypeId]: QueryClientServiceTypeId = QueryClientServiceTypeId
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,
) {
super()
@@ -37,7 +39,7 @@ export declare namespace make {
export const make = Effect.fnUntraced(function* (options: make.Options = {}): Effect.fn.Return<QueryClientService> {
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",
)
})
@@ -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 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
constructor(readonly key: Query.Query.AnyKey) {}
constructor(readonly key: Query.Query.AnyKey) {
super()
}
[Equal.symbol](that: Equal.Equal) {
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 type QueryClientCacheEntryTypeId = typeof QueryClientCacheEntryTypeId
export interface QueryClientCacheEntry extends Pipeable.Pipeable {
readonly [QueryClientCacheEntryTypeId]: QueryClientCacheEntryTypeId
readonly at: DateTime.DateTime
readonly ttl: Duration.DurationInput
readonly result: Result.Final<unknown, unknown, unknown>
}
export class QueryClientCacheEntryImpl extends Pipeable.Class() implements QueryClientCacheEntry {
export class QueryClientCacheEntry
extends Pipeable.Class()
implements Pipeable.Pipeable {
readonly [QueryClientCacheEntryTypeId]: QueryClientCacheEntryTypeId = QueryClientCacheEntryTypeId
constructor(