import type { ImmutableArray } from "./array.js"; import type { Data, LeafData, LeafKey } from "./data.js"; import type { Item } from "./item.js"; /** Query that can be applied to a list of data objects. */ export type Query = { readonly [K in LeafKey as `${K}` | `!${K}`]?: LeafData[K] | ImmutableArray[K]> | undefined; } & { readonly [K in LeafKey as `${K}<` | `${K}<=` | `${K}>` | `${K}>=`]?: LeafData[K] | undefined; } & { readonly [K in LeafKey as `${K}[]`]?: LeafData[K] extends ImmutableArray ? X | undefined : never; } & { readonly $order?: `${LeafKey}` | `!${LeafKey}` | undefined | ImmutableArray<`${LeafKey}` | `!${LeafKey}` | undefined>; readonly $limit?: number | undefined; }; /** A set of query constraints for item data. */ export type ItemQuery = Query>; /** A single filter that can be applied to a list of data objects. */ export type Filter = { key: string; operator: "is"; value: unknown; } | { key: string; operator: "not"; value: unknown; } | { key: string; operator: "in"; value: ImmutableArray; } | { key: string; operator: "out"; value: ImmutableArray; } | { key: string; operator: "contains"; value: unknown; } | { key: string; operator: "lt"; value: unknown; } | { key: string; operator: "lte"; value: unknown; } | { key: string; operator: "gt"; value: unknown; } | { key: string; operator: "gte"; value: unknown; }; /** A single sort order that can be applied to a list of data objects. */ export type Order = { key: string; direction: "asc" | "desc"; }; /** Get the `Filter` objects for a query. */ export declare function getFilters(query: Query): ImmutableArray; /** Get the `Order` objects for a query. */ export declare function getOrders({ $order }: Query): ImmutableArray; /** Get the limit for a query. */ export declare function getLimit({ $limit }: Query): number | undefined; /** Query a set of data items using a query. */ export declare function queryItems(items: Iterable, query: Query): Iterable; /** * Query a set of data items for writing using a query. * - If no limit is set on the data sorting can be avoided too for performance reasons. */ export declare function queryWritableItems(items: Iterable, query: Query): Iterable; /** Match a single data item againt a set of filters. */ export declare function matchQueryItem(item: T, filters: ImmutableArray): boolean; /** Filter a set of data items using a set of filters. */ export declare function filterQueryItems(items: Iterable, filters: ImmutableArray): Iterable; /** Compare two data items using a set of orders. */ export declare function compareQueryItems(left: T, right: T, orders: ImmutableArray): number; /** Sort a set of data items using a set of orders. */ export declare function sortQueryItems(items: Iterable, orders: ImmutableArray): Iterable; /** LImit a set of data items using a set of limit. */ export declare function limitQueryItems(items: ImmutableArray | Iterable, limit: number | undefined): Iterable; /** Get a query for items that appear before a specified item. */ export declare function getBeforeQuery(query: Query, item: T): Query; /** Get a query for items that appear after a specified item. */ export declare function getAfterQuery(query: Query, item: T): Query;