import { PipeBody } from "../../pipables"; import type { LinqWrapper } from "../linqWrapper"; // TODO global shared instanceof support with Symbol.for export abstract class AbstractLinqWrapper implements LinqWrapper { public $(pipeBody: PipeBody): T { return pipeBody(this); } public abstract [Symbol.iterator](): Iterator; public unwrap(): Iterable { return this; } } export class IterableLinqWrapper extends AbstractLinqWrapper { public constructor(private readonly _iterable: Iterable) { super(); } public [Symbol.iterator](): Iterator { return this._iterable[Symbol.iterator](); } public override unwrap(): Iterable { return this._iterable; } } export class IterableFactoryLinqWrapper extends AbstractLinqWrapper { public constructor(private readonly _iteratorFactory: () => Iterable) { super(); } public *[Symbol.iterator](): Iterator { yield* this._iteratorFactory(); } } export abstract class IntermediateLinqWrapper extends AbstractLinqWrapper { public constructor(public readonly __state: TState) { super(); } }