///|
pub struct BenchmarkReport {
  input_bytes : Int
  iterations : Int
  successes : Int
  fields : Int
  operations : Int
  elapsed_micros : Int
} derive(Debug, Eq)

///|
fn benchmark_parse_one(input : String) -> GS1Message? {
  Some(parse_gs1(input)) catch {
    _ => None
  }
}

///|
pub fn benchmark_parse(input : String, iterations~ : Int) -> BenchmarkReport {
  let mut successes = 0
  let mut fields = 0
  let mut operations = 0
  for _ in 0.. {
        successes = successes + 1
        fields = fields + message.elements.length()
        operations = operations + input.length() + message.elements.length() * 4
      }
      None => operations = operations + input.length()
    }
  }
  {
    input_bytes: input.length(),
    iterations,
    successes,
    fields,
    operations,
    elapsed_micros: 0,
  }
}

///|
pub fn BenchmarkReport::success_rate(self : BenchmarkReport) -> Int {
  if self.iterations == 0 {
    0
  } else {
    self.successes * 100 / self.iterations
  }
}

///|
pub fn BenchmarkReport::summary(self : BenchmarkReport) -> String {
  "iterations=\{self.iterations}; successes=\{self.successes}; fields=\{self.fields}; operations=\{self.operations}"
}