import {Dataset, ReadonlyDataset} from "@opennetwork/rdf-dataset" import {isLiteral, Literal, Quad} from "@opennetwork/rdf-data-model"; import * as ns from "./namespace" export interface QuestionQuad extends Quad { predicate: typeof ns.defaultMain.questionPredicate object: typeof ns.defaultMain.answerPredicate } export function isQuestionQuad(quad: Quad): quad is QuestionQuad { return quad.predicate.equals(ns.defaultMain.questionPredicate) && quad.object.equals(ns.defaultMain.answerPredicate) } export interface AnswerQuad extends Quad { predicate: typeof ns.defaultMain.answerPredicate object: Literal } export function isAnswerQuad(quad: Quad): quad is AnswerQuad { return quad.predicate.equals(ns.defaultMain.answerPredicate) && isLiteral(quad.object) } function question() { const questionDataset = new Dataset() questionDataset.add( new Quad( ns.defaultMain.startSubject, ns.defaultMain.questionPredicate, ns.defaultMain.answerPredicate, ns.defaultMain.startSubject ) ) return questionDataset } function assertAnswer(this: ReadonlyDataset) { if (this.empty) { throw new Error("Expected an answer") } } async function *defaultMain(this: ReadonlyDataset): AsyncIterable { yield question() // console.log(JSON.stringify({ withAnswer: this.toArray() }, undefined, " ")) assertAnswer.call(this.filter(isAnswerQuad)) // Lets do some UI ?? // // const environment = getEnvironment() // // const config = getEnvironmentConfig() // // console.log({ config }) // // // if (typeof document !== "undefined") { // console.log("we have a DOM") // } else if (environment.name === "node") { // console.log("we have a terminal!") // } else { // // console.log({ environment }) // } } export const DefaultMainSymbol = Symbol("Default Main") export const main: typeof defaultMain & { [DefaultMainSymbol]?: typeof ns.defaultMain.defaultMain } = defaultMain main[DefaultMainSymbol] = ns.defaultMain.defaultMain export function isDefaultMain(fn: typeof defaultMain): fn is typeof defaultMain & { [DefaultMainSymbol]: typeof ns.defaultMain.defaultMain } { function isLike(fn: unknown): fn is { [DefaultMainSymbol]: unknown } { return !!fn } return ( isLike(fn) && ns.defaultMain.defaultMain.equals(fn[DefaultMainSymbol]) ) }