import std/sequtils

import pkg/chronos

import pkg/codex/chunker
import pkg/codex/rng

export chunker

type
  MockChunker* = Chunker

proc new*(
    T: type MockChunker,
    dataset: openArray[byte],
    chunkSize: int | NBytes,
    pad: bool = false
): MockChunker =
  ## Create a chunker that produces data
  ##

  let 
    chunkSize = chunkSize.NBytes
    dataset = @dataset
  
  var consumed = 0
  proc reader(data: ChunkBuffer, len: int): Future[int] {.async, gcsafe, raises: [Defect].} =

    if consumed >= dataset.len:
      return 0

    var read = 0
    while read < len and 
      read < chunkSize.int and
      (consumed + read) < dataset.len:
      data[read] = dataset[consumed + read]
      read.inc
    
    consumed += read
    return read

  Chunker.new(
    reader = reader,
    pad = pad,
    chunkSize = chunkSize)