Skip to content

Instantly share code, notes, and snippets.

View Hendekagon's full-sized avatar

Matthew Chadwick (work) Hendekagon

View GitHub Profile
@Hendekagon
Hendekagon / a.cljc
Last active November 20, 2019 18:53
Clojure namespace declaration by functions experiment
(fn [params]
{
:namespace-name 'a
:requires []
:defs
'{
x (fn [y] (str "a's " y))
}})
@Hendekagon
Hendekagon / structure.cljc
Created October 18, 2019 14:52
reverse destructuring
(defn put [f x] (let [is-str? (char? (first x)) sx (apply str x)] (cond (map? f) (into {} (map vec (partition 2 (if (even? (count x)) x (conj x nil))))) (vector? f) (if is-str? (conj f sx) (into f x)) (list? f) (if is-str? (cons sx f) (concat f x)) (set? f) (if is-str? #{sx} (into f x)))))
(defn structure [s f] (mapv (fn [b a] (if (empty? b) (put b a) (let [r (structure a b)] (if (vector? b) (vec r) r)))) f (partition-all (int (/ (count s) (count f))) s)))
(structure (range 32) [[[] #{}] [#{} [] []]])
=>
[[[0 1 2 3 4 5 6 7] #{15 13 12 11 9 14 10 8}]
@Hendekagon
Hendekagon / defns--.clj
Created May 14, 2019 08:22
Make functions public
(defn defns--
"Makes all private fns
in the namespace with the
given name public"
[namespace-name]
(doseq [[_ v]
(filter
(fn [[_ x]]
(if (var? x) (-> x meta :ns ns-name #{namespace-name}) false))
(ns-map namespace-name))]
@Hendekagon
Hendekagon / gist:4671b105774bf31f1240a2f0c25febb2
Last active September 24, 2018 08:35
A note on Clojurescript React interfaces
@Hendekagon
Hendekagon / upsert
Last active August 10, 2018 09:37
Unique upsert in Datomic
; create attributes p and q, where p is unique identity
(d/transact edb1 {:tx-data [{:db/ident :p :db/cardinality :db.cardinality/one :db/valueType :db.type/keyword :db/unique :db.unique/identity}]})
=>
(d/transact edb1 {:tx-data [{:db/ident :q :db/cardinality :db.cardinality/one :db/valueType :db.type/keyword}]})
=>
; now add a datum
(d/transact edb1 {:tx-data [{:p :a1 :q :x}]})
@Hendekagon
Hendekagon / change-unique.clj
Created July 28, 2018 10:11
changing :db/unique
(defn make-attr-test [conn]
(let [tx
[
{:db/ident :y :db/cardinality :db.cardinality/many :db/valueType :db.type/ref :db/isComponent true}
{:db/ident :ya :db/cardinality :db.cardinality/one :db/valueType :db.type/keyword}
{:db/ident :yb :db/cardinality :db.cardinality/one :db/valueType :db.type/string}
]]
(d/transact conn {:tx-data tx})))
(defn add-test-data [conn]
@Hendekagon
Hendekagon / collatz.clj
Created February 8, 2018 13:42
Comparison of checked-vs-unchecked-vs-if-vs-ifless
(defn collatz [i] (if (even? i) (/ i 2) (+ 1 (* i 3))))(defn unchecked-collatz [i] (if (even? i) (unchecked-divide-int i 2) (unchecked-add-int 1 (unchecked-multiply-int i 3))))(defn ifless-collatz ([i] (ifless-collatz i (rem i 2))) ([i p] (+ (* p (+ 1 (* 3 i))) (* (- 1 p) (/ i 2)))))(defn unchecked-ifless-collatz ([i] (unchecked-ifless-collatz i (unchecked-remainder-int i 2))) ([i p] (unchecked-add-int (unchecked-multiply-int p (unchecked-add-int 1 (unchecked-multiply-int 3 i))) (unchecked-multiply-int (unchecked-subtract-int 1 p) (unchecked-divide-int i 2)))))
(quick-bench (ifless-collatz 7))Evaluation count : 2353194 in 6 samples of 392199 calls. Execution time mean : 257.547841 ns Execution time std-deviation : 8.540479 ns Execution time lower quantile : 249.726040 ns ( 2.5%) Execution time upper quantile : 269.887290 ns (97.5%) Overhead used : 1.806094 ns=> nil(quick-bench (unchecked-ifless-collatz 7))Evaluation count :
@Hendekagon
Hendekagon / programmer_jargon
Created June 9, 2017 15:37
A list of programmer jargon
modulo - 'except' as in "modulo means an equivalence relation modulo its use by programmers"
orthogonal - 'unrelated' as in "the use of 'orthogonal' by programmers is orthogonal to its use by mathematicians"
land, landed - when a new feature is added to a library, it isn't mearly 'added', it 'lands' -- as if from the heavens, like a magical bird or an expensive jet
cut - when a new version of library is released it isn't mearly 'released' it is 'cut' -- like a sparkling diamond
curated - if you release a list that wasn't created by an algorithm, then say it's 'curated' as in "A curated list of programmer jargon"
@Hendekagon
Hendekagon / 206
Created September 28, 2017 09:48
add 206 partial content in Aleph
; ---- the following fns copied from ring.util.response because they were
; useful but private ----
(defn canonical-path [^File file]
(str (.getCanonicalPath file)
(if (.isDirectory file) File/separatorChar)))
(defn safe-path? [^String root ^String path]
(.startsWith (canonical-path (File. root path))
(canonical-path (File. root))))
(use 'criterium.core)
=> nil
(defprotocol p1 (pt [this]))
=> p1
(extend-type Number p1 (pt [this] (list this)))
=> nil
(extend-type clojure.lang.PersistentList p1 (pt [this] this))
=> nil
(defn pf [x] (if (list? x) x (list x)))
=> #'user/pf