import type { GenericDocument, FieldTypeFromFieldPath, IndexRange as ConvexIndexRange, IndexRangeBuilder as ConvexIndexRangeBuilder } from "convex/server"; import * as Data from "effect/Data"; import * as Option from "effect/Option"; import * as Result from "effect/Result"; import type * as Types from "effect/Types"; import * as QueryStreamIndexPrefix from "./QueryStreamIndexPrefix"; import * as QueryStreamKeyBounds from "./QueryStreamKeyBounds"; import * as QueryStreamKeyValues from "./QueryStreamKeyValues"; import type * as QueryStreamOrderDirection from "./QueryStreamOrderDirection"; type Head> = FieldPaths extends readonly [infer H extends string, ...ReadonlyArray] ? H : never; type Tail> = FieldPaths extends readonly [ string, ...infer Rest extends ReadonlyArray ] ? Rest : ReadonlyArray; declare const TypeId = "~@confect/server/QueryStreamIndexRange"; interface Equality { readonly fieldPath: string; readonly value: QueryStreamKeyValues.KeyValue; } interface Endpoint { readonly value: QueryStreamKeyValues.KeyValue; readonly inclusive: boolean; } type Interval = Data.TaggedEnum<{ Lower: { readonly lower: Endpoint; }; Upper: { readonly upper: Endpoint; }; Between: { readonly lower: Endpoint; readonly upper: Endpoint; }; }>; declare const Interval: { readonly $is: (tag: Tag) => (u: unknown) => u is Extract<{ readonly _tag: "Between"; readonly lower: Endpoint; readonly upper: Endpoint; }, { readonly _tag: Tag; }> | Extract<{ readonly _tag: "Lower"; readonly lower: Endpoint; }, { readonly _tag: Tag; }> | Extract<{ readonly _tag: "Upper"; readonly upper: Endpoint; }, { readonly _tag: Tag; }>; readonly $match: { ) => any; }>(cases: Cases): (value: { readonly _tag: "Between"; readonly lower: Endpoint; readonly upper: Endpoint; } | { readonly _tag: "Lower"; readonly lower: Endpoint; } | { readonly _tag: "Upper"; readonly upper: Endpoint; }) => import("effect/Unify").Unify>; ) => any; }>(value: { readonly _tag: "Between"; readonly lower: Endpoint; readonly upper: Endpoint; } | { readonly _tag: "Lower"; readonly lower: Endpoint; } | { readonly _tag: "Upper"; readonly upper: Endpoint; }, cases: Cases): import("effect/Unify").Unify>; }; readonly Between: Data.TaggedEnum.ConstructorFrom<{ readonly _tag: "Between"; readonly lower: Endpoint; readonly upper: Endpoint; }, "_tag">; readonly Lower: Data.TaggedEnum.ConstructorFrom<{ readonly _tag: "Lower"; readonly lower: Endpoint; }, "_tag">; readonly Upper: Data.TaggedEnum.ConstructorFrom<{ readonly _tag: "Upper"; readonly upper: Endpoint; }, "_tag">; }; interface Constraints { readonly equalities: ReadonlyArray; readonly bounded: Option.Option<{ readonly fieldPath: string; readonly interval: Interval; }>; } /** * The equality prefix followed by at most one bounded field. * * @experimental */ export interface QueryStreamIndexRange = ReadonlyArray> { readonly [TypeId]: Constraints & { readonly _Remaining: Types.Covariant; }; } /** * @experimental */ export type Remaining = IndexRange extends QueryStreamIndexRange ? RemainingFieldPaths : never; /** * A typed index-range builder. `eq` must target the next unpinned index field, * and consumes it; `gt`/`gte`/`lt`/`lte` bound the next field without consuming * it (bounded field paths still vary within the range). * * @experimental */ export interface Builder> extends QueryStreamIndexRange { readonly eq: (fieldPath: Head, value: FieldTypeFromFieldPath>) => Builder>; readonly gt: (fieldPath: Head, value: FieldTypeFromFieldPath>) => LowerBoundedBuilder; readonly gte: (fieldPath: Head, value: FieldTypeFromFieldPath>) => LowerBoundedBuilder; readonly lt: (fieldPath: Head, value: FieldTypeFromFieldPath>) => QueryStreamIndexRange; readonly lte: (fieldPath: Head, value: FieldTypeFromFieldPath>) => QueryStreamIndexRange; } /** * After `gt`/`gte`, only an upper bound on the same field may follow. * * @experimental */ export interface LowerBoundedBuilder> extends QueryStreamIndexRange { readonly lt: (fieldPath: Head, value: FieldTypeFromFieldPath>) => QueryStreamIndexRange; readonly lte: (fieldPath: Head, value: FieldTypeFromFieldPath>) => QueryStreamIndexRange; } /** * The initial builder handed to a range callback. * * @experimental */ export declare const builder: >() => Builder; /** * Number of index fields pinned by equality constraints. * * @experimental */ export declare const equalityPrefixLength: (self: QueryStreamIndexRange) => number; /** * Apply one range to Convex's index-range builder. * * @experimental */ export declare const apply: (self: QueryStreamIndexRange, q: ConvexIndexRangeBuilder) => ConvexIndexRange; /** * Decompose the range between `indexBounds.lower` and `indexBounds.upper` (over * the complete index `fieldPaths`, `_id` tiebreaker included) into a sequence * of Convex-expressible ranges, ordered for the given direction. * * @experimental */ export declare const fromBounds: (fieldPaths: ReadonlyArray, orderDirection: QueryStreamOrderDirection.QueryStreamOrderDirection, indexBounds: QueryStreamKeyBounds.IndexBounds) => Result.Result, QueryStreamIndexPrefix.IndexPrefixWidthMismatchError>; /** * Derive full-index bounds directly from the structural range. * * @experimental */ export declare const toBounds: (self: QueryStreamIndexRange) => QueryStreamKeyBounds.IndexBounds; export {}; //# sourceMappingURL=QueryStreamIndexRange.d.ts.map