 
 (alter-meta! #'->Promise assoc :private true)
 
-
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Public Api
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defmulti ^:no-doc promise* class)

(defmethod promise* clojure.lang.IFn
  [func]
  (let [futura (CompletableFuture.)
        promise (Promise. futura)
        callback #(deliver promise %)]
    (try
      (func callback)
      (catch Throwable e
        (.completeExceptionally futura e)))
    promise))


  - throwable
  - plain value
  - factory function

  In case of the initial value is instance of `Throwable`, rejected
  promise will be retrned. In case of a plain value (not throwable),
