What about having hooks after stages?

I love to use hooks on Phoenix LiveView.
I want to add hooks triggered after each stages.

For example, I want to assign a computed value from other assigns.

defmodule MyApp.TestLive do
  use MyApp, :live_view

  @impl true
  def mount(_params, _session, socket) do
    socket =
      socket
      |> assign(:a, 1)
      |> assign(:a, 2)
      |> assign_c()

    {:ok, socket}
  end

  @impl true
  def handle_event("select_a", %{"a" => a}, socket) do
    socket =
      socket
      |> assign(:a, a)
      |> assign_c()
  end

  @impl true
  def handle_event("select_b", %{"b" => b}, socket) do
    socket =
      socket
      |> assign(:b, b)
      |> assign_c()
  end

  defp assign_c(socket) do
    socket
    |> assign(:c, fn %{a: a, b: b} -> a + b end)
  end
end

With after hook, I can do this.

defmodule MyApp.TestLive do
  use MyApp, :live_view

  @impl true
  def mount(_params, _session, socket) do
    socket =
      socket
      |> assign(:a, 1)
      |> assign(:a, 2)
      |> assign_c()
      |> attach_hook(:my_hook, :after_handle_event, fn _event, _params, socket ->
        # can be optimized by checking :a, :b is changed
        {:cont, socket |> assign_c())
      end)

    {:ok, socket}
  end

  @impl true
  def handle_event("select_a", %{"a" => a}, socket) do
    socket =
      socket
      |> assign(:a, a)
  end

  @impl true
  def handle_event("select_b", %{"b" => b}, socket) do
    socket =
      socket
      |> assign(:b, b)
  end

  defp assign_c(socket) do
    socket
    |> assign(:c, fn %{a: a, b: b} -> a + b end)
  end
end

What about having hooks after stages?