0.1.11 #14
@@ -6,6 +6,7 @@ import { ParseResult, Schema } from "effect"
|
|||||||
export const Result = Schema.Array(Schema.String)
|
export const Result = Schema.Array(Schema.String)
|
||||||
|
|
||||||
export class Uuid4Query extends QueryService.Tag("Uuid4Query")<Uuid4Query,
|
export class Uuid4Query extends QueryService.Tag("Uuid4Query")<Uuid4Query,
|
||||||
|
readonly ["uuid4", number],
|
||||||
typeof Result.Type,
|
typeof Result.Type,
|
||||||
HttpClientError.HttpClientError | ParseResult.ParseError
|
HttpClientError.HttpClientError | ParseResult.ParseError
|
||||||
>() {}
|
>() {}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ export const Route = createFileRoute("/query/service")({
|
|||||||
|
|
||||||
function RouteComponent() {
|
function RouteComponent() {
|
||||||
const query = R.useQuery({
|
const query = R.useQuery({
|
||||||
key: R.useStreamFromValues(["uuid4", 10]),
|
key: R.useStreamFromValues(["uuid4", 10 as number]),
|
||||||
query: ([, count]) => Console.log(`Querying ${ count } IDs...`).pipe(
|
query: ([, count]) => Console.log(`Querying ${ count } IDs...`).pipe(
|
||||||
Effect.andThen(Effect.sleep("500 millis")),
|
Effect.andThen(Effect.sleep("500 millis")),
|
||||||
Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)),
|
Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)),
|
||||||
|
|||||||
@@ -12,11 +12,13 @@ export interface UseQueryProps<K extends readonly unknown[], A, E, R> {
|
|||||||
readonly refreshOnWindowFocus?: boolean
|
readonly refreshOnWindowFocus?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface UseQueryResult<A, E> {
|
export interface UseQueryResult<K extends readonly unknown[], A, E> {
|
||||||
|
readonly keyStream: Stream.Stream<K>
|
||||||
readonly state: SubscriptionRef.SubscriptionRef<AsyncData.AsyncData<A, E>>
|
readonly state: SubscriptionRef.SubscriptionRef<AsyncData.AsyncData<A, E>>
|
||||||
readonly refresh: Effect.Effect<Fiber.RuntimeFiber<void, Cause.NoSuchElementException>>
|
readonly refresh: Effect.Effect<Fiber.RuntimeFiber<void, Cause.NoSuchElementException>>
|
||||||
|
|
||||||
readonly layer: <Self, Id extends string>(
|
readonly layer: <Self, Id extends string>(
|
||||||
tag: Context.TagClass<Self, Id, QueryService.QueryService<A, E>>
|
tag: Context.TagClass<Self, Id, QueryService.QueryService<K, A, E>>
|
||||||
) => Layer.Layer<Self>
|
) => Layer.Layer<Self>
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,7 +27,7 @@ export const QueryExtension = ReffuseExtension.make(() => ({
|
|||||||
useQuery<K extends readonly unknown[], A, E, R>(
|
useQuery<K extends readonly unknown[], A, E, R>(
|
||||||
this: ReffuseHelpers.ReffuseHelpers<R>,
|
this: ReffuseHelpers.ReffuseHelpers<R>,
|
||||||
props: UseQueryProps<K, A, E, R>,
|
props: UseQueryProps<K, A, E, R>,
|
||||||
): UseQueryResult<A, E> {
|
): UseQueryResult<K, A, E> {
|
||||||
const runner = this.useMemo(() => QueryRunner.make({
|
const runner = this.useMemo(() => QueryRunner.make({
|
||||||
key: props.key,
|
key: props.key,
|
||||||
query: props.query,
|
query: props.query,
|
||||||
@@ -39,10 +41,12 @@ export const QueryExtension = ReffuseExtension.make(() => ({
|
|||||||
[props.refreshOnWindowFocus, runner])
|
[props.refreshOnWindowFocus, runner])
|
||||||
|
|
||||||
return React.useMemo(() => ({
|
return React.useMemo(() => ({
|
||||||
|
keyStream: props.key,
|
||||||
state: runner.stateRef,
|
state: runner.stateRef,
|
||||||
refresh: runner.forkRefresh,
|
refresh: runner.forkRefresh,
|
||||||
|
|
||||||
layer: tag => Layer.succeed(tag, {
|
layer: tag => Layer.succeed(tag, {
|
||||||
|
keyStream: props.key,
|
||||||
state: runner.stateRef,
|
state: runner.stateRef,
|
||||||
refresh: runner.forkRefresh,
|
refresh: runner.forkRefresh,
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
import type * as AsyncData from "@typed/async-data"
|
import type * as AsyncData from "@typed/async-data"
|
||||||
import { type Cause, Effect, type Fiber, type SubscriptionRef } from "effect"
|
import { type Cause, Effect, type Fiber, type Stream, type SubscriptionRef } from "effect"
|
||||||
|
|
||||||
|
|
||||||
export interface QueryService<A, E> {
|
export interface QueryService<K extends readonly unknown[], A, E> {
|
||||||
|
readonly keyStream: Stream.Stream<K>
|
||||||
readonly state: SubscriptionRef.SubscriptionRef<AsyncData.AsyncData<A, E>>
|
readonly state: SubscriptionRef.SubscriptionRef<AsyncData.AsyncData<A, E>>
|
||||||
readonly refresh: Effect.Effect<Fiber.RuntimeFiber<void, Cause.NoSuchElementException>>
|
readonly refresh: Effect.Effect<Fiber.RuntimeFiber<void, Cause.NoSuchElementException>>
|
||||||
}
|
}
|
||||||
|
|
||||||
export const Tag = <const Id extends string>(id: Id) => <
|
export const Tag = <const Id extends string>(id: Id) => <
|
||||||
Self, A, E = never,
|
Self, K extends readonly unknown[], A, E = never,
|
||||||
>() => Effect.Tag(id)<Self, QueryService<A, E>>()
|
>() => Effect.Tag(id)<Self, QueryService<K, A, E>>()
|
||||||
|
|
||||||
|
|
||||||
// export interface LayerProps<A, E, R> {
|
// export interface LayerProps<A, E, R> {
|
||||||
|
|||||||
Reference in New Issue
Block a user