Skip to main content

src/etui@backend.erl

-module(etui@backend).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/etui/backend.gleam").
-export([init/1, render/3, poll/3, next_size/2, cleanup/2, clear_and_home/0]).
-export_type([render_op/0, mouse_button/0, input_event/0, terminal_size/0, backend/1, error/0]).

-type render_op() :: {move_cursor, integer(), integer()} |
    {write, binary()} |
    clear_screen |
    enter_alt_screen |
    exit_alt_screen |
    enable_mouse |
    disable_mouse.

-type mouse_button() :: mouse_left | mouse_middle | mouse_right.

-type input_event() :: {key_press, binary()} |
    {resize, integer(), integer()} |
    tick |
    {mouse_press, integer(), integer(), mouse_button()} |
    {mouse_release, integer(), integer(), mouse_button()} |
    {mouse_scroll, integer(), integer(), boolean()}.

-type terminal_size() :: {terminal_size, integer(), integer()}.

-type backend(DQX) :: {backend,
        fun(() -> {ok, DQX} | {error, error()}),
        fun((DQX, list(render_op())) -> {ok, DQX} | {error, error()}),
        fun((DQX, integer()) -> {ok, {input_event(), DQX}} | {error, error()}),
        fun((DQX) -> {ok, {terminal_size(), DQX}} | {error, error()}),
        fun((DQX) -> nil)}.

-type error() :: {terminal_unsupported, binary()} |
    {i_o_error, binary()} |
    interrupted.

-file("src/etui/backend.gleam", 70).
-spec init(backend(DQY)) -> {ok, DQY} | {error, error()}.
init(Backend) ->
    (erlang:element(2, Backend))().

-file("src/etui/backend.gleam", 74).
-spec render(backend(DRC), DRC, list(render_op())) -> {ok, DRC} |
    {error, error()}.
render(Backend, State, Ops) ->
    (erlang:element(3, Backend))(State, Ops).

-file("src/etui/backend.gleam", 82).
-spec poll(backend(DRH), DRH, integer()) -> {ok, {input_event(), DRH}} |
    {error, error()}.
poll(Backend, State, Timeout_ms) ->
    (erlang:element(4, Backend))(State, Timeout_ms).

-file("src/etui/backend.gleam", 90).
-spec next_size(backend(DRL), DRL) -> {ok, {terminal_size(), DRL}} |
    {error, error()}.
next_size(Backend, State) ->
    (erlang:element(5, Backend))(State).

-file("src/etui/backend.gleam", 97).
-spec cleanup(backend(DRP), DRP) -> nil.
cleanup(Backend, State) ->
    (erlang:element(6, Backend))(State).

-file("src/etui/backend.gleam", 104).
-spec clear_and_home() -> list(render_op()).
clear_and_home() ->
    [clear_screen, {move_cursor, 0, 0}].