Merge branch 'intoperf' into fixes-2022
This commit is contained in:
commit
8191719956
1 changed files with 41 additions and 4 deletions
|
|
@ -7,9 +7,10 @@
|
||||||
:clj (:require [net.cgrand.macrovich :as macros]))
|
:clj (:require [net.cgrand.macrovich :as macros]))
|
||||||
(:refer-clojure :exclude [some reduce reductions into count for partition
|
(:refer-clojure :exclude [some reduce reductions into count for partition
|
||||||
str last keys vals min max drop-last take-last
|
str last keys vals min max drop-last take-last
|
||||||
sort sort-by time])
|
sort sort-by time satisfies?])
|
||||||
(:require [#?(:clj clojure.core :cljs cljs.core) :as core]
|
(:require [#?(:clj clojure.core :cljs cljs.core) :as core]
|
||||||
[net.cgrand.xforms.rfs :as rf])
|
[net.cgrand.xforms.rfs :as rf]
|
||||||
|
#?(:clj [clojure.core.protocols]))
|
||||||
#?(:cljs (:import [goog.structs Queue])))
|
#?(:cljs (:import [goog.structs Queue])))
|
||||||
|
|
||||||
(macros/deftime
|
(macros/deftime
|
||||||
|
|
@ -127,8 +128,44 @@
|
||||||
|
|
||||||
(macros/usetime
|
(macros/usetime
|
||||||
|
|
||||||
(defn kvreducible? [coll]
|
;; Workaround clojure.core/satisfies? being slow in Clojure
|
||||||
(satisfies? #?(:clj clojure.core.protocols/IKVReduce :cljs IKVReduce) coll))
|
;; see https://ask.clojure.org/index.php/3304/make-satisfies-as-fast-as-a-protocol-method-call
|
||||||
|
#?(:cljs
|
||||||
|
(def satisfies? core/satisfies?)
|
||||||
|
|
||||||
|
:bb
|
||||||
|
(def satisfies? core/satisfies?)
|
||||||
|
|
||||||
|
:clj
|
||||||
|
(defn fast-satisfies?-fn
|
||||||
|
"Ported from https://github.com/clj-commons/manifold/blob/37658e91f836047a630586a909a2e22debfbbfc6/src/manifold/utils.clj#L77-L89"
|
||||||
|
[protocol-var]
|
||||||
|
(let [^java.util.concurrent.ConcurrentHashMap classes
|
||||||
|
(java.util.concurrent.ConcurrentHashMap.)]
|
||||||
|
(add-watch protocol-var ::memoization (fn [& _] (.clear classes)))
|
||||||
|
(fn [x]
|
||||||
|
(let [cls (class x)
|
||||||
|
val (.get classes cls)]
|
||||||
|
(if (nil? val)
|
||||||
|
(let [val (core/satisfies? @protocol-var x)]
|
||||||
|
(.put classes cls val)
|
||||||
|
val)
|
||||||
|
val))))))
|
||||||
|
|
||||||
|
|
||||||
|
#?(:cljs
|
||||||
|
(defn kvreducible? [coll]
|
||||||
|
(satisfies? core/IKVReduce coll))
|
||||||
|
|
||||||
|
:clj
|
||||||
|
(let [satisfies-ikvreduce? #?(:bb #(satisfies? clojure.core.protocols/IKVReduce %)
|
||||||
|
:default (fast-satisfies?-fn #'clojure.core.protocols/IKVReduce))]
|
||||||
|
(if (satisfies-ikvreduce? (Object.))
|
||||||
|
(defn kvreducible?
|
||||||
|
"Clojure 1.11 makes everything satisfy IKVReduce, so we can short-circuit"
|
||||||
|
[_] true)
|
||||||
|
(defn kvreducible? [coll] (satisfies-ikvreduce? coll)))))
|
||||||
|
|
||||||
|
|
||||||
(extend-protocol KvRfable
|
(extend-protocol KvRfable
|
||||||
#?(:clj Object :cljs default) (some-kvrf [_] nil)
|
#?(:clj Object :cljs default) (some-kvrf [_] nil)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue