(ns cljs.user
  (:require
   [app.common.data :as d]
   [app.common.data.macros :as dm]
   [app.common.perf :as perf]
   [cuerdas.core :as str]))

(def data {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :k 8 :l 9 :m {:a {:b {:c {:d {:e {:f 1}}}}}}})

(defn bench-get-in
  [& args]
  (let [iterations 1000000
        keys [:m :a :b :c :d :e :f]]

    (perf/benchmark :f #(get-in data keys nil)
                    :max-iterations iterations
                    :name "get-in-initialized")

    (perf/benchmark :f #(get-in data [:m :a :b :c :d :e :f] nil)
                    :max-iterations iterations
                    :name "get-in")

    (perf/benchmark :f #(dm/get-in data [:m :a :b :c :d :e :f] nil)
                    :max-iterations iterations
                    :name "dm/get-in")))

(defn bench-select-keys
  [& args]
  (let [iterations 1000000
        keys [:k :a :m :d :f :g :k]]
    (perf/benchmark :f #(select-keys data keys)
                    :max-iterations iterations
                    :name "select-keys-initialized")

    (perf/benchmark :f #(select-keys data [:k :a :m :d :f :g :k])
                    :max-iterations iterations
                    :name "select-keys")

    (perf/benchmark :f #(dm/select-keys data [:k :a :m :d :f :g :k])
                    :max-iterations iterations
                    :name "dm/select-keys")))

(defn bench-string-concat
  []
  (perf/benchmark :f #(str "foo" 2 "bar" 3 "baz" 4 "kkk" 5)
                  :max-iterations 500000
                  :name "clojure.core/str")

  (perf/benchmark :f #(dm/str "foo" 2 "bar" 3 "baz" 4 "kkk" 5)
                  :max-iterations 500000
                  :name "app.commons.data.macros/str")
  (let [items ["foo" 2 "bar" 3 "baz" 4 "kkk" 5]]
    (perf/benchmark :f #(str/join "" items)
                    :max-iterations 500000
                    :name "cuerdas.core/join")))

(defn main
  [& [name]]
  (case name
    "str" (bench-string-concat)
    "select-keys" (bench-select-keys)
    "get-in" (bench-get-in)
    (println "available: str select-keys get-in")))