///|
/// Function pointer table for calling from runtime into stdlib.
/// This breaks the circular dependency: runtime defines the interface,
/// stdlib provides the implementation, root interpreter wires them together.
pub(all) struct StdlibHooks {
  get_string_method : (String, String, RealmState, Bool) -> Value
  get_number_method : (Value, String, RealmState) -> Value
  get_array_method_with_interp : (ArrayData, String, RealmState) -> Value
  get_map_method : (MapData, String, RealmState) -> Value
  get_set_method : (SetData, String, RealmState) -> Value
  get_promise_method : (PromiseData, String, RealmState) -> Value
  make_regexp_object : (RealmState, String, String) -> Value raise Error
  typedarray_get_index : (ObjectData, Int, RealmState) -> Value
  typedarray_set_index : (ObjectData, Int, Double, RealmState) -> Unit
  typedarray_is_valid_index : (ObjectData, Int, RealmState) -> Bool
  // Factory for creating a fully-wired realm (builtins + harness + hooks).
  // Populated by the wiring layer; the default produces a bare interpreter.
  create_realm : () -> Interpreter
}

///|
/// Default no-op hooks used before stdlib is wired in.
pub fn default_stdlib_hooks() -> StdlibHooks {
  {
    get_string_method: fn(_s, _prop, _realm_state, _annex_b) { Undefined },
    get_number_method: fn(_obj, _prop, _realm_state) { Undefined },
    get_array_method_with_interp: fn(_data, _prop, _realm_state) { Undefined },
    get_map_method: fn(_data, _prop, _realm_state) { Undefined },
    get_set_method: fn(_data, _prop, _realm_state) { Undefined },
    get_promise_method: fn(_data, _prop, _realm_state) { Undefined },
    make_regexp_object: fn(_realm_state, _pattern, _flags) { Undefined },
    typedarray_get_index: fn(_data, _idx, _realm_state) { Undefined },
    typedarray_set_index: fn(_data, _idx, _val, _realm_state) { () },
    typedarray_is_valid_index: fn(_data, _idx, _realm_state) { false },
    create_realm: fn() { Interpreter::new() },
  }
}