{
  "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": []
}
