/**
 * Modern Albufeira Prolog Interpreter
 *
 * Warranty & Liability
 * To the extent permitted by applicable law and unless explicitly
 * otherwise agreed upon, XLOG Technologies AG makes no warranties
 * regarding the provided information. XLOG Technologies AG assumes
 * no liability that any problems might be solved with the information
 * provided by XLOG Technologies AG.
 *
 * Rights & License
 * All industrial property rights regarding the information - copyright
 * and patent rights in particular - are the sole property of XLOG
 * Technologies AG. If the company was not the originator of some
 * excerpts, XLOG Technologies AG has at least obtained the right to
 * reproduce, change and translate the information.
 *
 * Reproduction is restricted to the whole unaltered document. Reproduction
 * of the information is only allowed for non-commercial uses. Selling,
 * giving away or letting of the execution of the library is prohibited.
 * The library can be distributed as part of your applications and libraries
 * for execution provided this comment remains unchanged.
 *
 * Restrictions
 * Only to be distributed with programs that add significant and primary
 * functionality to the library. Not to be distributed with additional
 * software intended to replace any components of the library.
 *
 * Trademarks
 * Jekejeke is a registered trademark of XLOG Technologies AG.
 */

/*********************************************************************/
/* Import Native API                                                 */
/*********************************************************************/

/* embedding native API */
import {Clause, add, set, Cache, make_defined, engine, set_stage,
    clear, stage, is_provable, Goal, is_cache, set_partition
} from "./store.mjs";
import {
    run, ctx, Context, VOID_ARGS, launch_async, launch,
    task_async, callback
} from "./machine.mjs";
import {check_provable
} from "./runtime.mjs";

/* engine native API */
import {
    is_compound, Item, is_logical, is_stick,
    stack_push, stack_peek, stack_pop, size_peek,
    Place, Skeleton, is_skeleton, check_nonvar,
} from "./store.mjs";
import {
    call, cont, unify, make_error, fs, url, gc_time,
    real_time, set_temp_display,
    register_signal, register_interrupt, gc_enter,
    gc_maxinfs, gc_major, is_frozen, Frozen, is_special
} from "./machine.mjs";
import {
    check_atom, check_number, make_arithmetic, make_check,
    check_callable, check_goal, check_clause,
    check_integer, check_atomic, MAX_ARITY, check_nil
} from "./special.mjs";

/* term native API */
import {Variable, is_variable, Compound, is_structure,
    VAR_MASK_SEEN, VAR_MASK_STATE, VAR_MASK_SERNO,
    copy_term, deref, variable_serno
} from "./store.mjs";
import {
    is_atom, is_number, is_integer, is_float, exec_deref,
    exec_eval, exec_unify, union_undo, is_bigint, object_hash_code,
    exec_build, bind, trail, union_find, union_add, is_pending
} from "./machine.mjs";
import {
    objects_list, list_objects, walk_vars
} from "./special.mjs";
import {equal_term, walk_uncompute, walk_compute, Triple, is_triple
} from "./eval.mjs";

/* stream native API */
import {Source, Sink, stream_close, stream_flush,
    check_source, check_sink, put_atom, codebase,
    MASK_DST_FEAT, MASK_DST_LINE,
    get_encoding, MASK_SRC_AREAD, map_stream_error,
    bootbase, set_bootbase, set_codebase, file_read_promise
} from "./runtime.mjs";

/* theatre native API */
import {
    post, perform, goto_async, FFI_FUNC, register,
    instrument_document_async, perform_async,
} from "./theatre.mjs";

/* specific native API */
import {
    norm_smallint, norm_bigint, widen_bigint,
    char_count, narrow_float, norm_float, make_special,
} from "./special.mjs";

/* specific browser API */
import {
    fiddle_out, fiddle_in_promise, html_send, html_encode,
    set_cursor, set_caret_wait, set_input, fiddle_flush,
    set_to_list
} from "./theatre.mjs";

/*********************************************************************/
/* Export Native API                                                 */
/*********************************************************************/

/* embedding native API */
export {add, set, Clause, run, check_goal, clear, set_partition,
    Goal, Cache, make_defined, set_stage, VOID_ARGS,
    Context, is_provable, is_cache, launch_async, launch,
    task_async, callback}

/* engine native API */
export function get_cont() {
    return call;
}
export function get_mark() {
    return trail;
}
export function get_engine() {
    return engine;
}
export function get_ctx() {
    return ctx;
}
export function get_stage() {
    return stage;
}
export function get_codebase() {
    return codebase;
}
export function get_gc_enter() {
    return gc_enter;
}
export function get_gc_time() {
    return gc_time;
}
export function get_gc_maxinfs() {
    return gc_maxinfs;
}
export function get_bootbase() {
    return bootbase;
}

export {make_special, make_arithmetic, check_atomic, is_frozen,
    make_check, cont, make_error, check_clause, register_interrupt,
    check_nonvar, check_atom, fs, url, register_signal, MAX_ARITY,
    check_number, check_integer, check_callable, Item, check_nil,
    real_time, gc_major, Frozen, stack_push, stack_peek,
    call, set_temp_display,
    stack_pop, is_compound, check_provable, is_logical,
    size_peek, is_stick, Place, Skeleton, is_skeleton}

/* term native API */
export {Variable, Compound, is_variable, is_structure,
    is_atom, is_number, is_integer, is_float,
    exec_deref, is_pending, norm_float, walk_compute,
    union_find, union_add, union_undo, walk_vars,
    VAR_MASK_SEEN, VAR_MASK_SERNO, VAR_MASK_STATE,
    equal_term, bind, exec_unify, variable_serno,
    Triple, is_triple, set_to_list, unify,
    deref, copy_term, exec_eval, exec_build,
    objects_list, list_objects, walk_uncompute}

/* stream native API */
export {Source, Sink, stream_close, stream_flush,
    check_source, check_sink, put_atom,
    MASK_DST_FEAT, MASK_DST_LINE,
    MASK_SRC_AREAD, get_encoding, map_stream_error,
    set_bootbase, set_codebase, file_read_promise}

/* theatre native API */
export {post, perform, goto_async, FFI_FUNC, register,
    instrument_document_async, perform_async}

/* specific native API */
export {is_bigint, norm_smallint, widen_bigint, is_special,
    norm_bigint, narrow_float, char_count, object_hash_code}

/* specific browser API */
export {fiddle_out, fiddle_in_promise, html_send, html_encode,
    set_cursor, set_caret_wait, set_input, fiddle_flush}