Fix #40 x/sort & x/sort-by in cljs
This commit is contained in:
parent
1c209146bf
commit
d6edde7704
2 changed files with 21 additions and 2 deletions
|
|
@ -506,6 +506,23 @@
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
#?(:cljs
|
||||||
|
(defn ^:private fn->comparator
|
||||||
|
"Given a fn that might be boolean valued or a comparator,
|
||||||
|
return a fn that is a comparator.
|
||||||
|
|
||||||
|
Copied from cljs.core: https://github.com/clojure/clojurescript/blob/95c5cf384a128503b072b7b1916af1a1d5c8871c/src/main/cljs/cljs/core.cljs#L2459-L2471"
|
||||||
|
[f]
|
||||||
|
(if (= f compare)
|
||||||
|
compare
|
||||||
|
(fn [x y]
|
||||||
|
(let [r (f x y)]
|
||||||
|
(if (number? r)
|
||||||
|
r
|
||||||
|
(if r
|
||||||
|
-1
|
||||||
|
(if (f y x) 1 0))))))))
|
||||||
|
|
||||||
(defn sort
|
(defn sort
|
||||||
([] (sort compare))
|
([] (sort compare))
|
||||||
([cmp]
|
([cmp]
|
||||||
|
|
@ -513,7 +530,7 @@
|
||||||
(let [buf #?(:clj (java.util.ArrayList.) :cljs #js [])]
|
(let [buf #?(:clj (java.util.ArrayList.) :cljs #js [])]
|
||||||
(fn
|
(fn
|
||||||
([] (rf))
|
([] (rf))
|
||||||
([acc] (rf (core/reduce rf acc (doto buf #?(:clj (java.util.Collections/sort cmp) :cljs (.sort cmp))))))
|
([acc] (rf (core/reduce rf acc (doto buf #?(:clj (java.util.Collections/sort cmp) :cljs (.sort (fn->comparator cmp)))))))
|
||||||
([acc x] (#?(:clj .add :cljs .push) buf x) acc))))))
|
([acc x] (#?(:clj .add :cljs .push) buf x) acc))))))
|
||||||
|
|
||||||
(defn sort-by
|
(defn sort-by
|
||||||
|
|
|
||||||
|
|
@ -140,9 +140,11 @@
|
||||||
|
|
||||||
(deftest sorting
|
(deftest sorting
|
||||||
(is (= (range 100) (x/into [] (x/sort) (shuffle (range 100)))))
|
(is (= (range 100) (x/into [] (x/sort) (shuffle (range 100)))))
|
||||||
|
(is (= (range 100) (x/into [] (x/sort <) (shuffle (range 100)))))
|
||||||
(is (= (reverse (range 100)) (x/into [] (x/sort >) (shuffle (range 100)))))
|
(is (= (reverse (range 100)) (x/into [] (x/sort >) (shuffle (range 100)))))
|
||||||
(is (= (sort-by str (range 100)) (x/into [] (x/sort-by str) (shuffle (range 100)))))
|
(is (= (sort-by str (range 100)) (x/into [] (x/sort-by str) (shuffle (range 100)))))
|
||||||
(is (= (sort-by str (comp - compare) (range 100)) (x/into [] (x/sort-by str (comp - compare)) (shuffle (range 100))))))
|
(is (= (sort-by str (comp - compare) (range 100)) (x/into [] (x/sort-by str (comp - compare)) (shuffle (range 100)))))
|
||||||
|
(is (= (sort-by identity > (shuffle (range 100))) (x/into [] (x/sort-by identity >) (shuffle (range 100))))))
|
||||||
|
|
||||||
(deftest destructuring-pair?
|
(deftest destructuring-pair?
|
||||||
(let [destructuring-pair? #'x/destructuring-pair?]
|
(let [destructuring-pair? #'x/destructuring-pair?]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue