import {QueryContext} from "../utils/queryContext"; import {Bindings} from "@comunica/bindings-factory"; export abstract class Query { public queryBindings: Array; protected readonly queryContext: QueryContext; private subscribedReadyFunctions: (() => void)[] = new Array<() => void>(); protected queryReady: boolean = false; public isQueryReady = () => this.queryReady; protected constructor(queryContext: QueryContext, queryBindings?: Array) { this.queryContext = queryContext; this.queryBindings = queryBindings? queryBindings : new Array(); } abstract streamBindings(cb: (bindings: Bindings, addition: boolean) => void): void; async getBindings(): Promise { await this.queryReadyPromise(); return this.queryBindings; } public async queryReadyPromise(): Promise { if (!this.queryReady) { await new Promise((resolve, reject) => { this.subscribeOnReady(() => { resolve(); }); }) } } abstract switchQueryType(): Query; subscribeOnReady(cb: () => void): void { this.subscribedReadyFunctions.push(cb); } protected afterQueryReady() { this.queryReady = true; this.subscribedReadyFunctions.forEach((value) => { value(); }); } abstract delete(): void; }