             (nth keys i)
             (recur (inc i) (+ (counts i) sum)))))))
 
-(defn pick-words
+(defn- pick-words
   "Returns a lazy sequence of the next states from the start state, generated
   by repeatedly picking words."
   [counts]

          (recur datamap n (apply conj (rest continuations) new-conts))
          (recur datamap n (rest continuations))))))

(defn dfs-begin
  [{:keys [start counts] :as datamap} n]
  {:pre [(pos? n)]}
  (->> (pick-words start)

       (first)))

;; Tail-recursive
(defn- dive
  [state {:keys [counts] :as datamap} n depth cont]
  (if (>= (+ depth (count state)) n)
      (conj cont state)
      (let [result (conj (vec (rest state)) (pick-word (counts state)))]
        (recur result datamap n (inc depth) (conj cont state)))))

(defn- dfs-single
  [{:keys [start counts] :as datamap} n]
  {:pre [(pos? n)]}
  (prn "Diving!")
  (dive (pick-word start) datamap n 0 []))

(defn gen-sentence
