-module(glixir). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -define(FILEPATH, "src/glixir.gleam"). -export([start_pubsub/1, pubsub_subscribe/2, pubsub_broadcast/3, pubsub_unsubscribe/2, start_registry/1, register_subject/3, lookup_subject/2, unregister_subject/2, start_supervisor/0, start_supervisor_simple/0, start_supervisor_named/2, child_spec/4, start_child/2, terminate_child/2, restart_child/2, delete_child/2, which_children/1, count_children/1, start_simple_genserver/2, ping_genserver/1, get_genserver_state/1, start_genserver/2, start_genserver_named/3, call_genserver/2, call_genserver_timeout/3, call_genserver_named/2, cast_genserver/2, cast_genserver_named/2, lookup_genserver/1, stop_genserver/1, genserver_pid/1, start_agent/1, start_agent_named/2, get_agent/3, get_agent_timeout/4, update_agent/2, cast_agent/2, get_and_update_agent/3, stop_agent/1, agent_pid/1, main/0, worker_spec/3, supervisor_spec/3]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC( " glixir - Enhanced with Subject support for proper message passing\n" " \n" " This module provides a unified API for working with OTP processes from Gleam.\n" " Now includes registry support for Subject lookup.\n" ). -file("src/glixir.gleam", 74). -spec start_pubsub(binary()) -> {ok, glixir@pubsub:pub_sub()} | {error, glixir@pubsub:pub_sub_error()}. start_pubsub(Name) -> glixir@pubsub:start_pubsub(Name). -file("src/glixir.gleam", 78). -spec pubsub_subscribe(binary(), binary()) -> {ok, nil} | {error, glixir@pubsub:pub_sub_error()}. pubsub_subscribe(Pubsub_name, Topic) -> glixir@pubsub:subscribe(Pubsub_name, Topic). -file("src/glixir.gleam", 85). -spec pubsub_broadcast(binary(), binary(), gleam@dynamic:dynamic_()) -> {ok, nil} | {error, glixir@pubsub:pub_sub_error()}. pubsub_broadcast(Pubsub_name, Topic, Message) -> glixir@pubsub:broadcast(Pubsub_name, Topic, Message). -file("src/glixir.gleam", 93). -spec pubsub_unsubscribe(binary(), binary()) -> {ok, nil} | {error, glixir@pubsub:pub_sub_error()}. pubsub_unsubscribe(Pubsub_name, Topic) -> glixir@pubsub:unsubscribe(Pubsub_name, Topic). -file("src/glixir.gleam", 105). ?DOC(" Start a unique registry for Subject lookup\n"). -spec start_registry(binary()) -> {ok, glixir@registry:registry()} | {error, glixir@registry:registry_error()}. start_registry(Name) -> logging:log(debug, <<"Starting registry: "/utf8, Name/binary>>), glixir@registry:start_unique_registry(Name). -file("src/glixir.gleam", 111). ?DOC(" Register a Subject with a key in the registry\n"). -spec register_subject(binary(), binary(), gleam@erlang@process:subject(any())) -> {ok, nil} | {error, glixir@registry:registry_error()}. register_subject(Registry_name, Key, Subject) -> logging:log(debug, <<"Registering subject: "/utf8, Key/binary>>), glixir@registry:register_subject(Registry_name, Key, Subject). -file("src/glixir.gleam", 121). ?DOC(" Look up a Subject by key in the registry\n"). -spec lookup_subject(binary(), binary()) -> {ok, gleam@erlang@process:subject(any())} | {error, glixir@registry:registry_error()}. lookup_subject(Registry_name, Key) -> logging:log(debug, <<"Looking up subject: "/utf8, Key/binary>>), glixir@registry:lookup_subject(Registry_name, Key). -file("src/glixir.gleam", 130). ?DOC(" Unregister a Subject from the registry\n"). -spec unregister_subject(binary(), binary()) -> {ok, nil} | {error, glixir@registry:registry_error()}. unregister_subject(Registry_name, Key) -> logging:log(debug, <<"Unregistering subject: "/utf8, Key/binary>>), glixir@registry:unregister_subject(Registry_name, Key). -file("src/glixir.gleam", 143). ?DOC(" Start a supervisor with default options\n"). -spec start_supervisor() -> {ok, glixir@supervisor:supervisor()} | {error, glixir@supervisor:supervisor_error()}. start_supervisor() -> glixir@supervisor:start_dynamic_supervisor_simple(). -file("src/glixir.gleam", 148). ?DOC(" Start a simple supervisor with defaults\n"). -spec start_supervisor_simple() -> {ok, glixir@supervisor:supervisor()} | {error, glixir@supervisor:supervisor_error()}. start_supervisor_simple() -> logging:log(debug, <<"Starting simple supervisor"/utf8>>), Result = glixir@supervisor:start_dynamic_supervisor_simple(), case Result of {ok, Sup} -> logging:log(info, <<"Simple supervisor started successfully"/utf8>>), {ok, Sup}; {error, Error} -> logging:log( error, <<"Simple supervisor start failed: "/utf8, (gleam@string:inspect(Error))/binary>> ), {error, Error} end. -file("src/glixir.gleam", 168). ?DOC(" Start a named supervisor using DynamicSupervisor\n"). -spec start_supervisor_named( binary(), list({binary(), gleam@dynamic:dynamic_()}) ) -> {ok, glixir@supervisor:supervisor()} | {error, glixir@supervisor:supervisor_error()}. start_supervisor_named(Name, _) -> logging:log(debug, <<"Starting named supervisor: "/utf8, Name/binary>>), Result = glixir@supervisor:start_dynamic_supervisor_named(Name), case Result of {ok, Sup} -> logging:log( info, <<<<"Named supervisor '"/utf8, Name/binary>>/binary, "' started successfully"/utf8>> ), {ok, Sup}; {error, Error} -> logging:log( error, <<<<<<"Named supervisor '"/utf8, Name/binary>>/binary, "' start failed: "/utf8>>/binary, (gleam@string:inspect(Error))/binary>> ), {error, Error} end. -file("src/glixir.gleam", 197). ?DOC(" Create a child specification\n"). -spec child_spec(binary(), binary(), binary(), list(gleam@dynamic:dynamic_())) -> glixir@supervisor:simple_child_spec(). child_spec(Id, Module, Function, Args) -> glixir@supervisor:child_spec(Id, Module, Function, Args). -file("src/glixir.gleam", 207). ?DOC(" Start a child process in the supervisor\n"). -spec start_child( glixir@supervisor:supervisor(), glixir@supervisor:simple_child_spec() ) -> {ok, gleam@erlang@process:pid_()} | {error, binary()}. start_child(Supervisor_instance, Spec) -> logging:log( debug, <<"Starting child with id: "/utf8, (erlang:element(2, Spec))/binary>> ), Result = glixir@supervisor:start_dynamic_child(Supervisor_instance, Spec), case Result of {ok, Pid} -> logging:log( info, <<<<"Child '"/utf8, (erlang:element(2, Spec))/binary>>/binary, "' started successfully"/utf8>> ), {ok, Pid}; {error, Error} -> logging:log( error, <<<<<<"Child '"/utf8, (erlang:element(2, Spec))/binary>>/binary, "' start failed: "/utf8>>/binary, Error/binary>> ), {error, Error} end. -file("src/glixir.gleam", 233). ?DOC(" Terminate a child process\n"). -spec terminate_child(glixir@supervisor:supervisor(), binary()) -> {ok, nil} | {error, glixir@supervisor:child_operation_error()}. terminate_child(Supervisor_instance, Child_id) -> logging:log(debug, <<"Terminating child: "/utf8, Child_id/binary>>), case glixir@supervisor:terminate_child(Supervisor_instance, Child_id) of terminate_child_ok -> logging:log( info, <<<<"Child '"/utf8, Child_id/binary>>/binary, "' terminated successfully"/utf8>> ), {ok, nil}; {terminate_child_error, Error} -> logging:log( error, <<<<"Failed to terminate child '"/utf8, Child_id/binary>>/binary, "'"/utf8>> ), {error, Error} end. -file("src/glixir.gleam", 258). ?DOC(" Restart a child process\n"). -spec restart_child(glixir@supervisor:supervisor(), binary()) -> {ok, gleam@erlang@process:pid_()} | {error, glixir@supervisor:child_operation_error()}. restart_child(Supervisor_instance, Child_id) -> logging:log(debug, <<"Restarting child: "/utf8, Child_id/binary>>), case glixir@supervisor:restart_child(Supervisor_instance, Child_id) of {restart_child_ok, Pid} -> logging:log( info, <<<<"Child '"/utf8, Child_id/binary>>/binary, "' restarted successfully"/utf8>> ), {ok, Pid}; {restart_child_ok_already_started, Pid@1} -> logging:log( info, <<<<"Child '"/utf8, Child_id/binary>>/binary, "' was already started"/utf8>> ), {ok, Pid@1}; {restart_child_error, Error} -> logging:log( error, <<<<"Failed to restart child '"/utf8, Child_id/binary>>/binary, "'"/utf8>> ), {error, Error} end. -file("src/glixir.gleam", 287). ?DOC(" Delete a child specification from the supervisor\n"). -spec delete_child(glixir@supervisor:supervisor(), binary()) -> {ok, nil} | {error, glixir@supervisor:child_operation_error()}. delete_child(Supervisor_instance, Child_id) -> logging:log(debug, <<"Deleting child spec: "/utf8, Child_id/binary>>), case glixir@supervisor:delete_child(Supervisor_instance, Child_id) of delete_child_ok -> logging:log( info, <<<<"Child spec '"/utf8, Child_id/binary>>/binary, "' deleted successfully"/utf8>> ), {ok, nil}; {delete_child_error, Error} -> logging:log( error, <<<<"Failed to delete child spec '"/utf8, Child_id/binary>>/binary, "'"/utf8>> ), {error, Error} end. -file("src/glixir.gleam", 312). ?DOC(" Get list of child processes\n"). -spec which_children(glixir@supervisor:supervisor()) -> list(glixir@supervisor:child_info_result()). which_children(Supervisor_instance) -> logging:log(debug, <<"Querying supervisor children"/utf8>>), glixir@supervisor:which_dynamic_children(Supervisor_instance). -file("src/glixir.gleam", 320). ?DOC(" Count children by status\n"). -spec count_children(glixir@supervisor:supervisor()) -> glixir@supervisor:child_counts(). count_children(Supervisor_instance) -> logging:log(debug, <<"Counting supervisor children"/utf8>>), glixir@supervisor:count_dynamic_children(Supervisor_instance). -file("src/glixir.gleam", 330). ?DOC(" Start a simple GenServer with one argument\n"). -spec start_simple_genserver(binary(), binary()) -> {ok, glixir@genserver:gen_server()} | {error, glixir@genserver:gen_server_error()}. start_simple_genserver(Module, Initial_state) -> glixir@genserver:start_link(Module, Initial_state). -file("src/glixir.gleam", 338). ?DOC(" Ping a GenServer (returns :pong if successful)\n"). -spec ping_genserver(glixir@genserver:gen_server()) -> {ok, gleam@dynamic:dynamic_()} | {error, glixir@genserver:gen_server_error()}. ping_genserver(Server) -> glixir@genserver:call( Server, begin _pipe = erlang:binary_to_atom(<<"ping"/utf8>>), gleam_erlang_ffi:identity(_pipe) end ). -file("src/glixir.gleam", 343). ?DOC(" Get state from a GenServer\n"). -spec get_genserver_state(glixir@genserver:gen_server()) -> {ok, gleam@dynamic:dynamic_()} | {error, glixir@genserver:gen_server_error()}. get_genserver_state(Server) -> glixir@genserver:call( Server, begin _pipe = erlang:binary_to_atom(<<"get_state"/utf8>>), gleam_erlang_ffi:identity(_pipe) end ). -file("src/glixir.gleam", 348). ?DOC(" Start a GenServer using Module.start_link/1\n"). -spec start_genserver(binary(), any()) -> {ok, glixir@genserver:gen_server()} | {error, glixir@genserver:gen_server_error()}. start_genserver(Module, Args) -> logging:log(debug, <<"Starting GenServer: "/utf8, Module/binary>>), glixir@genserver:start_link(Module, Args). -file("src/glixir.gleam", 357). ?DOC(" Start a named GenServer\n"). -spec start_genserver_named(binary(), binary(), any()) -> {ok, glixir@genserver:gen_server()} | {error, glixir@genserver:gen_server_error()}. start_genserver_named(Module, Name, Args) -> logging:log( debug, <<<<<<"Starting named GenServer: "/utf8, Module/binary>>/binary, " as "/utf8>>/binary, Name/binary>> ), glixir@genserver:start_link_named(Module, Name, Args). -file("src/glixir.gleam", 370). ?DOC(" Send a synchronous call to the GenServer (5s timeout)\n"). -spec call_genserver(glixir@genserver:gen_server(), any()) -> {ok, any()} | {error, glixir@genserver:gen_server_error()}. call_genserver(Server, Request) -> glixir@genserver:call(Server, Request). -file("src/glixir.gleam", 378). ?DOC(" Send a synchronous call with custom timeout\n"). -spec call_genserver_timeout(glixir@genserver:gen_server(), any(), integer()) -> {ok, any()} | {error, glixir@genserver:gen_server_error()}. call_genserver_timeout(Server, Request, Timeout) -> glixir@genserver:call_timeout(Server, Request, Timeout). -file("src/glixir.gleam", 387). ?DOC(" Call a named GenServer\n"). -spec call_genserver_named(binary(), any()) -> {ok, any()} | {error, glixir@genserver:gen_server_error()}. call_genserver_named(Name, Request) -> glixir@genserver:call_named(Name, Request). -file("src/glixir.gleam", 395). ?DOC(" Send an asynchronous cast to the GenServer\n"). -spec cast_genserver(glixir@genserver:gen_server(), any()) -> {ok, nil} | {error, glixir@genserver:gen_server_error()}. cast_genserver(Server, Request) -> glixir@genserver:cast(Server, Request). -file("src/glixir.gleam", 403). ?DOC(" Cast to a named GenServer\n"). -spec cast_genserver_named(binary(), any()) -> {ok, nil} | {error, glixir@genserver:gen_server_error()}. cast_genserver_named(Name, Request) -> glixir@genserver:cast_named(Name, Request). -file("src/glixir.gleam", 411). ?DOC(" Look up a GenServer by registered name\n"). -spec lookup_genserver(binary()) -> {ok, glixir@genserver:gen_server()} | {error, glixir@genserver:gen_server_error()}. lookup_genserver(Name) -> glixir@genserver:lookup_name(Name). -file("src/glixir.gleam", 416). ?DOC(" Stop a GenServer gracefully\n"). -spec stop_genserver(glixir@genserver:gen_server()) -> {ok, nil} | {error, glixir@genserver:gen_server_error()}. stop_genserver(Server) -> logging:log(debug, <<"Stopping GenServer"/utf8>>), glixir@genserver:stop(Server). -file("src/glixir.gleam", 422). ?DOC(" Get the PID of a GenServer\n"). -spec genserver_pid(glixir@genserver:gen_server()) -> gleam@erlang@process:pid_(). genserver_pid(Server) -> glixir@genserver:pid(Server). -file("src/glixir.gleam", 431). ?DOC(" Start a new Agent with initial state\n"). -spec start_agent(fun(() -> any())) -> {ok, glixir@agent:agent()} | {error, glixir@agent:agent_error()}. start_agent(Initial_fun) -> logging:log(debug, <<"Starting Agent"/utf8>>), glixir@agent:start(Initial_fun). -file("src/glixir.gleam", 437). ?DOC(" Start an Agent with a name\n"). -spec start_agent_named(binary(), fun(() -> any())) -> {ok, glixir@agent:agent()} | {error, glixir@agent:agent_error()}. start_agent_named(Name, Initial_fun) -> logging:log(debug, <<"Starting named Agent: "/utf8, Name/binary>>), glixir@agent:start_named(Name, Initial_fun). -file("src/glixir.gleam", 446). ?DOC(" Get the current state from an Agent\n"). -spec get_agent( glixir@agent:agent(), fun((any()) -> EXS), gleam@dynamic@decode:decoder(EXS) ) -> {ok, EXS} | {error, glixir@agent:agent_error()}. get_agent(Agent, Fun, Decoder) -> glixir@agent:get(Agent, Fun, Decoder). -file("src/glixir.gleam", 455). ?DOC(" Get with custom timeout\n"). -spec get_agent_timeout( glixir@agent:agent(), fun((any()) -> EXX), integer(), gleam@dynamic@decode:decoder(EXX) ) -> {ok, EXX} | {error, glixir@agent:agent_error()}. get_agent_timeout(Agent, Fun, Timeout, Decoder) -> glixir@agent:get_timeout(Agent, Fun, Timeout, Decoder). -file("src/glixir.gleam", 465). ?DOC(" Update the Agent state synchronously\n"). -spec update_agent(glixir@agent:agent(), fun((EYB) -> EYB)) -> {ok, nil} | {error, glixir@agent:agent_error()}. update_agent(Agent, Fun) -> glixir@agent:update(Agent, Fun). -file("src/glixir.gleam", 470). ?DOC(" Update the Agent state asynchronously\n"). -spec cast_agent(glixir@agent:agent(), fun((EYE) -> EYE)) -> nil. cast_agent(Agent, Fun) -> glixir@agent:cast(Agent, Fun). -file("src/glixir.gleam", 475). ?DOC(" Get and update in one operation\n"). -spec get_and_update_agent( glixir@agent:agent(), fun((EYF) -> {EYG, EYF}), gleam@dynamic@decode:decoder(EYG) ) -> {ok, EYG} | {error, glixir@agent:agent_error()}. get_and_update_agent(Agent, Fun, Decoder) -> glixir@agent:get_and_update(Agent, Fun, Decoder). -file("src/glixir.gleam", 484). ?DOC(" Stop an Agent\n"). -spec stop_agent(glixir@agent:agent()) -> {ok, nil} | {error, glixir@agent:agent_error()}. stop_agent(Agent) -> logging:log(debug, <<"Stopping Agent"/utf8>>), glixir@agent:stop(Agent). -file("src/glixir.gleam", 490). ?DOC(" Get the PID of an Agent\n"). -spec agent_pid(glixir@agent:agent()) -> gleam@erlang@process:pid_(). agent_pid(Agent) -> glixir@agent:pid(Agent). -file("src/glixir.gleam", 533). ?DOC(" Main function for when glixir is run directly (demo/testing)\n"). -spec main() -> nil. main() -> logging_ffi:configure(). -file("src/glixir.gleam", 499). ?DOC(" Create a simple worker child spec with defaults\n"). -spec worker_spec(binary(), binary(), list(gleam@dynamic:dynamic_())) -> glixir@supervisor:simple_child_spec(). worker_spec(Id, Module, Args) -> {simple_child_spec, Id, erlang:binary_to_atom(Module), erlang:binary_to_atom(<<"start_link"/utf8>>), Args, permanent, 5000, worker}. -file("src/glixir.gleam", 516). ?DOC(" Create a supervisor child spec\n"). -spec supervisor_spec(binary(), binary(), list(gleam@dynamic:dynamic_())) -> glixir@supervisor:simple_child_spec(). supervisor_spec(Id, Module, Args) -> {simple_child_spec, Id, erlang:binary_to_atom(Module), erlang:binary_to_atom(<<"start_link"/utf8>>), Args, permanent, 5000, supervisor_child}.