Mercurial > hg > jslab
view src/scheme/task.scm @ 1:5df24c91468d
Oh my what a mess.
author | samer |
---|---|
date | Fri, 05 Apr 2019 16:26:00 +0100 |
parents | bf79fb79ee13 |
children |
line wrap: on
line source
;;; task related utilities (import "samer.tools.*") (define task (macro body `(SilkTask. (lambda () ,@body)))) ;;; convert a CompoundTask to a Scheme list (define (tasks->list tasks) (define L ()) (define (list-it it) (if (.more it) (begin (set! L (append L (list (.next it)))) (list-it it)))) (list-it (.iterator tasks)) L ) ;;; create and access main task list (define _thread null) (define _tasklist_stack ()) (define (start) (exec _thread "start")) (define (stop) (exec _thread "stop")) (define (thread) _thread) ;;; creates a task list/thread if none exists, returns a task list (define (tasks) (if (null? _tasklist_stack) (let ((t (CompoundTask.))) (set! _thread (RThread. t)) (push-tasklist t) t ) (first _tasklist_stack) ) ) (define (push-tasklist t) (set! _tasklist_stack (cons t _tasklist_stack))) (define (pop-tasklist) (let ((t (first _tasklist_stack))) (set! _tasklist_stack (rest _tasklist_stack)) t)) (define with-tasks (macro (tasks . body) `(begin (push-tasklist ,tasks) (tryCatch (let ((a (begin . ,body))) (pop-tasklist) a) (lambda (ex) (pop-tasklist) (throw ex)))))) ; add task to current task list (define (addtask t) (.addTask (tasks) t) t) (define (removetask t) (.removeTask (tasks) t) t) (define-method (add (t Task)) (.addTask (tasks) t) t) (define-method (addafter (a Task) (t Task)) (.addTaskAfter (tasks) t a) t) (define-method (remove (t Task)) (.removeTask (tasks) t) t) ; add multiple tasks to current task list (define (addtasks . t) (for-each (lambda (t) (.addTask (tasks) t)) t) (tasks) ) (define-method (pr-tasks) (print (tasks->list (tasks)))) (define-method (view-tasks) (view-tasks (tasks))) (define-method (view-tasks tasks) (view-list (tasks->list tasks) "Tasks")) (define-method (task-ref (n Integer)) (list-ref (tasks->list (tasks)) n)) (define-method (task-ref tasks (n Integer)) (list-ref (tasks->list tasks) n)) (define (switch task) (SwitchTask. task)) ;;; Create a subrate task and a UI for the subrate factor ;;; !! need to dispose of VInteger when task is disposed. (define (sub n task) (define vn (VInteger. "subfactor" n)) (define subt (SubrateTask. n task)) (on-change vn (.setFactor subt (.value$ vn))) (.value$ vn n) (.changed vn) subt ) (define (seq . tasks) (define c (CompoundTask.)) (for-each (lambda (t) (.addTask c t)) tasks) c)