Skip to content

Instantly share code, notes, and snippets.

@gfredericks
gfredericks / queue.rb
Created November 6, 2013 20:46
Bakers queue impl in rubby just cuz. It's probably broken or terrible.
class PersistentList
attr_reader :length, :head, :tail
include Enumerable
EMPTY = Object.new
class << EMPTY
include Enumerable
def length; 0; end
def each(&block); end
def to_s; "()"; end
def cons(item); PersistentList.new(item, self); end
@gfredericks
gfredericks / with-local-redefs.clj
Last active November 30, 2022 15:30
thread-local version of with-redefs
(defn with-local-redefs-fn
[a-var its-new-value func]
(cast clojure.lang.IFn @a-var)
(alter-meta! a-var
(fn [m]
(if (::scope-count m)
(update-in m [::scope-count] inc)
(assoc m
::scope-count 1
::thread-local-var (doto (clojure.lang.Var/create @a-var)
@gfredericks
gfredericks / primes_via_addition.clj
Last active December 22, 2015 06:29
A lazy primes function in Clojure using only addition and comparisons.
(defn primes
"Returns a lazy sequence of primes."
[]
(cons 2
(lazy-seq
(let [local-primes (->> (primes)
(map (juxt identity #(apply + (repeat % %)))))]
(->> (iterate #(+ % 2) 3)
(remove (fn [n]
(->> local-primes
@gfredericks
gfredericks / defring.clj
Last active December 22, 2015 02:49
abstract algebra helpers
(defmacro defring
[additive-identity
multiplicative-identity
add
negate
multiply]
`(let [add# ~add
negate# ~negate
multiply# ~multiply]
(defn ~'+
@gfredericks
gfredericks / slow-deftypes.clj
Created August 28, 2013 15:35
deftype is 6 times slower than vectors?
(ns deftypes.are.slow
(:use criterium.core))
(deftype Pair [a b])
(bench
(->> (range 100000)
(map #(vector % (inc %)))
(map second)
(apply +)))
@gfredericks
gfredericks / executor-reflection.clj
Created July 23, 2013 00:06
Reflection with Executor?
(import '[java.util.concurrent Executors Executor])
(set! *warn-on-reflection* true)
(def ^Executor tp (Executors/newFixedThreadPool 4))
;; Reflection warning, NO_SOURCE_PATH:1:1 - call to submit can't be resolved.
(.submit ^Executor tp ^Callable (constantly 42))
@gfredericks
gfredericks / postgres-arrays.clj
Created July 22, 2013 19:56
Reading postgres arrays in java.jdbc
(extend-protocol IReadResult
java.sql.Array
(read-result [sqlarray]
(let [rs (.getResultSet sqlarray)]
(loop [rows []]
(if (.next rs)
(recur (conj rows (.getObject rs 2)))
rows)))))
@gfredericks
gfredericks / usages.clj
Created June 15, 2013 19:38
A Clojure function which, given a filename, returns a map from vars to sets of referenced vars.
(defn usages
[filename]
(let [forms (-> filename
slurp
(->> (format "(%s)"))
read-string)
analyses (map clojure.tools.analyzer/analyze-form forms)
defs (filter (comp #{:def} :op) analyses)]
(into {}
(for [def defs
@gfredericks
gfredericks / bytes->uuid.clj
Last active December 17, 2015 11:29
Converting a byte array to a UUID
(defn byte->long [b] (if (neg? b) (+ 256 b) b))
(defn bytes->long
[bytes]
{:pre [(= 8 (count bytes))]}
(apply + (map bit-shift-left (reverse (map byte->long bytes)) (range 0 64 8))))
(defn bytes->uuid
[bytes]
(java.util.UUID. (bytes->long (take 8 bytes))
@gfredericks
gfredericks / laser_css.clj
Created April 1, 2013 00:46
css selector in laser
(let [re-1 #"([^#\.:]*)((?:[#\.][^#\.:]+)*)"
re-2 #"([#\.])([^#\.:]+)"]
(defn css
"Laser selector for css stuff. Just handles the AND format
of foo#bar.baz.bang, no ORing."
[s]
(let [[_ a b] (re-matches re-1 (name s))]
(assert (or (seq a) (seq b)) "Bad css selector.")
(apply l/and
(if (empty? a)