# `AshUi.Patch.Table`
[🔗](https://github.com/hyperbob-labs/ash_ui/blob/main/lib/ash_ui/patch/table.ex#L1)

Compiled patch table for one resource view: every dynamic position in the
lowered view becomes a slot with a stable address, an evaluator, and the
dependency field paths that invalidate it; the propagation index inverts
dependencies to slot ids. Nested `render(Resource, input)` compiles the
child resource's own table under an address prefix.

This is compile-derived data (internals of the compiled artifact), not
model vocabulary: the view stays an Ash calculation; this table is its
partial evaluation staged for change-driven patch emission.

# `slot`

```elixir
@type slot() :: %{
  id: term(),
  addr: String.t(),
  kind: :text | :attrs | :branch | :keyed_list | :child,
  deps: [atom()],
  eval: (AshUi.Expr.Scope.t() -&gt; term()),
  meta: map()
}
```

# `t`

```elixir
@type t() :: %AshUi.Patch.Table{
  children: %{required(String.t()) =&gt; t()},
  collection_slots: %{required(atom()) =&gt; [term()]},
  error_slots: term(),
  event_elements: %{required(String.t()) =&gt; map()},
  propagation: %{required(atom()) =&gt; [term()]},
  propagation_addresses: %{required(atom()) =&gt; MapSet.t(String.t())},
  resource: module() | nil,
  root: term(),
  root_slot_ids: [term()] | nil,
  skeleton: AshUi.Patch.Skeleton.t() | nil,
  slots: %{required(term()) =&gt; slot()},
  target: module(),
  view: atom()
}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
