Skip to content

Instantly share code, notes, and snippets.

@Chouser
Chouser / externs_for_cljs.clj
Created June 17, 2013 13:44
Generate an externs.js file for arbitrary JS libraries for use in advanced Google Closure compilation, based on the ClojureScript code that uses the libraries.
(ns n01se.externs-for-cljs
(:require [clojure.java.io :as io]
[cljs.compiler :as comp]
[cljs.analyzer :as ana]))
(defn read-file [file]
(let [eof (Object.)]
(with-open [stream (clojure.lang.LineNumberingPushbackReader. (io/reader file))]
(vec (take-while #(not= % eof)
(repeatedly #(read stream false eof)))))))
; In England the currency is made up of pound, £, and pence, p, and
; there are eight coins in general circulation:
;
; 1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p).
;
; It is possible to make £2 in the following way:
;
; 1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p
;
; How many different ways can £2 be made using any number of coins?
(ns party.units
(:refer-clojure :exclude [+ - * /])
(:require [clojure.algo.generic.arithmetic :as ari :use [+ - * /]]
[clojure.algo.generic.math-functions :refer [pow]]
[clojure.repl :refer [doc source apropos dir find-doc]]))
(defrecord Measurement [sym factor units]
clojure.lang.IFn
(invoke [a b] (* a b)))
@Chouser
Chouser / keybase.md
Created December 14, 2017 21:59
keybase.md

Keybase proof

I hereby claim:

  • I am chouser on github.
  • I am chouser (https://keybase.io/chouser) on keybase.
  • I have a public key whose fingerprint is 2835 9367 72DD 2F1C BBCF BBED 94AE 902B F718 ED2A

To claim this, I am signing this object:

@Chouser
Chouser / query.clj
Created October 31, 2017 15:29
datascript query macros
(require '[clojure.spec :as spec]
'[clojure.walk :refer [prewalk]])
;; == Attempt 1
;; Unfortunately entagled with 'reduce':
(defmacro reduce-query [& args]
(let [m (spec/conform
(spec/cat :q (spec/spec
(spec/cat :q #(= :q %)
@Chouser
Chouser / gmail.clj
Created March 24, 2012 18:18
Send email via gmail from Clojure
(ns foo
(:import (java.util Properties)
javax.mail.internet.MimeMessage
(javax.mail.internet MimeMessage InternetAddress)
(javax.mail Session Transport Authenticator
PasswordAuthentication Message$RecipientType)))
(defn send-gmail [{:keys [from to subject text user password]}]
(let [auth (proxy [Authenticator] []
(getPasswordAuthentication []
@Chouser
Chouser / arg_counts.clj
Created August 24, 2016 14:39
Argument counts from Clojure function objects
(require '[clojure.reflect :as r])
(defn arg-counts [f]
(let [mems (:members (r/reflect f))]
{:args (set (map #(count (:parameter-types %))
(filter #(= 'invoke (:name %)) mems)))
:varargs-ge (some #(when (= 'doInvoke (:name %))
(dec (count (:parameter-types %))))
mems)}))
(ns n01se.citystate)
(defn vitality
"Vitality of city."
[city])
(defn owner
"Owning city. None is returned if no owner exists."
[city])
@Chouser
Chouser / gist:6783292
Created October 1, 2013 18:56
prevent infinite print recursion for IDeref
;; As originally posted, circa July 2009: http://web.archive.org/web/20110919081924/http://paste.lisp.org/display/83647
(def *iderefs* #{})
(defmethod print-method clojure.lang.IDeref [o #^Writer w]
(if (*iderefs* o)
(.write w (format "#<%s@%x>"
(.getSimpleName (class o))
(System/identityHashCode o)))
(binding [*iderefs* (conj *iderefs* o)]
;;** Multi-thread stochastic bubble sort **
;; an example of how to use refs
(defn fizzy-sort-init [coll]
(mapv #(ref (vector %)) coll))
(defn fizzy-sort-step [refs]
(let [i (rand-int (dec (count refs)))
[a b] (map #(nth refs %) (iterate inc i))
[a-val b-val] (map #(peek (deref %)) [a b])]