     :ref (run-ref program node inputs stack)))
 
 (defn run-data [program node inputs stack]
+  (assert (empty? inputs))
+  (Cursor. [] (run-data* program node inputs stack)))
+
+(defn run-data* [program node inputs stack]
   (case (:kind node)
     :value (:value node)
     :vector (into []
                   (for [value (:value node)]
-                    (run-data program value inputs stack)))
+                    (run-data* program value inputs stack)))
     :map (into {}
                (for [[key value] (:value node)]
-                 [(run-data program key inputs stack) (run-data program value inputs stack)]))))
+                 [(run-data* program key inputs stack) (run-data* program value inputs stack)]))))
 
 (defn run-ref [program node inputs stack]
   (case (:kind node)
-    :cljs (apply (:fn node) inputs)
+    :cljs (Cursor. [] (apply (:fn node) (map :value inputs)))
     :pipe (run-pipe program (get program (:id node)) inputs stack)))
 
 (defrecord MatchFailure [])

(run-example example-c [1])
(run-example example-c [7])
(run-example example-c [10])

(.join (make-array 10) " ")

(defn print-stack
  ([frame]

(ns aurora.interpreter)

;; interpreter

(defrecord Cursor [path value])

(defn run-pipe [program node inputs stack]
  (let [vars #js {}
