diff options
-rw-r--r-- | ccwl/ccwl.scm | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/ccwl/ccwl.scm b/ccwl/ccwl.scm index e49225a..5e97331 100644 --- a/ccwl/ccwl.scm +++ b/ccwl/ccwl.scm @@ -116,9 +116,39 @@ (string=? (input-id input1) (input-id input2))) +(define (auto-connect steps) + "Auto-connect STEPS by matching inputs to outputs using their unique +identifiers. If any inputs are already matched, they are not +re-matched." + (map (lambda (step) + (set-step-in step + (map (lambda (input) + ;; If input is already connected, return + ;; it unaltered. Else, try to connect it + ;; to a source. + (cond + ((input-source input) + input) + ;; Input that should be connected to + ;; some intermediate output + ((find (lambda (step) + (member (input-id input) + (map output-id (step-out step)))) + steps) + => (lambda (source-step) + (set-input-source input + (string-append (step-id source-step) + "/" (input-id input))))) + ;; Non-internal input that should be + ;; interfaced with the outside world + (else input))) + (step-in step)))) + steps)) + (define* (workflow id steps outputs #:key (other '())) "Build a Workflow class CWL workflow." - (let* ((inputs + (let* ((steps (auto-connect steps)) + (inputs ;; When the same input is used by multiple steps, there will ;; be duplicates. So, deduplicate. (delete-duplicates @@ -132,11 +162,7 @@ input=?)) ;; List of non-internal inputs that should be interfaced with ;; the outside world. - (interface-inputs - (filter (lambda (input) - (string=? (input-id input) - (input-source input))) - inputs))) + (interface-inputs (remove input-source inputs))) (make-step id `((cwlVersion . "v1.1") (class . Workflow) @@ -154,7 +180,8 @@ `(,(step-id step) (in . ,(map (lambda (input) (cons (input-id input) - (input-source input))) + (or (input-source input) + (input-id input)))) (step-in step))) (out . ,(list->vector (map output-id (step-out step)))) (run . ,(match (step-run step) |