%% Minimal distribution helpers for the gleamtk POC. -module(gleamtk_ffi). -export([ ping/1, send_to/3, register_name/1, self_pid/0, node_name/0, nodes/0, receive_any/1, atom/1, tuple2_atom_binary/2, tuple2_atom_int/2, hello_with_self/0 ]). %% Gleam PingResult constructors → atoms pong | pang ping(Node) when is_atom(Node) -> net_adm:ping(Node). %% Gleam Nil → atom nil send_to(Name, Node, Msg) when is_atom(Name), is_atom(Node) -> {Name, Node} ! Msg, nil. %% Gleam Result(Nil, Nil) → {ok, nil} | {error, nil} register_name(Name) when is_atom(Name) -> case catch erlang:register(Name, self()) of true -> {ok, nil}; {'EXIT', _} -> case erlang:whereis(Name) of Pid when Pid =:= self() -> {ok, nil}; _ -> {error, nil} end end. self_pid() -> self(). node_name() -> node(). nodes() -> nodes(connected). %% Gleam Result(Term, Nil) → {ok, Msg} | {error, nil} receive_any(TimeoutMs) when is_integer(TimeoutMs), TimeoutMs >= 0 -> receive Msg -> {ok, Msg} after TimeoutMs -> {error, nil} end. atom(Bin) when is_binary(Bin) -> binary_to_atom(Bin, utf8). tuple2_atom_binary(AtomBin, Str) when is_binary(AtomBin), is_binary(Str) -> {binary_to_atom(AtomBin, utf8), Str}. tuple2_atom_int(AtomBin, N) when is_binary(AtomBin), is_integer(N) -> {binary_to_atom(AtomBin, utf8), N}. %% `{hello, self()}` so the foreign node can SEND replies to our pid. hello_with_self() -> {hello, self()}.