view waitbox.ur @ 28:7d0014542199

TogglePanel.isOpen
author Adam Chlipala <adam@chlipala.net>
date Sun, 12 Feb 2012 10:27:02 -0500
parents 37eefd0a2ed4
children
line wrap: on
line source
type t = {Milliseconds : int,
          Action : source (string -> transaction {}),
          Timer : source (option Timer.t),
          Text : source string}

fun create n =
    s <- source "";
    tmO <- source None;
    f <- source (fn _ => return ());

    return {Milliseconds = n, Action = f, Timer = tmO, Text = s}

fun setAction r v = set r.Action v

fun tickle r =
    last <- get r.Timer;
    (case last of
         None => return ()
       | Some tm => Timer.cancel tm);
    tm <- Timer.create {Milliseconds = r.Milliseconds,
                        Action = (set r.Timer None;
                                  s <- get r.Text;
                                  f <- get r.Action;
                                  f s)};
    set r.Timer (Some tm)

fun render r = <xml>
  <ctextbox source={r.Text}
            onkeyup={fn _ => tickle r}/>
</xml>

fun clear r = (set r.Text "";
               tm <- get r.Timer;
               (case tm of
                    None => return ()
                  | Some tm => Timer.cancel tm);
               set r.Timer None)

fun trigger r =
    last <- get r.Timer;
    (case last of
         None => return ()
       | Some tm => Timer.cancel tm);
    set r.Timer None;
    s <- get r.Text;
    f <- get r.Action;
    f s