summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ccwl/ccwl.scm40
1 files changed, 39 insertions, 1 deletions
diff --git a/ccwl/ccwl.scm b/ccwl/ccwl.scm
index b1425f8..e49225a 100644
--- a/ccwl/ccwl.scm
+++ b/ccwl/ccwl.scm
@@ -12,7 +12,8 @@
             workflow
             input
             output
-            step))
+            step
+            pipeline))
 
 (define-immutable-record-type <input>
   (make-input id type label default binding source other)
@@ -48,6 +49,11 @@
   "Build and return an <output> object."
   (make-output id type binding source other))
 
+(define %stdin
+  (input "stdin" #:type 'File))
+
+(define %stdout
+  (output "stdout" #:type 'stdout))
 
 (define (input->tree input)
   "Convert INPUT, an <input> object, to a tree."
@@ -159,6 +165,38 @@
                interface-inputs
                outputs)))
 
+(define (pipeline id steps outputs)
+  ;; Error out if any step does not encapsulate a command.
+  (cond
+   ((find (lambda (step)
+            (not (command? (step-run step))))
+          steps)
+    => (lambda (step)
+         (error "Step does not encapsulate command" step))))
+  (workflow id
+            (reverse
+             (fold (lambda (step result)
+                     (match result
+                       ((previous-step tail ...)
+                        (cons*
+                         ;; Add an stdin input that is connected to the stdout
+                         ;; of the previous step.
+                         (let ((stdin (set-input-source %stdin
+                                        (string-append (step-id previous-step) "/" (output-id %stdout)))))
+                           (append-step-in (modify-step-run step
+                                                            (cut set-command-stdin <> stdin))
+                                           stdin))
+                         previous-step
+                         tail))
+                       (() (list step))))
+                   (list)
+                   ;; Add an stdout output to all steps.
+                   (map (lambda (step)
+                          (append-step-out (modify-step-run step (cut append-command-outputs <> %stdout))
+                                           %stdout))
+                        steps)))
+            outputs))
+
 (define (output->cwl output)
   `(,(output-id output)
     ,@(filter identity