Task.define();
function print (id, m) {
    var r = 200, g = 30, b = 30;
    var i = 0, step = 30;

    var li = $("<li>").append(m)
        .css("color", "rgb(" + [r, g, b].join(",") + ")");
    $("#t" + id).append(li);
    setTimeout(function() {
                   i++;
                   function n(c) { return c - ((c / step) * i);}
                   li.css("color", "rgb(" + [n(r), n(g), n(b)].join(",") + ")");
                   if (i < step) setTimeout(arguments.callee, 50);
               }, 0);
}
var stackTask;
$(function() {
      stackTask = new Task(
          function() {
              this.stack = [];
              print(1, "[" + this.stack.join(", ") + "]");
          },
          loop(
              function() {return true;},
              select(
                  when(function() {return this.stack.length > 0;})
                      .accept("pop", function() {
                                  return this.stack.pop();
                              }),
                  accept("push", function(item) {
                             this.stack.push(item);
                         })
              ),
              function() {
                  print(1, "[" + this.stack.join(", ") + "]");
              }
          )
      );
      stackTask.activate();
      $("#stack_push").click(
          function() {stackTask.push([$("#stack_value").val()]);}
      );

      $("#stack_pop").click(stackTask.pop);
});
