///|
fn horiz_brace_spec() -> FunctionSpec {
  FunctionSpec::make(
    ["\\overbrace", "\\underbrace", "\\overbracket", "\\underbracket"],
    1,
    handler=horiz_brace_handler,
  )
}

///|
fn is_over_brace(func_name : String) -> Bool raise ParseFailure {
  match func_name {
    "\\overbrace" | "\\overbracket" => true
    "\\underbrace" | "\\underbracket" => false
    _ =>
      raise InternalInvariant(
        message="Unknown horizontal brace command: " + func_name,
      )
  }
}

///|
fn horiz_brace_handler(
  context : FunctionContext,
  args : Array[ParseNode],
  _opt_args : Array[ParseNode?],
) -> ParseNode raise ParseFailure {
  HorizBrace(
    mode=context.mode,
    label=context.func_name,
    is_over=is_over_brace(context.func_name),
    base=require_function_arg(args, 0, context.func_name),
  )
}