Quick debugging in Elixir

I just learned that we can use dbg/2 (https://hexdocs.pm/elixir/1.19.0/debugging.html#dbg-2) to debug expressions in Elixir. It's quite useful when used with the pipe operator – unlike IO.inspect, it automatically shows each step in the pipeline.

defmodule MathUtils do
  defp perfect_square?(n) do
    sqrt = :math.sqrt(n)
    sqrt == Float.floor(sqrt)
  end
  
  def filter_perfect_squares(str) do
    str
    |> String.split(",")
    |> Enum.map(&String.to_integer/1)
    |> Enum.filter(&perfect_square?/1)
    |> Enum.join(",")
    |> dbg() # <- the dbg in the pipeline
  end
end

This prints not only the last result, but also each step of the pipeline:

MathUtils.filter_perfect_squares("1,2,3,4,5,6,7,8,9")

Output:

[Library/Application Support/livebook/autosaved/2025_10_18/09_51_enj6/untitled_notebook.livemd#cell:6ordqtno3dx7c2zp:13: MathUtils.filter_perfect_squares/1]
str #=> "1,2,3,4,5,6,7,8,9"
|> String.split(",") #=> ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
|> Enum.map(&String.to_integer/1) #=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
|> Enum.filter(&perfect_square?/1) #=> [1, 4, 9]
|> Enum.join(",") #=> "1,4,9"

Result: "1,4,9"


Other debugging options:IO.inspect/2 – prints a value and returns it (good for pipelines, but shows only one value) – IO.puts/1 – simple print for strings – dbg/2 – shows each pipeline step automatically