Skip to content

Instantly share code, notes, and snippets.

@mkremins
mkremins / gist:4459835
Created January 5, 2013 04:54
Bukkit: detect whether an inventory click falls within the top or bottom inventory
@EventHandler
public void onInvClick(InventoryClickEvent event) {
Player p = (Player) event.getWhoClicked();
if(event.getRawSlot() == event.getSlot()) {
p.sendMessage("TOP");
}
else {
p.sendMessage("BOTTOM");
}
}
@mkremins
mkremins / gist:5818692
Created June 19, 2013 22:27
Bash: pretty-print currently available color codes
#!/bin/bash
#
# This file echoes a bunch of color codes to the
# terminal to demonstrate what's available. Each
# line is the color code of one forground color,
# out of 17 (default + 16 escapes), followed by a
# test use of that color on all nine background
# colors (default + 8 escapes).
#
# Shamelessly stolen from:
@mkremins
mkremins / partial.clj
Created January 27, 2014 23:07
clojure.core/partial with explicit argument ordering
(defn partial* [f & static-args]
(fn [& dynamic-args]
(loop [args []
static-args static-args
dynamic-args dynamic-args]
(if-let [static (first static-args)]
(if (= static :%)
(if-let [dynamic (first dynamic-args)]
(recur (conj args dynamic) (rest static-args) (rest dynamic-args))
(throw (Exception. "too few arguments")))
@mkremins
mkremins / zip.clj
Last active August 29, 2015 13:55
Clojure utility fns for working with zippers
(require '[clojure.zip :as z])
(defn forms-zip
"Returns a clojure.zip zipper over a tree of Clojure forms."
[form]
(z/zipper coll?
#(if (map? %) (interleave (keys %) (vals %)) (seq %))
#(cond
(map? %1) (apply hash-map %2)
(seq? %1) %2
@mkremins
mkremins / pbcopy.js
Created April 17, 2014 21:41
node.js: put text into OS X clipboard
function pbcopy(data) {
var proc = require('child_process').spawn('pbcopy');
proc.stdin.write(data);
proc.stdin.end();
}
@mkremins
mkremins / opts.clj
Created April 24, 2014 19:17
Clojure: parse sequential opts delimited by a known set of names
(defn parse-opts [ks aseq]
(let [ks (set ks)]
(loop [last-k nil
opts {}
frontier aseq]
(if-let [value (first frontier)]
(if (ks value)
(recur value opts (rest frontier))
(recur last-k (update-in opts [last-k] (fnil conj []) value) (rest frontier)))
opts))))
@mkremins
mkremins / partial_eval.clj
Last active August 29, 2015 14:02
Compile fn from expr containing unbound symbols
(ns expr-fn.core
(:require [clojure.walk :as walk]))
(defn forms-seq [form]
(tree-seq coll?
#(if (map? %) (interleave (keys %) (vals %)) %)
form))
(defn resolved? [form]
(if (coll? form)
@mkremins
mkremins / defntraced.clj
Created July 22, 2014 21:35
Define traced function
; http://www.reddit.com/r/Clojure/comments/2behsz/clojurescript_debugging_tips/cj4mvok
(defmacro defntraced
"Define a function with it's inputs and output logged to the console."
[sym & body]
(let [[_ _ [_ & specs]] (macroexpand `(defn ~sym ~@body))
new-specs
(map
(fn [[args body]]
(let [prns (for [arg args]
@mkremins
mkremins / scale.cljc
Last active November 30, 2017 00:23
Convert number from one scale to another
(defn scale
"Converts the number `x` from the scale `[old-min old-max]` to the scale
`[new-min new-max]`."
[x [old-min old-max] [new-min new-max]]
(let [old-range (- old-max old-min)
new-range (- new-max new-min)]
(+ (/ (* (- x old-min) new-range) old-range) new-min)))
@mkremins
mkremins / weighted_choice.clj
Created October 8, 2014 20:04
Weighted random choice
(defn weighted-choice
"Given a map `choices {outcome weight}`, returns a randomly chosen `outcome`.
The likelihood that a particular `outcome` will be chosen is proportional to
its assigned `weight`."
[choices]
(->> choices
(mapcat (fn [[outcome weight]] (repeat weight outcome)))
rand-nth))