///|
/// Evaluate FirstGen
fn eval_first_gen(
  gen_expr : Expr,
  input : Json,
  env : Env,
) -> Iter[Json] raise InterpreterError {
  match eval_with_env(gen_expr, input, env).collect() {
    [first, ..] => Iter::singleton(first)
    [] => Iter::empty()
  }
}

///|
/// Evaluate LastGen
fn eval_last_gen(
  gen_expr : Expr,
  input : Json,
  env : Env,
) -> Iter[Json] raise InterpreterError {
  let gen_results = eval_with_env(gen_expr, input, env).collect()
  match gen_results.last() {
    Some(value) => Iter::singleton(value)
    None => Iter::empty()
  }
}

///|
/// Evaluate Repeat
fn eval_repeat(
  expr : Expr,
  input : Json,
  env : Env,
) -> Iter[Json] raise InterpreterError {
  let values = eval_with_env(expr, input, env).collect()
  guard values is [_, ..] else { return Iter::empty() }
  let len = values.length()
  let idx : Ref[Int] = Ref(0)
  Iter::new(fn() {
    let i = idx.val
    let result = Some(values[i])
    idx.val = if i + 1 >= len { 0 } else { i + 1 }
    result
  })
}