///|
// Strategy: grep-record-output
// Batch complete unadorned records from the current immutable input chunk.
// Adjacent selected records share one copy; partial records retain next().
fn GrepInput::collect_records(
  self : GrepInput,
  matcher : Matcher,
  options : GrepOptions,
  buffer : @buffer.Buffer,
) -> UInt64 {
  guard self.error is None else { return 0UL }
  let mut selected = 0UL
  let mut run_start = -1
  let start = self.position
  let mut at = start
  let mut records = 0L
  while self.bytes[at:].find(self.delimiter) is Some(relative) {
    let end = at + relative
    let matched = matcher.matches_record(
      self.bytes[at:end],
      options.ignore_case,
    )
    let keep = if options.invert { !matched } else { matched }
    if keep {
      selected += 1UL
      if run_start < 0 {
        run_start = at
      }
    } else if run_start >= 0 {
      buffer.write_bytes(self.bytes[run_start:at])
      run_start = -1
    }
    at = end + 1
    records += 1L
  }
  if run_start >= 0 {
    buffer.write_bytes(self.bytes[run_start:at])
  }
  self.consume_records(at, records)
  selected
}