          :constraints ["fill,gap 18px,hidemode 3"])
         ev-chan (async/chan)
         ev-mult (async/mult ev-chan)
-        tap-creator (fn [predfn] (async/filter< predfn (async/tap ev-mult (async/chan))))
+        tap-creator (fn [pred] (async/filter< pred (async/tap ev-mult (async/chan))))
+        map-stream (fn [pred f]
+                     (let [tap (tap-creator pred)]
+                       (async/go-loop []
+                         (let [ev (async/<! tap)]
+                           (f ev)
+                           (recur)))))
+
         ]
-    (setup-events form ev-chan tap-creator)
+    (setup-events form ev-chan map-stream)
     (launch-tab ev-chan)
     form))

   :border (line-border :color "#ccc" :thickness 1)
   :minimum-size [400 :by 60]))

(defn setup-events [form event-chan create-tap]
  (listen (select form [:#publish-btn])
          :mouse-clicked (fn [e]
                           (when-let [posts (config (select form [:#publish-btn]) :user-data)]

                                               (dialog :content
                                                       (str "Successfully sent " (:value res) " posts"))))))))))))

  ;; setup 'latest post' label and progressbar
  (map-stream #(= :fa-post (:id %)) #(update-fa-post-widget % form))
  ;; when fa post is retrived, start fetching aw posts
  (map-stream #(and (= :fa-post (:id %)) (map? (:value %))) #(fetch-aw-posts % form)))

(defn launch-tab [event-chan]
  (let [c (async/chan)]
