PROMISE LISTS
(let [[reader writer] (open-plist)])
(append! writer (promise "puppies"))
(done
(first reader)
#(log "first: " %))
(done
(first reader)
!#(log "first (again): " %))
(done
!(nth reader 1)
!#(log "second: " %))
(append! writer (promise "ducklings"))
(close! writer)
(done
! (nth reader 2)
! #(log "after close nil?: " (nil? %)))
(done
! (first (closed-plist "owlet"))
! #(log "closed plist: " %))
(done
  (->> reader
       (map (fmap #(str "baby " %)))
       rest
       first)
  #(log "mapped: " %))
(done
!(reduce (fmap +)
!!(r/map (fmap inc)
!!!(closed-plist 1 2 3 4)))
   #(log "reduced: " %))
(done
!(first
!!(mapd* inc
!!!(closed-plist 1 2 3 4)))
!#(log "mapd*: " %))
(done
  (reduce (fmap conj) (promise [])
          (for-plist [a (closed-plist 1 2 3)
                      b (closed-plist 4 5 6)
                      v (closed-plist a b)]
           v))
  (comp log clj->js))

Promise list