         p1 (p/rejected e1)
         p2 (p/catch p1 (constantly nil))]
     (t/is (p/rejected? p1))
-    (t/is (= e1 (m/extract p1)))))
+    (t/is (= e1 (p/extract p1)))))
 
 (t/deftest promise-from-promise
   (let [p1 (p/promise 1)

(t/deftest first-monad-law-left-identity
  #?(:cljs
     (t/async done
       (let [p1 (m/pure p/promise-context 4)
             p2 (m/pure p/promise-context 4)
             vl  (m/>>= p2 #(m/pure p/promise-context %))]
         (p/then (p/all [p1 vl])
                 (fn [[v1 v2]]
                   (t/is (= v1 v2))
                   (done)))))
     :clj
     (let [p1 (m/pure p/promise-context 4)
           p2 (m/pure p/promise-context 4)
           vl  (m/>>= p2 #(m/pure p/promise-context %))]
       @(p/then (p/all [p1 vl])
                (fn [[v1 v2]]
                  (t/is (= v1 v2)))))))

  (p/promise (fn [_ reject]
               (p/schedule sleep #(reject value)))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Core Interface Tests
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(t/deftest promise-from-value
  (let [p1 (p/promise 1)]
    (t/is (p/done? p1))
    (t/is (= (p/extract p1) 1))))

(t/deftest promise-from-factory
  (let [p1 (p/promise (fn [resolve _] (resolve 1)))]
    #?(:clj (deref p1))
    (t/is (p/done? p1))
    (t/is (= (p/extract p1) 1))))

(t/deftest promise-async-factory
  #?(:cljs
