       (rm-nil-bulb)
       (rm-nil-parent-id)))
 
+(defn combine-users
+  [thread-data user bulb-users]
+  (let [users (:users thread-data)]
+    (-> users
+        (into (list user))
+        (into bulb-users)
+        (distinct))))
+
+(defn combine-replies
+  [thread-data reply]
+  (->> reply
+       (rm-nil-keys)
+       (list)
+       (into (:replies thread-data))))
+
+(defn update-thread-data
+  [thread-data replies users]
+  (-> thread-data
+      (assoc :replies replies)
+      (assoc :users   users)))
+
 (defn get-data-helper
   [rows reply-parents thread-data]
   (when (first rows)
-    (let [row            (first                 rows)
-          cols           (utils/get-cols        row)
-          reply-url      (get-reply-url         cols)
-          reply-id       (get-reply-id          reply-url)
-          reply-title    (get-reply-title       cols)
-          post-time      (get-reply-post-time   cols)
-          bulbs          (bulbs/get-data        reply-url)
-          user-url       (utils/get-user-url    cols)
-          user-id        (utils/get-user-id     user-url)
-          username       (utils/get-username    cols)
-          indent-level   (get-indent-level      cols)
+    (let [row            (first                rows)
+          cols           (utils/get-cols       row)
+          reply-url      (get-reply-url        cols)
+          reply-id       (get-reply-id         reply-url)
+          reply-title    (get-reply-title      cols)
+          post-time      (get-reply-post-time  cols)
+          bulbs          (bulbs/get-data       reply-url)
+          user-url       (utils/get-user-url   cols)
+          user-id        (utils/get-user-id    user-url)
+          username       (utils/get-username   cols)
+          indent-level   (get-indent-level     cols)
           reply-parents  (assoc reply-parents indent-level reply-id)
           parent-id      (get-parent-id indent-level reply-parents)
           user           {:id         user-id

                          :post-time  post-time
                          :user-id    user-id
                          :bulbs      bulbs}
          replies        (into (:replies thread-data) (list (rm-nil-keys reply)))
          users          (combine-users thread-data user bulb-users)
          thread-data    (update-thread-data thread-data replies users)]
      (merge thread-data (get-data-helper (rest rows) reply-parents thread-data)))))

(defn get-data-by-url
  [url]
  (web/set-driver! {:browser           :firefox
                    :profile           bo-ffprofile})
  (let [table        (get-replies-table  url)
        rows         (utils/get-rows     table)
        thread-id    (get-thread-id      url)
        thread-data  (get-data-helper rows [] {:replies '() :users '()})
        replies      (reverse (:replies thread-data))
        users        (:users   thread-data)
        data         {:thread {
                        :id       thread-id
                        :replies  (map :id replies)
                      }
                      :replies replies
                      :users   users}]
    (web/close)

    nil
    (get reply-levels (dec indent-level))))

(defn rm-nil-bulb
  [reply]
  (if (nil? (:bulbs reply))
