Skip to content

Instantly share code, notes, and snippets.

(defmacro with-timeout [seconds & body]
`(let [f# (future ~@body)]
(try
(.get f# ~seconds java.util.concurrent.TimeUnit/SECONDS)
(catch java.util.concurrent.TimeoutException e#
(do (future-cancel f#) nil)))))
(defn relate [& pairs]
(assert (even? (count pairs)) "relate requires an even number of arguments")
(->> pairs
(partition 2)
(map (fn [[k vs]] (map #(hash-map k %) vs)))
(apply map merge)))
(defn matches-specmap? [specmap m]
(reduce-kv
@comnik
comnik / spit-url.cljs
Created January 21, 2018 14:15
Helper to export lots of data from a CLJS web-app, as a downloadable file.
(defn spit-url [content]
(let [blob (js/Blob. (js/Array. content) {:type "text/plain;charset=utf-8"})]
(.createObjectURL js/URL blob)))
@comnik
comnik / relational-thingies.js
Last active May 4, 2018 20:25
Clojure core.set thingies in JS
const selectKeys = (m, keys) => {
return keys.reduce((acc, k) => {
acc[k] = m[k];
return acc;
}, {});
}
const invertMap = (m) =>
Object.keys(m).reduce((acc, k) => {
acc[m[k]] = k;
@comnik
comnik / diff-d3.js
Last active June 22, 2018 07:32
A hacky re-write of the d3/data join operation to work directly with output from Differential Dataflow.
//
// Usage
//
// where before you might've had:
// const selection = parent.selectAll('li').data(data, keyFn)
//
// you now have:
const selection = diff(parent.selectAll('li'), data, keyFn)
@comnik
comnik / policing.clj
Created June 25, 2018 22:22
Applying access policies to Datomic queries.
(require '[datomic.api :as d])
(def uri "datomic:mem://policing")
(d/create-database uri)
(def conn (d/connect uri))
;; We are managing classified documents.
(def schema
[{:db/ident :level/rank
{:deps
{org.clojure/clojure {:mvn/version "1.9.0"}
com.datomic/datomic-free {:mvn/version "0.9.5697"}}}
;; LWW Register
;; https://speakerdeck.com/ept/data-structures-as-queries-expressing-crdts-using-datalog?slide=15
(def schema
{:assign/time {:db/valueType :Number}
:assign/key {:db/valueType :Number}
:assign/value {:db/valueType :Number}})
(def rules
'[[(older ?t1 ?key)
;; RGA
;; https://speakerdeck.com/ept/data-structures-as-queries-expressing-crdts-using-datalog?slide=22
(def schema
{:id/node {:db/valueType :Number}
:id/ctr {:db/valueType :Number}
:insert/id {:db/valueType :Eid}
:insert/parent {:db/valueType :Eid}
:assign/id {:db/valueType :Eid}
:assign/elem {:db/valueType :Eid}
@comnik
comnik / memoize-mapping.clj
Created July 21, 2018 13:09
Deterministic mapping w/o carrying state, via memoize.
(def encode-symbol (memoize (fn [sym] (clojure.lang.RT/nextID))))