diff --git a/.gitignore b/.gitignore index 8024855..79cdbf3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ node_modules/** package/** target/** .cpcache/ +benchmark/bench.edn +benchmark/bench.transit diff --git a/benchmark/bench_edn.js b/benchmark/bench_edn.js new file mode 100644 index 0000000..ae32ef1 --- /dev/null +++ b/benchmark/bench_edn.js @@ -0,0 +1,30 @@ + +const fs = require('fs') + +const str = fs.readFileSync('bench.edn').toString() + +const { decode } = require('../package/index').edn + +var runs = 100 +const times = [] + +while (runs--) { + const start = Date.now() + const res = decode(str, true) + const end = Date.now() + const ms = end - start + console.log(ms) + times.push(ms) +} + +const sum = times.reduce((x, y) => x + y) +const avg = sum / times.length + +console.log(avg) + + + + + + + diff --git a/benchmark/bench_transit.js b/benchmark/bench_transit.js new file mode 100644 index 0000000..b862ecb --- /dev/null +++ b/benchmark/bench_transit.js @@ -0,0 +1,20 @@ +const fs = require('fs') +const str = fs.readFileSync('./bench.transit').toString() +const { decodeTransit } = require('../package/index').edn + +var runs = 100 +const times = [] + +while (runs--) { + const start = Date.now() + const res = decodeTransit(str, true) + const end = Date.now() + const ms = end - start + console.log(ms) + times.push(ms) +} + +const sum = times.reduce((x, y) => x + y) +const avg = sum / times.length + +console.log(avg) diff --git a/benchmark/bench_transit_js.js b/benchmark/bench_transit_js.js new file mode 100644 index 0000000..246b53b --- /dev/null +++ b/benchmark/bench_transit_js.js @@ -0,0 +1,21 @@ +const fs = require('fs') + +const str = fs.readFileSync('./bench.transit').toString() +const decodeTransit = require('../decode.js') + +var runs = 100 +const times = [] + +while (runs--) { + const start = Date.now() + const res = decodeTransit(str, true) + const end = Date.now() + const ms = end - start + console.log(ms) + times.push(ms) +} + +const sum = times.reduce((x, y) => x + y) +const avg = sum / times.length + +console.log(avg) diff --git a/decode.js b/decode.js new file mode 100644 index 0000000..428d3ab --- /dev/null +++ b/decode.js @@ -0,0 +1,49 @@ +const t = require('transit-js') + +const opts = { + mapBuilder: { + init: function() { + return {} + }, + add: function(m, k, v) { + m[k] = v + return m + }, + finalize: function(m) { + return m + } + }, + + arrayBuilder: { + init: function() { + return [] + }, + add: (ret, val, node) => { + // this is how keywords are defined, not sure why + if (val._name) { + ret.push(`:${val._name}`) + } else { + ret.push(val) + } + return ret + }, + finalize: (ret, node) => { + return ret + } + }, + + handlers: { + set: rep => { + return rep + }, + list: rep => { + return rep + } + } +} + +const r = t.reader('json', opts) + +module.exports = transitStr => { + return r.read(transitStr) +} diff --git a/deps.edn b/deps.edn index 8a2ce9c..fbcf899 100644 --- a/deps.edn +++ b/deps.edn @@ -1,2 +1,3 @@ -{:deps {org.clojure/clojurescript {:mvn/version "1.10.238"}} +{:deps {org.clojure/clojurescript {:mvn/version "1.10.238"} + com.cognitect/transit-cljs {:mvn/version "0.8.256"}} :paths ["src" "test"]} diff --git a/project.clj b/project.clj index 6435281..4c0f14b 100644 --- a/project.clj +++ b/project.clj @@ -1,7 +1,8 @@ (defproject cljs-tools "0.0.1" - :dependencies [[org.clojure/clojure "1.9.0"] - [org.clojure/clojurescript "1.10.238"]] - :plugins [[lein-cljsbuild "1.1.5"]] + :dependencies [[org.clojure/clojure "1.10.0"] + [org.clojure/clojurescript "1.10.597"] + [com.cognitect/transit-cljs "0.8.256"]] + :plugins [[lein-cljsbuild "1.1.7"]] :cljsbuild {:builds [{:id "release" :source-paths ["src"] :compiler {:main yd.module diff --git a/src/yd/edn.cljs b/src/yd/edn.cljs index 2f1cd98..2f4c4d1 100644 --- a/src/yd/edn.cljs +++ b/src/yd/edn.cljs @@ -1,7 +1,8 @@ (ns yd.edn (:require [clojure.walk :refer (postwalk)] [clojure.string :refer (replace includes?)] - [cljs.reader :refer (read-string)])) + [cljs.reader :refer (read-string)] + [yd.transit])) (defn keylike? [k-str] @@ -25,6 +26,11 @@ (read-string data)) +(defn read-transit [transit-str] + (let [r (t/reader :json)] + (t/read r transit-str))) + + (defn try-read [value] (try (read-data value) @@ -76,5 +82,11 @@ (cond-> (read-data edn-str) keywordize? (walk print-kw identity) true clj->js)) + + +(defn decode-transit [transit-str keywordize?] + (cond-> (yd.transit/decode transit-str) + keywordize? (walk print-kw identity) + true clj->js)) diff --git a/src/yd/module.cljs b/src/yd/module.cljs index 4b76fe3..fa5e0ab 100644 --- a/src/yd/module.cljs +++ b/src/yd/module.cljs @@ -1,5 +1,5 @@ (ns yd.module - (:require [yd.edn :refer (encode decode)])) + (:require [yd.edn :refer (encode decode decode-transit)])) (def edn #js {}) @@ -11,4 +11,7 @@ (aset edn "decode" decode) +(aset edn "decodeTransit" decode-transit) + + (aset js/module.exports "edn" edn) diff --git a/src/yd/transit.cljs b/src/yd/transit.cljs new file mode 100644 index 0000000..e57cb01 --- /dev/null +++ b/src/yd/transit.cljs @@ -0,0 +1,13 @@ +(ns yd.transit + (:require [cognitect.transit :as t])) + + +(defn encode [data] + (let [w (t/writer :json)] + (t/write w data))) + + +(defn decode [transit-str] + (let [r (t/reader :json)] + (t/read r transit-str))) +