import { compose } from "../lib/util/compose";
import { concatUint8Array } from "../tools/concatUint8Array";

/** Output Uint8Array of fixed size*/
export const chunksOf = (byteLength: number) => {
    return compose<
        Uint8Array,
        {
            currByteLength: number;
            chunks: Uint8Array[];
            rest: Uint8Array | undefined
        },
        Uint8Array
    >(
        [
            (chunk_, prev) => {

                const [chunk, previousByteLength, chunks] =
                    prev.rest !== undefined ?
                        [concatUint8Array([chunk_, prev.rest]), 0, []]
                        :
                        [chunk_, prev.currByteLength, prev.chunks]
                    ;

                const currByteLength = previousByteLength + chunk.byteLength;

                return [
                    {
                        currByteLength,
                        "chunks": [...chunks, chunk],
                        "rest": currByteLength >= byteLength ?
                            chunk.slice(byteLength - currByteLength)
                            :
                            undefined

                    }
                ];
            },
            {
                "currByteLength": 0,
                "chunks": [],
                "rest": undefined
            }
        ],
        ({ rest, chunks }) => rest !== undefined ?
            [concatUint8Array(chunks, byteLength)] :
            null
    )

};
