lib/ordered_nary_tree/node.ex

defmodule OrderedNaryTree.Node do
  @type id :: reference
  @type t :: %__MODULE__{
    id: id,
    value: term,
    children: [t]
  }

  @enforce_keys ~w[id value children]a
  defstruct ~w[id value children]a

  @spec new(term) :: t
  def new(value) do
    id = generate_id()

    %__MODULE__{
      id: id,
      value: value,
      children: []
    }
  end

  @spec add_child(parent :: t, child :: t) :: updated_parent :: t
  def add_child(parent_node, child_node) do
    children = parent_node.children ++ [child_node]
    %{parent_node | children: children}
  end

  defp generate_id do
    make_ref()
  end
end