Skip to content

Instantly share code, notes, and snippets.


Stuart Halloway stuarthalloway

View GitHub Profile
View updating-unique-ids-yuck.clj
;; good repro #0: problem statement
;; in n takes (tricks: translate domain words into Datomic words, be precise.)
;; 0. "Two datoms in transaction conflict" move an entity id to a reference entity take
;; 1. "Retracting an entity and adding an entity"
;; ...
;; 5. "Retracting a unique identity datom and asserting the same identity on another datom causes
;; "2 datoms in transaction conflict"
;; good repro #1: depend only on Datomic API
View squuid-created-at.clj
(defn squuid-created-at
"Pull the date back out of a squuid. This will be nonsense if the UUID
passed in was not a squuid!"
[^java.util.UUID uuid]
(let [secs (bit-shift-right (.getMostSignificantBits uuid) 32)]
(java.util.Date. (* secs 1000))))
View renames_spec.clj
;; see also
(require '[clojure.spec.alpha :as s])
;; spec that ensures the keys in renames match the keys in map
(s/def ::rename-keys-args
(s/and (s/cat :map map? :renames map?)
(fn [{:keys [map renames]}]
(every? map (keys renames)))))
;; ok
stuarthalloway / example.clj
Created Feb 8, 2019
What Clojure errors look like
View example.clj
(let [a 1 b])
Syntax error macroexpanding clojure.core/let at (REPL:5:1).
[a 1 b] - failed: even-number-of-forms? at: [:bindings] spec: :clojure.core.specs.alpha/bindings
stuarthalloway / specs_over_tests.clj
Created Oct 13, 2018
Capture domain knowledge once in specs, instead of burying it in tests
View specs_over_tests.clj
;; compare to
(require '[clojure.spec.alpha :as s])
;; general domain knowledge, not buried in a test
(s/def ::info (s/keys :req-un [::name]))
(s/def ::items (s/coll-of pos-int?))
(s/def ::active boolean?)
;; knowledge specific to this test data
View expression_at_at_time.clj
(ns foo)
(defn hello [x] (str "Hi " x))
(ns bar)
(println (foo/hello "there"))
(remove-ns 'foo)
(println (resolve 'foo/hello))
stuarthalloway / clj_2373_examples.clj
Last active Aug 22, 2018
Intended for form-at-a-time at the REPL
View clj_2373_examples.clj
'[clojure.main :as main]
'[clojure.pprint :as pp])
(def strings
"Some strings that should fail somewhere in read/compile"
"(let [x])"
"(cond 1)"
"defmulti 5 class)"
View fizzbuzz.clj
(->> [(cycle [:fizz :_ :_])
(cycle [:buzz :_ :_ :_ :_])]
(apply map vector)
(take 25))
View clj_2373_take_1.clj
(comment "interop runtime exception repl-caught")
(/ 1 0)
ArithmeticException Divide by zero clojure.lang.Numbers.divide (
(comment "interop runtime exception pst")
ArithmeticException Divide by zero
clojure.lang.Numbers.divide (
clojure.lang.Numbers.divide (
;; elided
View inline_testing.clj
(defn round5
"Round to the closest positive multiple of 5.
Negative numbers round to 0, which is not
considered a multiple of 5."
{:test (fn [] (let [roundsto (fn [e] #(= e (round5 %)))]
(testing "Negative numbers"
(is (every? (roundsto 0) (range -20 0))))
(testing "Positive numbers rounding to 5"
(is (every? (roundsto 5) (range 0 8))))
(testing "Positive numbers rounding not to 5"
You can’t perform that action at this time.