                   result))))
          bolts-at))
 
+(defn add-comps-using [bolt model path comp-paths bolts-at-paths depth max-depth top-bolt truncate? take-n]
+  (if (empty? comp-paths)
+    [bolt]
+    (mapfn (fn [bolt-at]
+             (let [result (add-bolt-at top-bolt bolt path bolt-at model depth max-depth truncate? take-n)])))))
+
 (defn add-comps
   "given a bolt, return the lazy sequence of all bolts derived from this bolt after adding,
    at each supplied path in comp-paths, the bolts for that path."

             bolt top-bolt model depth max-depth truncate? take-n)))))

(defn add-bolt-at [top-bolt bolt path bolt-at model depth max-depth truncate? & [take-n]]
  (mapfn #(do-defaults % model)
         (let [comp-paths (find-comp-paths bolt-at)]
           (mapfn #(assoc-in bolt path %)

(defn generate
  "Return one (by default) or _n_ (using :take _n_) expressions matching spec _spec_ given the model _model_."
  [spec language-model
   & {:keys [max-total-depth truncate-children lexicon take-n]
      :or {max-total-depth max-total-depth
           lexicon nil
           truncate-children true
           take-n 1}}]
  (log/debug (str "generate: spec: " spec "; take-n: " take-n))
  (let [depth 0
        spec
        (->
