view clock.ur @ 34:2d195bee1efa

CKeditor wrapper
author Adam Chlipala <adam@chlipala.net>
date Thu, 21 Nov 2013 18:19:02 -0500
parents 2947170fcfd6
children
line wrap: on
line source
(** Reactive view of the current time *)

type t = {
     Source : source time, (* Server time as of last tick event *)
     Skew : source int,    (* How many seconds do we add to the local clock to match the server clock? *)
     Period : int          (* How many milliseconds between ticks? *)
}

fun create ms =
    tm <- now;
    t <- source tm;
    sk <- source 0;
    return {Source = t, Skew = sk, Period = ms}

fun start t =
    let
        fun loop () =
            sleep t.Period;
            tm <- now;
            sk <- get t.Skew;
            set t.Source (addSeconds tm sk);
            loop ()

        fun serverTime () = now
    in
        spawn (server <- rpc (serverTime ());
               local <- now;
               set t.Skew (diffInSeconds local server));
        spawn (loop ())
    end

fun signal t = Basis.signal t.Source