new object $scheduler: $utilities;

var $root inited = 1;
var $scheduler suspended_tasks = #[];


public method $scheduler.suspend() {
    arg @objs;
    
    objs += [user()];
    suspended_tasks = dict_add(suspended_tasks, task_id(), objs);
    return (> suspend() <);
};

public method $scheduler.resume() {
    arg task_id, @return_value;
    var objs;
    
    if ((objs = (| suspended_tasks[task_id] |))) {
        if (!(sender() in objs))
            throw(~perm, sender() + " may not resume task " + task_id);
        suspended_tasks = dict_del(suspended_tasks, task_id);
    }
    return (> resume(task_id, @return_value) <);
};

public method $scheduler.cancel() {
    arg task_id;
    var objs;
    
    if ((objs = (| suspended_tasks[task_id] |))) {
        if (!(sender() in objs))
            throw(~perm, sender() + " may not cancel task " + task_id);
        suspended_tasks = dict_del(suspended_tasks, task_id);
    }
    return (> cancel(task_id) <);
};

public method $scheduler.task_info() {
    arg @args;
    
    return (> task_info(@args) <);
};