{
  "version": 3,
  "sources": ["../src/index.ts"],
  "sourcesContent": ["export type CollectResult<T> =\n    T extends ArrayBufferView ? T :\n    T extends string ? string :\n    T[]\n\nexport class EnhancedStream<T> {\n    readonly readable:ReadableStream<T>\n\n    constructor (readable:ReadableStream<T>) {\n        this.readable = readable\n    }\n\n    map<U> (fn:(item:T) => U|Promise<U>):EnhancedStream<U> {\n        const ts = new TransformStream<T, U>({\n            async transform (chunk, controller) {\n                controller.enqueue(await fn(chunk))\n            },\n        })\n        return new EnhancedStream(this.readable.pipeThrough(ts))\n    }\n\n    filter (predicate:(item:T) => boolean|Promise<boolean>):EnhancedStream<T> {\n        const ts = new TransformStream<T, T>({\n            async transform (chunk, controller) {\n                if (await predicate(chunk)) {\n                    controller.enqueue(chunk)\n                }\n            },\n        })\n\n        return new EnhancedStream(this.readable.pipeThrough(ts))\n    }\n\n    /**\n     * Side effects.\n     */\n    forEach (fn:(item:T) => void|Promise<void>):EnhancedStream<T> {\n        const ts = new TransformStream<T, T>({\n            async transform (chunk, controller) {\n                await fn(chunk)\n                controller.enqueue(chunk)\n            },\n        })\n        return new EnhancedStream(this.readable.pipeThrough(ts))\n    }\n\n    take (n:number):EnhancedStream<T> {\n        let count = 0\n        const ts = new TransformStream<T, T>({\n            transform (chunk, controller) {\n                if (count < n) {\n                    controller.enqueue(chunk)\n                    count++\n                }\n                if (count >= n) {\n                    controller.terminate()\n                }\n            },\n        })\n\n        return new EnhancedStream(this.readable.pipeThrough(ts))\n    }\n\n    skip (n:number):EnhancedStream<T> {\n        let count = 0\n        const ts = new TransformStream<T, T>({\n            transform (chunk, controller) {\n                if (count >= n) {\n                    controller.enqueue(chunk)\n                }\n                count++\n            },\n        })\n        return new EnhancedStream(this.readable.pipeThrough(ts))\n    }\n\n    scan<U> (fn:(acc:U, item:T) => U|Promise<U>, initial:U):EnhancedStream<U> {\n        let acc = initial\n        const ts = new TransformStream<T, U>({\n            async transform (chunk, controller) {\n                acc = await fn(acc, chunk)\n                controller.enqueue(acc)\n            },\n        })\n        return new EnhancedStream(this.readable.pipeThrough(ts))\n    }\n\n    async reduce<U> (\n        fn:(acc:U, item:T) => U|Promise<U>,\n        initial:U\n    ):Promise<U> {\n        let acc = initial\n        const reader = this.readable.getReader()\n        try {\n            while (true) {\n                const { done, value } = await reader.read()\n                if (done) break\n                acc = await fn(acc, value)\n            }\n        } finally {\n            reader.releaseLock()\n        }\n\n        return acc\n    }\n\n    async find (\n        predicate:(item:T) => boolean|Promise<boolean>\n    ):Promise<T|undefined> {\n        const reader = this.readable.getReader()\n        try {\n            while (true) {\n                const { done, value } = await reader.read()\n                if (done) return undefined\n                if (await predicate(value)) return value\n            }\n        } finally {\n            reader.releaseLock()\n        }\n    }\n\n    async some (\n        predicate:(item:T) => boolean|Promise<boolean>\n    ):Promise<boolean> {\n        const reader = this.readable.getReader()\n        try {\n            while (true) {\n                const { done, value } = await reader.read()\n                if (done) return false\n                if (await predicate(value)) return true\n            }\n        } finally {\n            reader.releaseLock()\n        }\n    }\n\n    async every (\n        predicate:(item:T) => boolean|Promise<boolean>\n    ):Promise<boolean> {\n        const reader = this.readable.getReader()\n        try {\n            while (true) {\n                const { done, value } = await reader.read()\n                if (done) return true\n                if (!await predicate(value)) return false\n            }\n        } finally {\n            reader.releaseLock()\n        }\n    }\n\n    async toArray ():Promise<T[]> {\n        const results:T[] = []\n        const reader = this.readable.getReader()\n        try {\n            while (true) {\n                const { done, value } = await reader.read()\n                if (done) break\n                results.push(value)\n            }\n        } finally {\n            reader.releaseLock()\n        }\n        return results\n    }\n\n    async collect ():Promise<CollectResult<T>> {\n        const chunks:T[] = []\n        const reader = this.readable.getReader()\n        try {\n            while (true) {\n                const { done, value } = await reader.read()\n                if (done) break\n                chunks.push(value)\n            }\n        } finally {\n            reader.releaseLock()\n        }\n\n        if (chunks.length === 0) {\n            return chunks as CollectResult<T>\n        }\n\n        const first = chunks[0]\n\n        // Typed arrays (Uint8Array, Float32Array, etc.) and Buffer\n        // concatenate\n        if (ArrayBuffer.isView(first)) {\n            const typedChunks = chunks as unknown as ArrayBufferView[]\n            const totalLength = typedChunks.reduce((sum, chunk) => {\n                return sum + (chunk as any).length\n            }, 0)\n            const TypedArrayConstructor = first.constructor as new (\n                length:number\n            ) => any\n            const result = new TypedArrayConstructor(totalLength)\n            let offset = 0\n            for (const chunk of typedChunks) {\n                result.set(chunk, offset)\n                offset += (chunk as any).length\n            }\n            return result as CollectResult<T>\n        }\n\n        // Strings -- concatenate\n        if (typeof first === 'string') {\n            return (chunks as unknown as string[]).join('') as CollectResult<T>\n        }\n\n        // Everything else -- array\n        return chunks as CollectResult<T>\n    }\n\n    toStream ():ReadableStream<T> {\n        return this.readable\n    }\n}\n\nexport interface SFunction {\n    <T>(readable:ReadableStream<T>):EnhancedStream<T>;\n    from<T>(iterable:Iterable<T>|AsyncIterable<T>):EnhancedStream<T>;\n}\n\n/**\n * Wrap a ReadableStream with array-like chainable methods.\n */\nexport const S:SFunction = Object.assign(\n    function <T> (readable:ReadableStream<T>):EnhancedStream<T> {\n        return new EnhancedStream(readable)\n    },\n\n    {\n        /**\n         * Create an EnhancedStream from an array or iterable.\n         */\n        from<T> (iterable:Iterable<T>|AsyncIterable<T>):EnhancedStream<T> {\n            const readable = new ReadableStream<T>({\n                async start (controller) {\n                    try {\n                        for await (const item of iterable) {\n                            controller.enqueue(item)\n                        }\n                        controller.close()\n                    } catch (error) {\n                        controller.error(error)\n                    }\n                },\n            })\n\n            return new EnhancedStream(readable)\n        },\n    }\n)\n"],
  "mappings": "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",
  "names": ["index_exports", "__export", "EnhancedStream", "S", "__toCommonJS", "EnhancedStream", "__name", "readable", "fn", "ts", "chunk", "controller", "predicate", "n", "count", "initial", "acc", "reader", "done", "value", "results", "chunks", "first", "typedChunks", "totalLength", "sum", "TypedArrayConstructor", "result", "offset", "S", "iterable", "item", "error"]
}
