///|
/// Compile a jq query string into a reusable Query.
pub fn parse(query : String) -> Query raise {
  { expr: @parser.parse(query) }
}

///|
/// Evaluate a compiled query against an input JSON value and stream results.
pub fn eval(query : Query, input : Json) -> Iter[Json] raise {
  query.eval(input)
}

///|
/// Evaluate a compiled query and collect all results eagerly.
pub fn eval_all(query : Query, input : Json) -> Array[Json] raise {
  query.eval_all(input)
}

///|
/// Parse + evaluate a jq query against a JSON string input, collecting results.
pub fn run(query : String, input : String) -> Array[Json] raise {
  let compiled = parse(query)
  let json = @json.parse(input)
  compiled.eval_all(json)
}

///|
/// Evaluate a compiled query against an already parsed Json input.
pub fn run_json(query : Query, input : Json) -> Array[Json] raise {
  query.eval_all(input)
}