<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Nov 5, 2014 at 7:50 AM, Tony Rogvall <span dir="ltr"><<a href="mailto:tony@rogvall.se" target="_blank">tony@rogvall.se</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I propose a new BIF:<br>
<br>
        erlang:restart_timer(Ref, Time) -> false | RemainingTime<br>
<br>
This will restart a time if it is active and return the time that remained when it was restarted.<br>
If restart_timer return false either the timer has already time out or the reference is not a timer.<br></blockquote></div><br clear="all"><div>I like the proposal. However, is it too "imperative" of an interface? If a process saves a timer reference and the timer never seems to fire, you have to determine whether it was cancelled or reset. One of the strengths of immutability is that you can always tell where a variable received its value. By reusing the same timer ref, a long lived value may go through many state changes which may make it harder to find bugs related to the timer. I guess erlang:cancel_timer/1 already changes the state of a timer, so this proposal isn't setting the precedent, just expanding it.</div><div><br></div><div>To keep it more functional, it should be more like:</div><div><br></div><div>erlang:restart_timer(ORef, Time) -> { NRef, false | RemainingTime }</div><div><br></div><div>The old timer gets cancelled, any messages from the old timer are removed from the queue, and then new timer is created. A new ref is always returned and the second value indicates the end state of the previous timer: 'false', if it expired, or the time remaining.</div><div><br></div>-- <br><div>Rich<br></div>
</div></div>