Skip to content

Instantly share code, notes, and snippets.

View channingwalton's full-sized avatar
🏠
Working from home

Channing Walton channingwalton

🏠
Working from home
View GitHub Profile
@channingwalton
channingwalton / gist:4683045
Created January 31, 2013 13:59
Setting multiple values with lenses
def setL[T, A, B](la: Lens[T, A], lb: Lens[T, B])(a:A, b: B)(t: T): T = la.set(lb.set(t, b), a)
def setL[T, A, B, C](la: Lens[T, A], lb: Lens[T, B], lc: Lens[T, C])(a:A, b: B, c: C)(t: T): T = lc.set(setL(la, lb)(a,b)(t), c)
def setL[T, A, B, C, D](la: Lens[T, A], lb: Lens[T, B], lc: Lens[T, C], ld: Lens[T, D])(a:A, b: B, c: C, d: D)(t: T): T = ld.set(setL(la, lb, lc)(a,b, c)(t), d)
object MonadWriterExample extends App {
import scalaz._
import Scalaz._
implicit val monadWriter = EitherT.listenableMonadWriter[Writer, String, String]
case class Person(firstName: String, age: Int, car: Option[String])
def notEmpty(s: String) = Option(s).filter(x ⇒ !x.isEmpty && !x.forall(_.isWhitespace)) match {
case Some(r) ⇒ monadWriter.right[String](r)
@channingwalton
channingwalton / FirstSome.scala
Last active December 14, 2015 14:58
Iterate a list of functions A => Option[B] returning the first Some
object play {
import scalaz._
import Scalaz._
def foo(i: Int) = if (i > 0) Some(i) else None
def boo(i: Int) = if (i <= 0) Some(0) else None
val l = foo _ :: boo _ :: Nil
@channingwalton
channingwalton / PartialLens.scala
Last active December 18, 2015 03:19
Partial Lens example
object PartialLensExample extends App {
import scalaz._
import Lens._
import PLens._
case class Bar(blub: Option[String])
case class Foo(bar: Option[Bar])
@channingwalton
channingwalton / Trees.scala
Last active December 19, 2015 13:19
An implementation of creating a Christmas tree. The idea was to try to create a solution by composing reusable functions as an alternative to the example here http://sortega.github.io/programming/2013/07/06/functional-tree/
object Trees extends App {
def zero = '0'
def repeat(c: Char)(n: Int) = c.toString * n
def reflect(centre: Char)(s: String) = s.reverse + centre + s
def pad(w: Int, c: Char)(s: String) = s.padTo(w - 1, c)
// ------------------------------------------------------
// Combined List/Option/Either
// ------------------------------------------------------
object MonadTransformers extends App {
import scalaz._, Scalaz._
import EitherT._
type OptionTList[α] = ({ type λ[α] = OptionT[List, α] })#λ[α]
val c1: EitherT[OptionTList, String, String] = eitherT[OptionTList, String, String](OptionT[List, \/[String, String]](List(some(\/-("c1a")), some(\/-("c1b")))))
@channingwalton
channingwalton / AutomountMaverick.md
Last active September 20, 2017 22:11
Automounting in OSX Maverick

What Changed

I used to automount on OSX by sudo vifs and adding a line like vault.local:/backup /Volumes/backup url auto,url==afp://;AUTH=No%20User%[email protected]/backup 0 0. But that no longer works on Maverick because the system deletes everything in /Volumes on wake/restart/something-or-other.

We are going to create a mount at /mnt/Resources. We need to edit the auto_master to tell it where the automount config for /mnt/Resources lives:

sudo vi /etc/auto_master

Now add this line at the top

@channingwalton
channingwalton / MonoidHomomorphism.scala
Created March 7, 2014 17:52
Turning nulls into zeroes, zeroes into empties
object MonoidHomomorphism extends App {
import scalaz._
import Scalaz._
/**
* Turn any null into the Zero value for its type
*/
def nullAsZero[T: Monoid : Equal](a: T) = if (a == null) implicitly[Monoid[T]].zero else a
@channingwalton
channingwalton / shapelessy.scala
Last active August 29, 2015 14:00
Replacing boilerplate with shapeless
case class Foo[T](x: T) {
def map[B](f: T => B) = Foo(f(x))
}
object OldWay {
def combineLatest[T1, T2](e1: Foo[T1], e2: Foo[T2]): Foo[(T1, T2)] = Foo((e1.x, e2.x))
def combineLatest[T1, T2, T3](e1: Foo[T1], e2: Foo[T2], e3: Foo[T3]): Foo[(T1, T2, T3)] =
combineLatest(combineLatest(e1, e2), e3) map {
@channingwalton
channingwalton / LensFu.scala
Created May 19, 2014 09:48
Path-aware Lens
import scalaz._
object LensFu extends App {
case class FieldValue[T](name: String, v: T)
case class Field[T, F](name: String, lens: Lens[T, F]) {
def >=>[G](field: Field[F, G]): Field[T, G] = Field(name + "." + field.name, lens >=> field.lens)
def get(v: T): FieldValue[F] = FieldValue(name, lens.get(v))
def set(a: T, b: F): T = lens.set(a, b)