Slide 1

Slide 1 text

Richard Dallaway @d6y www.underscoreconsulting.com Let the type system do it for you

Slide 2

Slide 2 text

csv( List("Date","Ratio X"), List("Mon","6") :: List("Tue","-2") :: Nil ) Date Ratio X Mon 6 Tue -2

Slide 3

Slide 3 text

csv( List("Date" ), List("Mon","6") :: List("Tue","-2") :: Nil ) Oops and so… ? Date Mon 6 Tue -2

Slide 4

Slide 4 text

def csv( hdrs: Seq[String], rows: List[Seq[String]]) : String = ...

Slide 5

Slide 5 text

def csv( hdrs: Seq[String], rows: List[Seq[String]]) : String = ... import shapeless._ import syntax.sized._

Slide 6

Slide 6 text

def csv[N <: Nat]( hdrs: Seq[String], rows: List[Seq[String]]) : String = ... import shapeless._ import syntax.sized._

Slide 7

Slide 7 text

def csv[N <: Nat]( hdrs: Sized[Seq[String], N], rows: List[Seq[String]]) : String = ... import shapeless._ import syntax.sized._

Slide 8

Slide 8 text

def csv[N <: Nat]( hdrs: Sized[Seq[String], N], rows: List[Sized[Seq[String], N]]) : String = ... import shapeless._ import syntax.sized._

Slide 9

Slide 9 text

csv( Sized("Date","Ratio X"), Sized("Mon","6") :: Sized("Tue","-2") :: Nil ) Date Ratio X Mon 6 Tue -2

Slide 10

Slide 10 text

csv( Sized("Date" ), Sized("Mon","6") :: Sized("Tue","-2") :: Nil ) Type mismatch at compile time found: Sized[IndexedSeq[String],shapeless.nat._1] required: Sized[Seq[String],Succ[_ >: shapeless.nat._1 ...] Oops

Slide 11

Slide 11 text

class SizedOps[A, Repr, N <: Nat] ... { def head(implicit ev : _0 < N) : A = r.head def tail(implicit pred : Pred[N]) = wrap[Repr, pred.Out](r.tail) ... }

Slide 12

Slide 12 text

@d6y www.underscoreconsulting.com Less code Clearer intent Summary