Skip to content

Instantly share code, notes, and snippets.

View johnynek's full-sized avatar

P. Oscar Boykin johnynek

View GitHub Profile
@johnynek
johnynek / error.rs
Created February 24, 2015 07:31
rust compiler error
use std::old_io as io;
use std::sync::mpsc::channel;
use std::thread::Thread;
use std::ops::Fn;
use std::marker::PhantomData;
pub struct Test<F, X>(F, PhantomData<X>);
impl <F, X> Test<F, X> where F: Fn(X) {
fn go(self, x: X) {
@johnynek
johnynek / expressions.scala
Last active August 29, 2015 14:19
Lambda Expressions for constrained languages
object exp {
case class Scope(m: Map[Var[_], Exp[_]]) {
def put[T](pair: (Var[T], Exp[T])): Scope = new Scope(m + pair)
def apply[T](v: Var[T]): Either[String, Exp[T]] = m.get(v) match {
case Some(exp) => Right(exp.asInstanceOf[Exp[T]])
case None => Left(s"$v not found. Scope: $m")
}
}

Better Dependency Hygiene With Private Dependencies On JVM

A common pain when working with large projects is the diamond dependency. Consider a commonly used library such as ASM. One wants to build a big application reusing many powerful libraries, but unfortunately many of my desired dependencies themselves depend on different and incompatible versions of ASM. While compiling my code, since ASM does not appear in any APIs I touch, everything compiles fine, but at runtime the JVM only includes one version of classes of a given name leading to runtime binary errors.

OSGI Bundles are related to solving this problem, but it appears that is a heavy solution that has proven to be too cumbersome to actually use. Here we propose a lighter weight approach that benefits each incremental project that adopts this method.

Private dependencies are implemented by a build tool plug-in. In the build where one declares dependencies, one can label a jar dependency to be a private dependency. A private dependency means tha

@johnynek
johnynek / vect_filter.idr
Created September 18, 2015 22:15
Filtering a list returns a list that is never bigger
-- If the length is < n+1, it is less than n+2
weakenPair: (p: Fin n ** Vect (finToNat p) a) -> (p1: Fin (S n) ** Vect (finToNat p1) a)
weakenPair (FZ ** v) = (FZ ** v)
weakenPair (FS k ** v) = believe_me (FS k ** v) -- How to prove this branch?
filt : Vect n a -> (fn: a -> Bool) -> (p: Fin (S n) ** Vect (finToNat p) a)
filt [] _ = (0 ** [])
filt (x :: xs) fn with (filt xs fn)
| (p' ** xs') = if (fn x) then ((shift 1 p') ** (x :: xs')) else weakenPair (p' ** xs')
@johnynek
johnynek / wordcount.scala
Created October 28, 2011 04:51
Wordcount in the scalding DSL for Cascading
package com.twitter.scalding
class WordCount(args : Args) extends Job(args) {
TextLine( args("input") ).read.
flatMap('line -> 'word) { line : String => line.split("\\s+") }.
groupBy('word) { _.size }.
write( Tsv( args("output") ) )
}
@johnynek
johnynek / gist:1641512
Created January 19, 2012 18:05
Example of closures in Python
#!/usr/bin/env python
#closures are a poor man's object (and vice-versa)
# http://okmij.org/ftp/Scheme/oop-in-fp.txt
class StoresStuff:
def __init__(self, member):
self.member = member
def poorMansObject(init_member):
@johnynek
johnynek / gist:3428248
Created August 22, 2012 18:42
Proof of intersection formula
|\intersection_{i=(1..k)} s_i| = -\sum_{b=(0..2^k - 1)} (-1)^{|b|} |\union_i (s_i)^(b_i)|
where s_i^1 = s_i, and s_i^0 = {} (the empty set).
|b| is the number of 1 values in the binary representation.
Proof, base case = k = 2 (which is to say there is just s_1, s_2).
|s_1 n s_2| = -|{}| + |s_1| + |s_2| - |s_1 u s_2|
which is clearly true because |{}| = 0, and the fact that
|s_1| + |s_2| = |s_1 n s_2| + |s_1 u s_2|
@johnynek
johnynek / gist:3588731
Created September 1, 2012 21:57
MemoryGroupBuilder
package com.twitter.scalding
import cascading.tuple.Fields
import cascading.tuple.{Tuple => CTuple, TupleEntry}
class MemoryGroupBuilder(val input : List[TupleEntry],
val prevOutput : TupleEntry = new TupleEntry(),
override val sorting : Option[Fields] = None)
extends ReduceOperations[MemoryGroupBuilder] {
@johnynek
johnynek / problem8.clj
Created September 6, 2012 04:46
Problem 8
(def bignumber "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450")
(def
@johnynek
johnynek / reach2.scala
Created November 1, 2012 20:35
Second followers in scalding
ackage com.twitter.ads.batch.experimental.oscar
import com.twitter.scalding._
import com.twitter.pluck.job._
import com.twitter.pluck.source._
import com.twitter.pluck.source.matrix._
import com.twitter.pluck.mathematics._
import com.twitter.scalding.mathematics.Monoid
/*