 
 
 (defn clobber-passes
-  [ast]
-  (assoc ast :passes #{}))
+  [whole-ast]
+  (assoc whole-ast :passes #{}))

;; order.


;; Passes are then functions from Whole-ASTs to Whole-ASTs. For user
;; "friendliness" each pass shall also take an options argument which
;; may change the behavior of the pass by enabling or disabling a

  [whole-ast pass]
  (update-in whole-ast [:passes] conj pass))


(defn require-pass
  [whole-ast pass options]
  (if (contains? (:passes whole-ast) pass)
    whole-ast
    (pass whole-ast options)))


(defn do-passes
  [whole-ast options & passes]
  (reduce #(require-pass %1 %2 options)
          whole-ast passes))


;; To enable this pattern however, transforming passes are required to
