Compare commits

...

4 Commits

Author SHA1 Message Date
Andrey Antukh
15c6bb70b6 WIP 2022-01-12 20:26:32 +01:00
Andrey Antukh
0f68210a16 WIP 2022-01-12 20:25:32 +01:00
Andrey Antukh
a72da38f6d 📎 Minor changes on :reg-objects impl. 2022-01-12 20:23:50 +01:00
Andrey Antukh
773e902a50 📎 Add perfrmance related helpers. 2022-01-12 20:23:25 +01:00
17 changed files with 1414 additions and 70 deletions

View File

@@ -34,4 +34,3 @@
:class-dir class-dir
:basis basis
:javac-opts ["-source" "11" "-target" "11"]}))

View File

@@ -56,7 +56,6 @@
clojure-humanize/clojure-humanize {:mvn/version "0.2.2"}
org.clojure/data.csv {:mvn/version "RELEASE"}
com.clojure-goes-fast/clj-async-profiler {:mvn/version "RELEASE"}
criterium/criterium {:mvn/version "RELEASE"}
mockery/mockery {:mvn/version "RELEASE"}}
:extra-paths ["test" "dev"]}

View File

@@ -0,0 +1,133 @@
package app;
import clojure.lang.Seqable;
import clojure.lang.RT;
import clojure.lang.ISeq;
import clojure.lang.ILookup;
import clojure.lang.Keyword;
// static public double[] multiply(final double[] m1, final double m2[]) {
// var result = new double[6];
// result[0] = (m1[0] * m2[0]) + (m1[2] * m2[1]);
// result[1] = (m1[1] * m2[0]) + (m1[3] * m2[1]);
// result[2] = (m1[0] * m2[2]) + (m1[2] * m2[3]);
// result[3] = (m1[1] * m2[2]) + (m1[3] * m2[3]);o
// result[4] = (m1[0] * m2[4]) + (m1[2] * m2[5]) + m1[4];
// result[5] = (m1[1] * m2[4]) + (m1[3] * m2[5]) + m1[5];
// return result;
// }
public class Experiments {
static public class Matrix implements Seqable, ILookup {
public final double[] buff;
public Matrix(double a, double b, double c, double d, double e, double f) {
buff = new double[6];
buff[0] = a;
buff[1] = b;
buff[2] = c;
buff[3] = d;
buff[4] = e;
buff[5] = f;
}
public Matrix(final double [] otherBuffer) {
buff = otherBuffer;
}
public ISeq seq() {
return RT.seq(this.buff);
}
public Double valAt(final Object key) {
var name = ((Keyword) key).getName();
switch(name) {
case "a": return this.buff[0];
case "b": return this.buff[1];
case "c": return this.buff[2];
case "d": return this.buff[3];
case "e": return this.buff[4];
default: return this.buff[5];
}
}
public Double valAt(final Object key, Object notFound) {
throw new IllegalArgumentException("not supported");
}
}
static public Matrix create(double a, double b, double c, double d, double e, double f) {
var buff = new double[6];
buff[0] = a;
buff[1] = b;
buff[2] = c;
buff[3] = d;
buff[4] = e;
buff[5] = f;
return new Matrix(buff);
}
static public Matrix multiply(final Matrix mt1, final Matrix mt2) {
var result = new double[6];
var m1 = mt1.buff;
var m2 = mt1.buff;
result[0] = (m1[0] * m2[0]) + (m1[2] * m2[1]);
result[1] = (m1[1] * m2[0]) + (m1[3] * m2[1]);
result[2] = (m1[0] * m2[2]) + (m1[2] * m2[3]);
result[3] = (m1[1] * m2[2]) + (m1[3] * m2[3]);
result[4] = (m1[0] * m2[4]) + (m1[2] * m2[5]) + m1[4];
result[5] = (m1[1] * m2[4]) + (m1[3] * m2[5]) + m1[5];
return new Matrix(result);
}
static private void multiplyMutating(final double[] m1, final double[] m2) {
var m1a = m1[0];
var m1b = m1[1];
var m1c = m1[2];
var m1d = m1[3];
var m1e = m1[4];
var m1f = m1[5];
double[] result = m1;
result[0] = (m1a * m2[0]) + (m1c * m2[1]);
result[1] = (m1b * m2[0]) + (m1d * m2[1]);
result[2] = (m1a * m2[2]) + (m1c * m2[3]);
result[3] = (m1b * m2[2]) + (m1d * m2[3]);
result[4] = (m1a * m2[4]) + (m1c * m2[5]) + m1e;
result[5] = (m1b * m2[4]) + (m1d * m2[5]) + m1f;
}
static public Matrix multiplyBulk(final Matrix m1) {
return m1;
}
static public Matrix multiplyBulk(final Matrix m1, final Matrix m2) {
return multiply(m1, m2);
}
static public Matrix multiplyBulk(final Matrix m1, final Matrix m2, final Matrix m3) {
var result = multiply(m1, m2);
multiplyMutating(result.buff, m3.buff);
return result;
}
static public Matrix multiplyBulk(final Matrix m1, final Matrix m2, final Matrix m3, final Matrix m4) {
var result = multiply(m1, m2);
multiplyMutating(result.buff, m3.buff);
multiplyMutating(result.buff, m4.buff);
return result;
};
static public Matrix multiplyBulk(final Matrix m1, final Matrix m2, final Matrix m3, final Matrix m4, final Matrix m5) {
var result = multiply(m1, m2);
multiplyMutating(result.buff, m3.buff);
multiplyMutating(result.buff, m4.buff);
multiplyMutating(result.buff, m5.buff);
return result;
}
}

View File

@@ -6,18 +6,20 @@
(ns user
(:require
[datoteka.core]
[app.common.exceptions :as ex]
[app.common.geom.matrix :as gmt]
[app.common.perf :as perf]
[app.common.transit :as t]
[app.config :as cfg]
[app.main :as main]
[app.util.blob :as blob]
[app.util.json :as json]
[app.util.fressian :as fres]
[app.util.json :as json]
[app.util.time :as dt]
[app.common.transit :as t]
[clj-async-profiler.core :as prof]
[clojure.contrib.humanize :as hum]
[clojure.java.io :as io]
[clojure.pprint :refer [pprint print-table]]
[clojure.contrib.humanize :as hum]
[clojure.repl :refer :all]
[clojure.spec.alpha :as s]
[clojure.spec.gen.alpha :as sgen]
@@ -25,8 +27,7 @@
[clojure.test :as test]
[clojure.tools.namespace.repl :as repl]
[clojure.walk :refer [macroexpand-all]]
[clj-async-profiler.core :as prof]
[criterium.core :refer [quick-bench bench with-progress-reporting]]
[datoteka.core]
[integrant.core :as ig]))
(repl/disable-reload! (find-ns 'integrant.core))
@@ -34,24 +35,6 @@
(defonce system nil)
;; --- Benchmarking Tools
(defmacro run-quick-bench
[& exprs]
`(with-progress-reporting (quick-bench (do ~@exprs) :verbose)))
(defmacro run-quick-bench'
[& exprs]
`(quick-bench (do ~@exprs)))
(defmacro run-bench
[& exprs]
`(with-progress-reporting (bench (do ~@exprs) :verbose)))
(defmacro run-bench'
[& exprs]
`(bench (do ~@exprs)))
;; --- Development Stuff
(defn- run-tests
@@ -109,3 +92,64 @@
(add-tap #(locking debug-tap
(prn "tap debug:" %)))
1))
;; (import
;; 'app.Experiments
;; 'app.Experiments$Matrix)
;; (defn bench-matrix-multiply
;; []
;; (let [ma1 (Experiments/create 1 2 3 4 5 6)
;; ma2 (Experiments/create 6 5 4 3 2 1)]
;; (perf/benchmark
;; :f (fn []
;; (dotimes [i 100]
;; (when-not (Experiments/multiply ma1 ma2)
;; (throw (ex-info "foobar" {}))))
;; :result)
;; :name "java matrix"))
;; (let [ma1 (gmt/matrix 1 2 3 4 5 6)
;; ma2 (gmt/matrix 6 5 4 3 2 1)]
;; (perf/benchmark
;; :f (fn []
;; (dotimes [i 100]
;; (when-not (gmt/multiply ma1 ma2)
;; (throw (ex-info "foobar" {}))))
;; :result)
;; :name "orig matrix")))
;; (defn bench-matrix-multiply-bulk-5
;; []
;; (let [ma1 (Experiments/create 1 2 3 4 5 6)
;; ma2 (Experiments/create 6 5 4 3 2 1)
;; ma3 (Experiments/create 9 8 7 6 5 4)
;; ma4 (Experiments/create 7 6 5 4 3 2)
;; ma5 (Experiments/create 1 9 2 8 4 7)]
;; (prn "result1" (seq (Experiments/multiplyBulk ma1 ma2 ma3 ma4 ma5)))
;; (perf/benchmark
;; :f (fn []
;; (dotimes [i 100]
;; (when-not (Experiments/multiplyBulk ma1 ma2 ma3 ma4 ma5)
;; (throw (ex-info "foobar" {}))))
;; :result)
;; :name "java matrix"))
;; (let [ma1 (gmt/matrix 1 2 3 4 5 6)
;; ma2 (gmt/matrix 6 5 4 3 2 1)
;; ma3 (gmt/matrix 9 8 7 6 5 4)
;; ma4 (gmt/matrix 7 6 5 4 3 2)
;; ma5 (gmt/matrix 1 9 2 8 4 7)]
;; (prn "result2" (map second (gmt/multiply ma1 ma2 ma3 ma4 ma5)))
;; (perf/benchmark
;; :f (fn []
;; (dotimes [i 100]
;; (when-not (gmt/multiply ma1 ma2 ma3 ma4 ma5)
;; (throw (ex-info "foobar" {}))))
;; :result)
;; :name "orig matrix")))

View File

@@ -8,7 +8,11 @@ export OPTIONS="
-J-Dlog4j2.configurationFile=log4j2-devenv.xml \
-J-XX:+UseZGC \
-J-XX:-OmitStackTraceInFastThrow \
-J-Xms50m -J-Xmx512m";
-J-Xms50m -J-Xmx512m \
-J-Djdk.attach.allowAttachSelf \
-J-XX:+UnlockDiagnosticVMOptions \
-J-XX:+DebugNonSafepoints";
# export OPTIONS="$OPTIONS -J-XX:+UnlockDiagnosticVMOptions";
# export OPTIONS="$OPTIONS -J-XX:-TieredCompilation -J-XX:CompileThreshold=10000";

View File

@@ -14,6 +14,8 @@
org.slf4j/slf4j-api {:mvn/version "2.0.0-alpha1"}
selmer/selmer {:mvn/version "1.12.48"}
criterium/criterium {:mvn/version "0.4.6"}
expound/expound {:mvn/version "0.8.10"}
com.cognitect/transit-clj {:mvn/version "1.0.324"}
com.cognitect/transit-cljs {:mvn/version "0.8.269"}

View File

@@ -13,6 +13,7 @@
"test": "yarn run compile-test && yarn run run-test"
},
"devDependencies": {
"shadow-cljs": "2.16.9",
"source-map-support": "^0.5.19",
"ws": "^7.4.6"
}

View File

@@ -17,6 +17,18 @@
:source-map true
:source-map-include-sources-content true
:source-map-detail-level :all
:warnings {:fn-deprecated false}}}}}
:warnings {:fn-deprecated false}}}
:bench
{:target :node-script
:output-to "target/bench.js"
:output-dir "target/bench/"
:main bench/main
:devtools {:autoload false}
:compiler-options
{:output-feature-set :es-next
:output-wrapper false}}}
}

View File

@@ -0,0 +1,65 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Copyright (c) UXBOX Labs SL
*/
"use strict";
goog.require("cljs.core");
goog.provide("app.common.geom.impl.matrix");
goog.scope(function() {
const self = app.common.geom.impl.matrix;
self.create = function(a, b, c, d, e, f) {
const matrix = new Float64Array(6);
matrix[0] = a;
matrix[1] = b;
matrix[2] = c;
matrix[3] = d;
matrix[4] = e;
matrix[5] = f;
return matrix;
}
// result[0] = (m1[0] * m2[0]) + (m1[2] * m2[1]);
// result[1] = (m1[1] * m2[0]) + (m1[3] * m2[1]);
// result[2] = (m1[0] * m2[2]) + (m1[2] * m2[3]);
// result[3] = (m1[1] * m2[2]) + (m1[3] * m2[3]);
// result[4] = (m1[0] * m2[4]) + (m1[2] * m2[5]) + m1[4];
// result[5] = (m1[1] * m2[4]) + (m1[3] * m2[5]) + m1[5];
self.multiply = function(m1, m2) {
// var result = new Float64Array(6);
// var m1a = m1[0];
// var m1b = m1[1];
// var m1c = m1[2];
// var m1d = m1[3];
// var m1e = m1[4];
// var m1f = m1[5];
// var m2a = m2[0];
// var m2b = m2[1];
// var m2c = m2[2];
// var m2d = m2[3];
// var m2e = m2[4];
// var m2f = m2[5];
// result[0] = (m1a * m2a) + (m1c * m2b);
// result[1] = (m1b * m2a) + (m1d * m2b);
// result[2] = (m1a * m2c) + (m1c * m2d);
// result[3] = (m1b * m2c) + (m1d * m2d);
// result[4] = (m1a * m2e) + (m1c * m2f) + m1e;
// result[5] = (m1b * m2e) + (m1d * m2f) + m1f;
// return result;
return m1;
}
});

View File

@@ -0,0 +1,111 @@
(ns app.common.namedtuple
"General purpose small immutable colections backed by native arrays."
(:require
#?(:cljs [cljs.core :as c]
:clj [clojure.core :as c])
[clojure.string :as str]))
(defmacro deftuple
[nsym fields]
(let [sbuff (symbol "buff")
sfields (symbol "fields")
smeta (symbol "meta")
params (into [] (comp (map name)
(map gensym))
fields)
tmpbuf (gensym "buff")
f1name (symbol (str "make-" (str/lower-case (name nsym))))]
`(do
(deftype ~nsym [~sbuff ~smeta]
;; Object
;; (toString [_#] (pr-str ~sbuff))
;; (equiv [_# other#] false)
c/ICloneable
(~'-clone [_#] (new ~nsym (aclone ~sbuff) ~smeta))
c/IWithMeta
(~'-with-meta [this# new-meta#]
(if (identical? new-meta# ~smeta)
this#
(new ~nsym ~sbuff new-meta#)))
c/IMeta
(~'-meta [_#] ~smeta)
c/ICollection
(~'-conj [_# entry#]
(conj (vec ~sbuff) entry#))
c/IEmptyableCollection
(~'-empty [_#]
(let [len# (alength ~sbuff)
buff# (make-array len#)]
(dotimes [i# len#]
(aset buff# i# nil))
(new ~nsym buff# ~smeta)))
c/ISeqable
(~'-seq [_#] (seq ~sbuff))
c/IAssociative
(~'-assoc [this# k# v#]
(let [index# (case k#
~@(mapcat (fn [i n] [i n])
fields
(range (count fields)))
(throw (ex-info "invalid key" {})))
buff# (aclone ~sbuff)]
(aset buff# index# v#)
(new ~nsym buff# ~smeta)))
(~'-contains-key? [_# k#]
(case k#
~@(mapcat (fn [n] [n true]) fields)
false))
c/ICounted
(~'-count [_#]
(alength ~sbuff))
c/ILookup
(~'-lookup [_# k#]
(case k#
~@(mapcat (fn [n i] [n `(aget ~sbuff ~i)])
fields
(range (count fields)))
nil))
(~'-lookup [this# k# not-found#]
(or (case k#
~@(mapcat (fn [n i] [n `(aget ~sbuff ~i)])
fields
(range (count fields)))
nil)
not-found#))
c/IPrintWithWriter
(~'-pr-writer [this# writer# _#]
(c/-write writer# (str "#penpot/namedtuple"
(pr-str (into {} [~@(map (fn [k i]
[k `(aget ~sbuff ~i)])
fields
(range (count fields)))])))))
c/IFn
(~'-invoke [this# k#]
(c/-lookup this# k#))
(~'-invoke [this# k# not-found#]
(c/-lookup this# k# not-found#)))
(defn ~f1name ~params
(let [~tmpbuf (js/Float64Array. 6)]
~@(map-indexed (fn [i x] `(aset ~tmpbuf ~i ~x)) params)
;; (js/console.log buff#)
(new ~nsym ~tmpbuf nil)))
)))

View File

@@ -156,28 +156,35 @@
[data {:keys [page-id component-id shapes]}]
;; FIXME: Improve performance
(letfn [(reg-objects [objects]
(reduce #(d/update-when %1 %2 update-group %1) objects
(sequence (comp
(mapcat #(cons % (cph/get-parents % objects)))
(map #(get objects %))
(filter #(contains? #{:group :bool} (:type %)))
(map :id)
(distinct))
shapes)))
(let [lookup (d/getf objects)
update-fn #(d/update-when %1 %2 update-group %1)
xform (comp
(mapcat #(cons % (cph/get-parents % objects)))
(map lookup)
(filter #(contains? #{:group :bool} (:type %)))
(map :id)
(distinct))]
(->> (sequence xform shapes)
(reduce update-fn objects))))
(set-mask-selrect [group children]
(let [mask (first children)]
(-> group
(merge (select-keys mask [:selrect :points]))
(assoc :x (-> mask :selrect :x)
:y (-> mask :selrect :y)
:width (-> mask :selrect :width)
:height (-> mask :selrect :height)
:flip-x (-> mask :flip-x)
:flip-y (-> mask :flip-y)))))
(assoc :selrect (-> mask :selrect))
(assoc :points (-> mask :points))
(assoc :x (-> mask :selrect :x))
(assoc :y (-> mask :selrect :y))
(assoc :width (-> mask :selrect :width))
(assoc :height (-> mask :selrect :height))
(assoc :flip-x (-> mask :flip-x))
(assoc :flip-y (-> mask :flip-y)))))
(update-group [group objects]
(let [children (->> group :shapes (map #(get objects %)))]
(let [lookup (d/getf objects)
children (->> group :shapes (map lookup))]
(cond
;; If the group is empty we don't make any changes. Should be removed by a later process
;; If the group is empty we don't make any changes. Will be removed by a later process
(empty? children)
group

View File

@@ -1,6 +1,8 @@
(ns app.common.perf
(:require
#?(:cljs [app.common.math :as mth])
[app.common.math :as mth]
#?(:clj [criterium.core :as cri])
[cuerdas.core :as str]
[app.common.uuid :as uuid]))
(defn timestamp []
@@ -21,35 +23,97 @@
[key]
(- (timestamp) (get @measures key)))
(def s-to-ns (* 1000 1000 1000))
(def default-jvm-bench-options
{:max-gc-attempts 100
:samples 10
:target-execution-time (* 1 s-to-ns)
:warmup-jit-period (* 1 s-to-ns)
:tail-quantile 0.025
:overhead 0
:bootstrap-size 500})
(defn scale-time
"Determine a scale factor and unit for displaying a time."
[measurement]
(cond
(> measurement 60) [(/ 60) "min"]
(< measurement 1e-6) [1e9 "ns"]
(< measurement 1e-3) [1e6 "µs"]
(< measurement 1) [1e3 "ms"]
:else [1 "sec"]))
(defn format-time
[value]
(let [[scale unit] (scale-time value)]
(str/format "%s%s" (mth/precision (* scale value) 2) unit)))
(defn benchmark
"A helper function for perform a unitari benchmark on JS/CLJS. It
uses browser native api so it only suitable to be executed in
browser."
[& _options]
[& {:keys [f name target samples max-iterations]
:or {name "unnamed"
samples 10
target 1
max-iterations 100000}
:as options}]
#?(:cljs
(let [{:keys [f iterations name]
:or {iterations 10000}} _options
end-mark (str name ":end")]
(let [start-mark (str name ":start")
end-mark (str name ":end")
measure-name (str name ":measure")
exec-and-measure
(fn []
(let [t0 (js/performance.now)
x (f)
t1 (js/performance.now)]
(when-not x
(throw (ex-info "missing return value" {})))
(/ (- t1 t0) 1000)))
calculate-iterations
(fn [single-duration minimum]
(let [result (mth/floor (/ (* samples target) (max (exec-and-measure) minimum)))]
(min result max-iterations)))
iterations
(atom (calculate-iterations (exec-and-measure) 0.0001))]
(println "=> benchmarking:" name)
(println "--> warming up:" iterations)
(loop [i iterations]
(when (pos? i)
(f)
(recur (dec i))))
(println "--> benchmarking:" iterations)
(js/performance.mark name)
(loop [i iterations]
(when (pos? i)
(f)
(recur (dec i))))
(js/performance.measure end-mark name)
(let [[result] (js/performance.getEntriesByName end-mark)
duration (mth/precision (.-duration ^js result) 6)
avg (mth/precision (/ duration iterations) 6)]
(println "--> TOTAL:" (str duration "ms") "AVG:" (str avg "ms"))
(js/performance.clearMarks name)
(js/performance.clearMeasures end-mark)
#js {:duration duration
:avg avg}))))
(println "--> WARM: " @iterations)
(loop [i 0 t 0]
(if (< i @iterations)
(let [measure (exec-and-measure)]
(recur (inc i) (+ t measure)))
(do
(reset! iterations (calculate-iterations (/ t @iterations) 0.00001)))))
(println "--> BENCH:" @iterations)
;; benchmarking
(loop [i 0 t 0]
(if (< i @iterations)
(recur (inc i) (+ t (exec-and-measure)))
(let [mean (/ t @iterations)]
(println "--> TOTAL:" (format-time t))
(println "--> MEAN: " (format-time mean)))))
nil)
:clj
(do
(println "=> benchmarking:" name)
(let [result (cri/benchmark* f (assoc default-jvm-bench-options
:samples samples
:target-execution-time (* target s-to-ns)
:warmup-jit-period (* target s-to-ns)))
iterations (:execution-count result)
total (:total-time result)
mean (first (:sample-mean result))]
(println "--> BENCH:" iterations)
(println "--> TOTAL:" (format-time total))
(println "--> MEAN: " (format-time mean)))
nil)))

View File

@@ -2,16 +2,556 @@
# yarn lockfile v1
asn1.js@^5.2.0:
version "5.4.1"
resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
dependencies:
bn.js "^4.0.0"
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
safer-buffer "^2.1.0"
assert@^1.1.1:
version "1.5.0"
resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
dependencies:
object-assign "^4.1.1"
util "0.10.3"
base64-js@^1.0.2:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
version "4.12.0"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
bn.js@^5.0.0, bn.js@^5.1.1:
version "5.2.0"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
brorand@^1.0.1, brorand@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
browserify-aes@^1.0.0, browserify-aes@^1.0.4:
version "1.2.0"
resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
dependencies:
buffer-xor "^1.0.3"
cipher-base "^1.0.0"
create-hash "^1.1.0"
evp_bytestokey "^1.0.3"
inherits "^2.0.1"
safe-buffer "^5.0.1"
browserify-cipher@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
dependencies:
browserify-aes "^1.0.4"
browserify-des "^1.0.0"
evp_bytestokey "^1.0.0"
browserify-des@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
dependencies:
cipher-base "^1.0.1"
des.js "^1.0.0"
inherits "^2.0.1"
safe-buffer "^5.1.2"
browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
version "4.1.0"
resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
dependencies:
bn.js "^5.0.0"
randombytes "^2.0.1"
browserify-sign@^4.0.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
dependencies:
bn.js "^5.1.1"
browserify-rsa "^4.0.1"
create-hash "^1.2.0"
create-hmac "^1.1.7"
elliptic "^6.5.3"
inherits "^2.0.4"
parse-asn1 "^5.1.5"
readable-stream "^3.6.0"
safe-buffer "^5.2.0"
browserify-zlib@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
dependencies:
pako "~1.0.5"
buffer-from@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
buffer-xor@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
buffer@^4.3.0:
version "4.9.2"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8"
integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==
dependencies:
base64-js "^1.0.2"
ieee754 "^1.1.4"
isarray "^1.0.0"
builtin-status-codes@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
dependencies:
inherits "^2.0.1"
safe-buffer "^5.0.1"
console-browserify@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
constants-browserify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
core-util-is@~1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
create-ecdh@^4.0.0:
version "4.0.4"
resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
dependencies:
bn.js "^4.1.0"
elliptic "^6.5.3"
create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
dependencies:
cipher-base "^1.0.1"
inherits "^2.0.1"
md5.js "^1.3.4"
ripemd160 "^2.0.1"
sha.js "^2.4.0"
create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
dependencies:
cipher-base "^1.0.3"
create-hash "^1.1.0"
inherits "^2.0.1"
ripemd160 "^2.0.0"
safe-buffer "^5.0.1"
sha.js "^2.4.8"
crypto-browserify@^3.11.0:
version "3.12.0"
resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
dependencies:
browserify-cipher "^1.0.0"
browserify-sign "^4.0.0"
create-ecdh "^4.0.0"
create-hash "^1.1.0"
create-hmac "^1.1.0"
diffie-hellman "^5.0.0"
inherits "^2.0.1"
pbkdf2 "^3.0.3"
public-encrypt "^4.0.0"
randombytes "^2.0.0"
randomfill "^1.0.3"
des.js@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
dependencies:
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
diffie-hellman@^5.0.0:
version "5.0.3"
resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
dependencies:
bn.js "^4.1.0"
miller-rabin "^4.0.0"
randombytes "^2.0.0"
domain-browser@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
elliptic@^6.5.3:
version "6.5.4"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
dependencies:
bn.js "^4.11.9"
brorand "^1.1.0"
hash.js "^1.0.0"
hmac-drbg "^1.0.1"
inherits "^2.0.4"
minimalistic-assert "^1.0.1"
minimalistic-crypto-utils "^1.0.1"
events@^3.0.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
dependencies:
md5.js "^1.3.4"
safe-buffer "^5.1.1"
hash-base@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
dependencies:
inherits "^2.0.4"
readable-stream "^3.6.0"
safe-buffer "^5.2.0"
hash.js@^1.0.0, hash.js@^1.0.3:
version "1.1.7"
resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
dependencies:
inherits "^2.0.3"
minimalistic-assert "^1.0.1"
hmac-drbg@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
dependencies:
hash.js "^1.0.3"
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.1"
https-browserify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
ieee754@^1.1.4:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
inherits@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
inherits@2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
isarray@^1.0.0, isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
luxon@^1.27.0:
version "1.27.0"
resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.27.0.tgz#ae10c69113d85dab8f15f5e8390d0cbeddf4f00f"
integrity sha512-VKsFsPggTA0DvnxtJdiExAucKdAnwbCCNlMM5ENvHlxubqWd0xhZcdb4XgZ7QFNhaRhilXCFxHuoObP5BNA4PA==
md5.js@^1.3.4:
version "1.3.5"
resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
dependencies:
hash-base "^3.0.0"
inherits "^2.0.1"
safe-buffer "^5.1.2"
miller-rabin@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
dependencies:
bn.js "^4.0.0"
brorand "^1.0.1"
minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
minimalistic-crypto-utils@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
node-libs-browser@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
dependencies:
assert "^1.1.1"
browserify-zlib "^0.2.0"
buffer "^4.3.0"
console-browserify "^1.1.0"
constants-browserify "^1.0.0"
crypto-browserify "^3.11.0"
domain-browser "^1.1.1"
events "^3.0.0"
https-browserify "^1.0.0"
os-browserify "^0.3.0"
path-browserify "0.0.1"
process "^0.11.10"
punycode "^1.2.4"
querystring-es3 "^0.2.0"
readable-stream "^2.3.3"
stream-browserify "^2.0.1"
stream-http "^2.7.2"
string_decoder "^1.0.0"
timers-browserify "^2.0.4"
tty-browserify "0.0.0"
url "^0.11.0"
util "^0.11.0"
vm-browserify "^1.0.1"
object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
os-browserify@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
pako@~1.0.5:
version "1.0.11"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
parse-asn1@^5.0.0, parse-asn1@^5.1.5:
version "5.1.6"
resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
dependencies:
asn1.js "^5.2.0"
browserify-aes "^1.0.0"
evp_bytestokey "^1.0.0"
pbkdf2 "^3.0.3"
safe-buffer "^5.1.1"
path-browserify@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
pbkdf2@^3.0.3:
version "3.1.2"
resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
dependencies:
create-hash "^1.1.2"
create-hmac "^1.1.4"
ripemd160 "^2.0.1"
safe-buffer "^5.0.1"
sha.js "^2.4.8"
process-nextick-args@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
process@^0.11.10:
version "0.11.10"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
public-encrypt@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
dependencies:
bn.js "^4.1.0"
browserify-rsa "^4.0.0"
create-hash "^1.1.0"
parse-asn1 "^5.0.0"
randombytes "^2.0.1"
safe-buffer "^5.1.2"
punycode@1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
punycode@^1.2.4:
version "1.4.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
querystring-es3@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
querystring@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
version "2.1.0"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
dependencies:
safe-buffer "^5.1.0"
randomfill@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
dependencies:
randombytes "^2.0.5"
safe-buffer "^5.1.0"
readable-stream@^2.0.2, readable-stream@^2.3.3, readable-stream@^2.3.6:
version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
isarray "~1.0.0"
process-nextick-args "~2.0.0"
safe-buffer "~5.1.1"
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
readable-stream@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
readline-sync@^1.4.7:
version "1.4.10"
resolved "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.10.tgz#41df7fbb4b6312d673011594145705bf56d8873b"
integrity sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==
ripemd160@^2.0.0, ripemd160@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
dependencies:
hash-base "^3.0.0"
inherits "^2.0.1"
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safer-buffer@^2.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
setimmediate@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
sha.js@^2.4.0, sha.js@^2.4.8:
version "2.4.11"
resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
dependencies:
inherits "^2.0.1"
safe-buffer "^5.0.1"
shadow-cljs-jar@1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/shadow-cljs-jar/-/shadow-cljs-jar-1.3.2.tgz#97273afe1747b6a2311917c1c88d9e243c81957b"
integrity sha512-XmeffAZHv8z7451kzeq9oKh8fh278Ak+UIOGGrapyqrFBB773xN8vMQ3O7J7TYLnb9BUwcqadKkmgaq7q6fhZg==
shadow-cljs@2.16.9:
version "2.16.9"
resolved "https://registry.yarnpkg.com/shadow-cljs/-/shadow-cljs-2.16.9.tgz#37c8858805f0124c462808fed87a9325e7a6a0f7"
integrity sha512-Z6exIrFT1twuX7a63xiNWmebLCr1sH6BufTz0oQw72KuC9iCpTG/bbRc59pC868eSDD7X2F6dNoUaaFOacWWSg==
dependencies:
node-libs-browser "^2.2.1"
readline-sync "^1.4.7"
shadow-cljs-jar "1.3.2"
source-map-support "^0.4.15"
which "^1.3.1"
ws "^7.4.6"
source-map-support@^0.4.15:
version "0.4.18"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
dependencies:
source-map "^0.5.6"
source-map-support@^0.5.19:
version "0.5.19"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
@@ -20,12 +560,111 @@ source-map-support@^0.5.19:
buffer-from "^1.0.0"
source-map "^0.6.0"
source-map@^0.5.6:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
source-map@^0.6.0:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
stream-browserify@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
dependencies:
inherits "~2.0.1"
readable-stream "^2.0.2"
stream-http@^2.7.2:
version "2.8.3"
resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
dependencies:
builtin-status-codes "^3.0.0"
inherits "^2.0.1"
readable-stream "^2.3.6"
to-arraybuffer "^1.0.0"
xtend "^4.0.0"
string_decoder@^1.0.0, string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
dependencies:
safe-buffer "~5.1.0"
timers-browserify@^2.0.4:
version "2.0.12"
resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee"
integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==
dependencies:
setimmediate "^1.0.4"
to-arraybuffer@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
tty-browserify@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
url@^0.11.0:
version "0.11.0"
resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
dependencies:
punycode "1.3.2"
querystring "0.2.0"
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
util@0.10.3:
version "0.10.3"
resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk=
dependencies:
inherits "2.0.1"
util@^0.11.0:
version "0.11.1"
resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61"
integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
dependencies:
inherits "2.0.3"
vm-browserify@^1.0.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
which@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
dependencies:
isexe "^2.0.0"
ws@^7.4.6:
version "7.4.6"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
xtend@^4.0.0:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==

View File

@@ -20,10 +20,17 @@
{:extra-deps {com.github.liquidz/antq {:mvn/version "RELEASE"}}
:main-opts ["-m" "antq.core"]}
:jvm-repl
{:extra-deps
{com.bhauman/rebel-readline {:mvn/version "RELEASE"}}
:main-opts ["-m" "rebel-readline.main"]}
:dev
{:extra-paths ["dev"]
:extra-deps
{thheller/shadow-cljs {:mvn/version "2.16.10"}
org.clojure/tools.namespace {:mvn/version "RELEASE"}
cider/cider-nrepl {:mvn/version "0.27.4"}}}
:shadow-cljs

12
frontend/dev/user.clj Normal file
View File

@@ -0,0 +1,12 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
(ns user
(:require
[clojure.pprint :refer [pprint print-table]]
[clojure.repl :refer :all]
[clojure.tools.namespace.repl :as repl]
[clojure.walk :refer [macroexpand-all]]))

View File

@@ -0,0 +1,107 @@
(ns app.util.namedtuple
"General purpose small immutable colections backed by native arrays."
(:require
[cljs.core :as c]
[clojure.string :as str]))
(defmacro deftuple
[nsym fields]
(let [sbuff (symbol "buff")
sfields (symbol "fields")
smeta (symbol "meta")
params (into [] (comp (map name)
(map gensym))
fields)
f1name (symbol (str "make-" (str/lower-case (name nsym))))]
`(do
(deftype ~nsym [~sbuff ~smeta]
;; Object
;; (toString [_#] (pr-str ~sbuff))
;; (equiv [_# other#] false)
c/ICloneable
(~'-clone [_#] (new ~nsym (aclone ~sbuff) ~smeta))
c/IWithMeta
(~'-with-meta [this# new-meta#]
(if (identical? new-meta# ~smeta)
this#
(new ~nsym ~sbuff new-meta#)))
c/IMeta
(~'-meta [_#] ~smeta)
c/ICollection
(~'-conj [_# entry#]
(conj (vec ~sbuff) entry#))
c/IEmptyableCollection
(~'-empty [_#]
(let [len# (alength ~sbuff)
buff# (make-array len#)]
(dotimes [i# len#]
(aset buff# i# nil))
(new ~nsym buff# ~smeta)))
c/ISeqable
(~'-seq [_#] (seq ~sbuff))
c/IAssociative
(~'-assoc [this# k# v#]
(let [index# (case k#
~@(mapcat (fn [i n] [i n])
fields
(range (count fields)))
(throw (ex-info "invalid key" {})))
buff# (aclone ~sbuff)]
(aset buff# index# v#)
(new ~nsym buff# ~smeta)))
(~'-contains-key? [_# k#]
(case k#
~@(mapcat (fn [n] [n true]) fields)
false))
c/ICounted
(~'-count [_#]
(alength ~sbuff))
c/ILookup
(~'-lookup [_# k#]
(case k#
~@(mapcat (fn [n i] [n `(aget ~sbuff ~i)])
fields
(range (count fields)))
nil))
(~'-lookup [this# k# not-found#]
(or (case k#
~@(mapcat (fn [n i] [n `(aget ~sbuff ~i)])
fields
(range (count fields)))
nil)
not-found#))
c/IPrintWithWriter
(~'-pr-writer [this# writer# _#]
(c/-write writer# (str "#penpot/namedtuple"
(pr-str (into {} [~@(map (fn [k i]
[k `(aget ~sbuff ~i)])
fields
(range (count fields)))])))))
c/IFn
(~'-invoke [this# k#]
(c/-lookup this# k#))
(~'-invoke [this# k# not-found#]
(c/-lookup this# k# not-found#)))
(defn ~f1name ~params
(let [buff# (c/array ~@params)]
;; (js/console.log buff#)
(new ~nsym buff# nil)))
)))

View File

@@ -5,9 +5,13 @@
;; Copyright (c) UXBOX Labs SL
(ns debug
(:require-macros
[app.common.namedtuple :as nt])
(:require
[app.common.data :as d]
[app.common.perf :as perf]
[app.common.math :as mth]
[app.common.geom.matrix :as gmt]
[app.common.pages :as cp]
[app.common.transit :as t]
[app.common.uuid :as uuid]
@@ -267,3 +271,137 @@
(-> (p/let [response (js/fetch url)]
(.text response))
(p/then apply-changes)))
(nt/deftuple Matrix [:a :b :c :d :e :f])
;; (defn multiply!
;; [^Matrix m1 ^Matrix m2]
;; (let [bf1 (.-buff ^js m1)
;; bf2 (.-buff ^js m2)
;; m1a (aget bf1 0)
;; m1b (aget bf1 1)
;; m1c (aget bf1 2)
;; m1d (aget bf1 3)
;; m1e (aget bf1 4)
;; m1f (aget bf1 5)
;; m2a (aget bf2 0)
;; m2b (aget bf2 1)
;; m2c (aget bf2 2)
;; m2d (aget bf2 3)
;; m2e (aget bf2 4)
;; m2f (aget bf2 5)]
;; (aset bf1 0 (+ (* m1a m2a) (* m1c m2b)))
;; (aset bf1 1 (+ (* m1b m2a) (* m1d m2b)))
;; (aset bf1 2 (+ (* m1a m2c) (* m1c m2d)))
;; (aset bf1 3 (+ (* m1b m2c) (* m1d m2d)))
;; (aset bf1 4 (+ (* m1a m2e) (* m1c m2f) m1e))
;; (aset bf1 5 (+ (* m1b m2e) (* m1d m2f) m1f))
;; m1))
(defn multiply!
[bf1 bf2]
(let [m1a (aget bf1 0)
m1b (aget bf1 1)
m1c (aget bf1 2)
m1d (aget bf1 3)
m1e (aget bf1 4)
m1f (aget bf1 5)
m2a (aget bf2 0)
m2b (aget bf2 1)
m2c (aget bf2 2)
m2d (aget bf2 3)
m2e (aget bf2 4)
m2f (aget bf2 5)]
(aset bf1 0 (+ (* m1a m2a) (* m1c m2b)))
(aset bf1 1 (+ (* m1b m2a) (* m1d m2b)))
(aset bf1 2 (+ (* m1a m2c) (* m1c m2d)))
(aset bf1 3 (+ (* m1b m2c) (* m1d m2d)))
(aset bf1 4 (+ (* m1a m2e) (* m1c m2f) m1e))
(aset bf1 5 (+ (* m1b m2e) (* m1d m2f) m1f))))
(defn multiply
([m1 m2]
(let [buff1 (.slice (.-buff ^js m1) 0)]
(multiply! buff1 (.-buff ^js m2))
(Matrix. buff1 nil)))
([m1 m2 m3]
(let [buff1 (.slice (.-buff ^js m1) 0)]
(multiply! buff1 (.-buff ^js m2))
(multiply! buff1 (.-buff ^js m3))
(Matrix. buff1 nil)))
([m1 m2 m3 m4]
(let [buff1 (.slice (.-buff ^js m1) 0)]
(multiply! buff1 (.-buff ^js m2))
(multiply! buff1 (.-buff ^js m3))
(multiply! buff1 (.-buff ^js m4))
(Matrix. buff1 nil)))
([m1 m2 m3 m4 m5]
(let [buff1 (.slice (.-buff ^js m1) 0)]
(multiply! buff1 (.-buff ^js m2))
(multiply! buff1 (.-buff ^js m3))
(multiply! buff1 (.-buff ^js m4))
(multiply! buff1 (.-buff ^js m5))
(Matrix. buff1 nil))))
(defn ^:export bench-matrix-multiply
[]
(let [ma1 (make-matrix 1 2 3 4 5 6)
ma2 (make-matrix 6 5 4 3 2 1)]
(perf/benchmark
:f (fn []
(dotimes [i 100]
(when-not (multiply ma1 ma2)
(throw (ex-info "foobar" {}))))
:result)
:name "tuple matrix"))
(let [ma1 (gmt/matrix 1 2 3 4 5 6)
ma2 (gmt/matrix 6 5 4 3 2 1)]
(perf/benchmark
:f (fn []
(dotimes [i 100]
(when-not (gmt/multiply ma1 ma2)
(throw (ex-info "foobar" {}))))
:result)
:name "orig matrix")))
(defn ^:export bench-matrix-multiply-bulk-5
[]
(let [ma1 (make-matrix 1 2 3 4 5 6)
ma2 (make-matrix 6 5 4 3 2 1)
ma3 (make-matrix 9 8 7 6 5 4)
ma4 (make-matrix 7 6 5 4 3 2)
ma5 (make-matrix 1 9 2 8 4 7)]
(prn "result1" (multiply ma1 ma2 ma3 ma4 ma5))
(perf/benchmark
:f (fn []
(dotimes [i 100]
(when-not (multiply ma1 ma2 ma3 ma4 ma5)
(throw (ex-info "foobar" {}))))
:result)
:name "tuple matrix"))
(let [ma1 (gmt/matrix 1 2 3 4 5 6)
ma2 (gmt/matrix 6 5 4 3 2 1)
ma3 (gmt/matrix 9 8 7 6 5 4)
ma4 (gmt/matrix 7 6 5 4 3 2)
ma5 (gmt/matrix 1 9 2 8 4 7)]
(prn "result2" (gmt/multiply ma1 ma2 ma3 ma4 ma5))
(perf/benchmark
:f (fn []
(dotimes [i 100]
(when-not (gmt/multiply ma1 ma2 ma3 ma4 ma5)
(throw (ex-info "foobar" {}))))
:result)
:name "orig matrix")))