defmodule LiveData do @moduledoc """ Documentation for `LiveData`. """ alias LiveData.{Socket, Tracked} @type rendered :: any() @callback mount(params :: any(), Socket.t()) :: {:ok, Socket.t()} @callback handle_event(event :: any(), Socket.t()) :: {:ok, Socket.t()} @callback handle_info(message :: any(), Socket.t()) :: {:ok, Socket.t()} @callback render(Socket.assigns()) :: rendered() @callback __tracked__render__(Socket.assigns()) :: Tracked.tree() @optional_callbacks mount: 2, handle_event: 2, handle_info: 2 defmacro __using__(opts) do quote bind_quoted: [opts: opts] do use LiveData.Tracked import LiveData @behaviour LiveData end end def assign(%Socket{assigns: assigns} = socket, key, value) do assigns = Map.put(assigns, key, value) %{socket | assigns: assigns} end def debug_prints?, do: false end