         ;; total-depth, on the other hand, is the depth all the way to the top of the entire
         ;; expression, which might involve several parent lightning bolts.
         parents
-        (let [parents (shuffle (candidate-parents grammar spec))]
+        (let [parents (lazy-seq (shuffle (candidate-parents grammar spec)))]
           (log/trace (str "lightning-bolts: candidate-parents:" (string/join "," (map :rule parents))))
           parents)]
     ;; TODO: use (defn get-lexemes) rather than this code which duplicates (get-lexemes)'s functionality.

                                        
;; during generation, will not decend deeper than this when creating a tree:
;; TODO: should also be possible to override per-language.
(def ^:const max-total-depth 6)

;; TODO support setting max-generated-complements to :unlimited
(def ^:const max-generated-complements 20000)

                                          complement-candidate-lexemes))))
               
        bolt-child-synsem (get-in bolt (concat path [:synsem]))
        lexical-complements (lazy-seq
                             (shuffle
                             (filter (fn [lexeme]
                                       (and (not-fail? (unify (get-in lexeme [:synsem] :top)
                                                              bolt-child-synsem))))
                                     complement-candidate-lexemes)))]
    (log/debug (str "lexical-complements (post-over):"
                    (string/join ","
                                 (map #((:morph language-model) %)
