defmodule GenTimer.Messenger do require Logger alias GenTimer.Timer @spec tick(Timer.t()) :: Timer.t() def tick(timer, opts \\ []) def tick(%Timer{state: :active} = timer, opts) do timer_interval = Keyword.get(opts, :interval, 1000) Process.send_after(self(), :tick, timer_interval) timer end def tick(timer, _opts), do: timer @spec broadcast(Timer.t(), binary()) :: Timer.t() def broadcast(%Timer{state: :initial, time_passed: 0} = timer, topic) do GenTimer.PubSub.broadcast(topic, {:initialized, timer}) Logger.info("Timer created!") timer end def broadcast(%Timer{state: :active, time_passed: 0} = timer, topic) do GenTimer.PubSub.broadcast(topic, {:started, timer}) Logger.info("Timer started!") timer end def broadcast(%Timer{state: :active, time_passed: time_passed} = timer, topic) when time_passed > 0 do GenTimer.PubSub.broadcast(topic, {:tick, timer}) Logger.info("Timer ticking! Time passed: #{timer.time_passed}") timer end def broadcast(%Timer{state: :paused} = timer, topic) do GenTimer.PubSub.broadcast(topic, {:paused, timer}) Logger.info("Timer paused!") timer end def broadcast(%Timer{state: :finished} = timer, topic) do GenTimer.PubSub.broadcast(topic, {:finished, timer}) Logger.info("Timer Finished, total duration: #{timer.time_passed}!") timer end end