{"version":3,"sources":["iterator.ts"],"sourcesContent":["import { Tuple } from \"./tuple.ts\";\nimport type { datex_scope } from \"../utils/global_types.ts\";\nimport type { ValueConsumer } from \"./abstract_types.ts\";\n\nexport class Iterator<T> {\n\n    val?: T;\n    #done = false;\n\n    // can be reiterated\n    reiterate = true\n    #recording = true;\n    #recorded:T[] = [];\n\n\n    internal_iterator: globalThis.Iterator<T>|globalThis.AsyncIterator<T>\n\n    constructor(iterator?:globalThis.Iterator<T>|globalThis.AsyncIterator<T>) {\n        this.internal_iterator = iterator ?? this.generator();\n    }\n\n    async next(): Promise<boolean> {\n        if (this.#done) return false; // already done\n\n        // use internal JS iterator / generator method\n        const res = await this.internal_iterator.next()\n\n        // not done\n        if (!res.done) {\n            this.val = res.value;\n            if (this.reiterate && this.#recording) this.#recorded.push(this.val);\n        }\n        // done\n        else this.#done = res.done;\n\n        // reset\n        if (this.#done && this.reiterate) {\n            this.reset();\n            return false; // is done for now\n        }\n        return !this.#done;\n    }\n\n    private reset(){\n        if (!this.reiterate) return;\n        // has recorded now\n        if (this.#recording) this.#recording = false;\n\n        // create new iterator\n        this.internal_iterator = Iterator.getJSIterator(this.#recorded) // iterate recorded\n\n        this.#done = false;\n    }\n\n\n    async *[Symbol.iterator] (){\n        while (await this.next()) yield this.val;\n    }\n\n    async collapse():Promise<Tuple>{\n        // already recorded everything\n        if (this.reiterate && !this.#recording) return new Tuple(this.#recorded);\n        \n        // record\n        this.reiterate = true;\n        while (await this.next());\n        return new Tuple(this.#recorded);\n    }\n\n    // convert value to default iterator\n    public static get<T>(iterator_or_iterable:globalThis.Iterator<T>|globalThis.Iterable<T>|Iterator<T>|IterationFunction):Iterator<T> {\n        if (iterator_or_iterable instanceof Iterator) return iterator_or_iterable;\n        else if (iterator_or_iterable instanceof IterationFunction) {\n            console.log(\"iterator for iteration function\", iterator_or_iterable)\n        }\n        // indexed tuple\n        else if (iterator_or_iterable instanceof Tuple && iterator_or_iterable.named.size == 0) return new Iterator(Iterator.getJSIterator(iterator_or_iterable.toArray()))\n        return new Iterator(Iterator.getJSIterator(iterator_or_iterable)); // create any other iterator or single value iterator\n    }\n\n    protected static getJSIterator<T>(iterator_or_iterable:Iterator<T>|globalThis.Iterator<T>|globalThis.Iterable<T>):globalThis.Iterator<T>|globalThis.AsyncIterator<T> {\n        if (iterator_or_iterable instanceof Iterator) return iterator_or_iterable.internal_iterator;\n        else if (typeof iterator_or_iterable == \"function\") return iterator_or_iterable;\n        else return (typeof iterator_or_iterable != \"string\" && iterator_or_iterable?.[Symbol.iterator]) ? \n            iterator_or_iterable?.[Symbol.iterator]() : \n            [iterator_or_iterable][Symbol.iterator]()\n    }\n\n    // map globalThis.Iterator with function\n    \n    public static map<T,N>(iterator_or_iterable:Iterator<T>|globalThis.Iterator<T>|globalThis.Iterable<T>, map:(value:T)=>N):MappingIterator<T,N> {\n        return new MappingIterator(iterator_or_iterable, map);\n    }\n\n\n    protected *generator():Generator<T>{}\n}\n\n\nclass MappingIterator<T,N> extends Iterator<N> {\n\n    #iterator:globalThis.Iterator<T>|globalThis.AsyncIterator<T>;\n    #map:(value:T)=>Promise<N>|N;\n\n    constructor(iterator_or_iterable:Iterator<T>|globalThis.Iterator<T>|globalThis.Iterable<T>, map:(value:T)=>Promise<N>|N) {\n        super();\n        this.internal_iterator = this.asyncGenerator();\n        this.#iterator = Iterator.getJSIterator(iterator_or_iterable);\n        this.#map = map;\n    }\n\n    protected async *asyncGenerator() {\n        let result = await this.#iterator?.next();\n        while (!result?.done) {\n            yield await this.#map(result.value);\n            result = await this.#iterator.next();\n        }\n    }\n    \n}\n\n\n\nexport class RangeIterator extends Iterator<bigint> {\n\n    #min:bigint;\n    #max:bigint;\n\n    constructor(min:number|bigint, max:number|bigint) {\n        super();\n\n        this.#min = typeof min == \"number\" ? BigInt(Math.floor(min)) : min;\n        this.#max = typeof max == \"number\" ? BigInt(Math.floor(max)) : max;\n\n    }\n\n    protected override *generator() {\n        while (this.#min < this.#max) {\n            yield this.#min;\n            this.#min++;\n        }\n    }\n    \n}\n\n\nexport class IterationFunction implements ValueConsumer  {\n\n    handleApply(value: any, SCOPE?: datex_scope) {\n        // don't await result\n        this.handleApply(value, SCOPE);\n    }\n\n}"],"names":["Tuple","Symbol","iterator","Iterator","val","reiterate","internal_iterator","constructor","generator","next","res","done","value","push","reset","getJSIterator","collapse","get","iterator_or_iterable","IterationFunction","console","log","named","size","toArray","map","MappingIterator","asyncGenerator","result","RangeIterator","min","max","BigInt","Math","floor","handleApply","SCOPE"],"mappings":"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","sourceRoot":"/lib/datex-core-js-legacy-0.3.15/types/","file":"iterator.ts"}