Skip to content

Instantly share code, notes, and snippets.

@MichaelBlume
MichaelBlume / gist:6968441
Last active December 25, 2015 11:19
obj: reify for python
# Writing some unit tests in Python, I found myself homesick for Clojure's `reify`.
from functools import partial
class Blank(object): pass
def obj(*fs):
o = Blank()
for f in fs:
setattr(o, f.func_name, partial(f, o))
@MichaelBlume
MichaelBlume / babel.hs
Last active December 18, 2015 21:29
prints the library of babel
import Control.Monad
chars :: [Char]
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ,.'\"-;:?!()"
incrementS :: [[Char]] -> [[Char]]
incrementS [] = [chars]
incrementS ([_] : r) = chars : (incrementS r)
incrementS ((c:cs) : r) = cs : r
(defn my-split-with [pred coll]
(let [p (promise)
passes ((fn step [c]
(lazy-seq
(if-let [[x & xs] (seq c)]
(if (pred x)
(cons x (step xs))
(do (deliver p c) nil))
(do (deliver p nil) nil))))
coll)]
@MichaelBlume
MichaelBlume / check_writing.py
Created October 27, 2012 04:01
Beeminder writing check
#!/usr/bin/env python
import envoy
import requests
import time
r = envoy.run("find /Users/mike/Dropbox/writing | grep -v DS_Store | xargs wc -c")
count = r.std_out.split()[-2]
kb_written = int(count) // 1024
url = "https://www.beeminder.com/api/v1/users/mblume/goals/writing/datapoints.json"
@MichaelBlume
MichaelBlume / escroll.hs
Created October 26, 2012 18:56
Cute script for drawing attention to errors in scrolling log output
#!/usr/bin/env runhaskell
import Data.List
import Control.Concurrent
import System.IO
takeBlock :: [String] -> (String, [String])
takeBlock (firstLine:moreLines) = (block, restLines) where
block = intercalate "\n" (firstLine:indLines)
(indLines, restLines) = span (isPrefixOf " ") moreLines
@MichaelBlume
MichaelBlume / gist:3921530
Created October 20, 2012 00:59
Transformations on JSON schemas. Also strictness.
def rec_schema_transform(transform):
def recur(schema):
if not isinstance(schema, dict):
return
transform(schema)
for k, v in schema.items():
if k in ("properties", "patternProperties", "dependencies"):
for _, subschema in v.items():
recur(subschema)
elif k in ("additionalProperties", "additionalItems") and v:
qualia = ("red", "blue", "cold", "pleasure")
memory_associations = { "red": ("anger", "hot")
, "blue": ("cold", "calm")
, "pleasure": ("hot", "good")
, "cold": ("blue", "calm")
}
def experience_qualia(in_qual):
for q in qualia:
if in_qual == q:
@MichaelBlume
MichaelBlume / compose_defaults
Created May 23, 2012 18:05
The dumps param in simplejson.dumps is often helpful, but sometimes you want to quickly pass in multiple default actions. This should help.
def compose_defaults(*defaults):
'''I got annoyed that simplejson.dumps doesn't let you pass multiple
defaults. So here's this.'''
def new_default(obj):
for default in defaults:
try:
return default(obj)
except:
pass
raise TypeError("no default functions succeeded")
@MichaelBlume
MichaelBlume / localdict.py
Created May 6, 2011 21:18
Localdict -- reduce your typing by half when constructing a dictionary literal from objects in the local context.
'''Localdict -- reduce your typing by half when constructing a dictionary
literal from objects in the local context.
params = {'foo': foo, 'bar': bar, 'baz': baz}
can be replaced ith
params = localdict('foo', 'bar', 'baz')
'''
@MichaelBlume
MichaelBlume / deepdict.py
Created May 6, 2011 18:49
deepdict: quickly create highly nested dictionary structures without lots of initialization steps.
'''deepdict: quickly create highly nested dictionary structures without lots
of initialization steps.'''
from collections import defaultdict
class deepdict(defaultdict):
def __init__(self, *a, **kw):
defaultdict.__init__(self, deepdict, *a, **kw)
def __add__(self, num):
return num