Skip to content

Instantly share code, notes, and snippets.

View travisbrown's full-sized avatar
😎
In hiding

Travis Brown travisbrown

😎
In hiding
View GitHub Profile
@travisbrown
travisbrown / path-dependent-type-monad.scala
Created October 17, 2011 21:53
path-dependent-type-monad
object test {
trait M[X[_]] {
def map[A, B](a: X[A])(f: A => B): X[B]
}
trait Parsers {
trait Parser[Y] {
def map[B](f: Y => B): Parser[B] = null
}
}
object test {
trait M[X[_]] {
def map[A, B](a: X[A])(f: A => B): X[B]
}
trait Parsers {
trait Parser[Y] {
def map[B](f: Y => B): Parser[B] = null
}
}
@travisbrown
travisbrown / FactorialBenchmark.scala
Created October 23, 2011 16:47
Benchmarking for some factorial functions using Caliper
import org.jscience.mathematics.number.LargeInteger
import com.google.caliper.{ Param, SimpleBenchmark }
class FactorialBenchmark extends SimpleBenchmark {
// Borrowed from https://github.com/sirthias/scala-benchmarking-template.
def repeat[@specialized A](reps: Int)(snippet: => A) = {
val zero = 0.asInstanceOf[A]
var i = 0
@travisbrown
travisbrown / htrc-data-api.scala
Created September 11, 2012 19:34
Using the HTRC Data API with Scala and Dispatch 0.9
import dispatch._
import java.io.ByteArrayInputStream
import java.util.zip.ZipInputStream
import scala.util.parsing.json.JSON.{ parseFull => parseJson }
val headers = Map("content-type" -> "application/x-www-form-urlencoded")
val tokenUrl = url("https://silvermaple.pti.indiana.edu:25443/oauth2/token")
val volumesUrl = url("https://silvermaple.pti.indiana.edu:25443/data-api/volumes/")
def tokenParams(id: String, secret: String) = Map(
@travisbrown
travisbrown / disjunction-monoid.scala
Created September 16, 2012 15:29
Disjunction monoid example
scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._
scala> val a: String \/ Int = "x".left
a: scalaz.\/[String,Int] = -\/(x)
scala> val b: String \/ Int = "y".left
b: scalaz.\/[String,Int] = -\/(y)
@travisbrown
travisbrown / ExtraStateParsers.scala
Created September 19, 2012 01:36
Threading extra state through a parser in Scala
import scala.util.parsing.combinator._
import scalaz._, Scalaz._
trait ExtraStateParsers[S] { this: Parsers =>
type ESP[A] = StateT[Parser, S, A]
protected implicit def monadInstance: Monad[Parser]
protected implicit def monadStateInstance =
implicitly[MonadState[({type F[T, +B] = StateT[Parser, T, B]})#F, S]]
@travisbrown
travisbrown / ExtraStateParsers.scala
Created September 19, 2012 02:10
Threading extra state through a parser in Scala
import scala.util.parsing.combinator._
import scalaz._, Scalaz._
trait ExtraStateParsers[S] { this: Parsers =>
type ESP[A] = StateT[Parser, S, A]
protected implicit def monadInstance: Monad[Parser]
protected implicit def monadStateInstance =
implicitly[MonadState[({type F[T, +B] = StateT[Parser, T, B]})#F, S]]
@travisbrown
travisbrown / kata-bank-ocr.scala
Created September 21, 2012 18:09
KataBankOCR checksum at the type level
/**
* We can use the Scala type system (with help from Miles Sabin's Shapeless
* library) to solve the bank account number validation problem in the second
* user story of the KataBankOCR kata on Coding Dojo:
*
* http://codingdojo.org/cgi-bin/wiki.pl?KataBankOCR
*
* By Travis Brown in response to a question by Paul Snively on the Shapeless
* Dev mailing list:
*
@travisbrown
travisbrown / tower-of-hanoi.scala
Created September 23, 2012 17:44
Solving the Tower of Hanoi at the type level
/**
* Type-level Tower of Hanoi
* by Travis Brown
*
* Note: not optimal, and probably won't work for some valid inputs.
* Tested with Scala 2.9.2 and Shapeless 1.2.3.
*/
import shapeless._, Nat._
@travisbrown
travisbrown / tuple-flatten.scala
Created October 24, 2012 11:18
Flattening deeply nested tuples with Shapeless
import shapeless._
trait Flatten[I, O <: HList] {
def apply(i: I): O
}
trait FlattenLow {
implicit def otherFlatten[I] = new Flatten[I, I :: HNil] {
def apply(i: I) = i :: HNil
}