Packages

Generic Timer that broadcasts :tick to subscribers

Current section

Files

Jump to
vt_gen_timer lib gen_timer messenger.ex
Raw

lib/gen_timer/messenger.ex

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