Current section
Files
Jump to
Current section
Files
lib/check/spinner.ex
defmodule CheckEscript.Spinner do
@moduledoc "Animated spinner for long-running operations."
@frames ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]
def start(label \\ "Running") do
spawn_link(fn -> loop(label, 0) end)
end
def stop(pid) do
send(pid, :stop)
# clear the spinner line
IO.write("\e[2K\r")
end
defp loop(label, frame) do
receive do
:stop -> :ok
after
100 ->
try do
icon = Enum.at(@frames, rem(frame, length(@frames)))
IO.write("\e[2K\r#{icon} #{label}")
rescue
_ -> :ok
end
loop(label, frame + 1)
end
end
end