Skip to content

Instantly share code, notes, and snippets.

@milessabin
Forked from mjhopkins/FlattenTupleExample.scala
Last active August 29, 2015 14:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save milessabin/3961ad063888631f439e to your computer and use it in GitHub Desktop.
Save milessabin/3961ad063888631f439e to your computer and use it in GitHub Desktop.
object FlattenTuple {
import shapeless._
import ops.tuple.FlatMapper
import syntax.std.tuple._
trait LowPriorityFlattenTuple extends Poly1 {
implicit def default[T] = at[T](Tuple1(_))
}
object flattenTuple extends LowPriorityFlattenTuple {
implicit def caseTuple[P <: Product](implicit fm: Lazy[FlatMapper[P, flattenTuple.type]]) =
at[P](fm.value(_))
}
implicit class TupleFlattenOps[P <: Product](p: P) {
def flatten(implicit fm: Lazy[FlatMapper[P, flattenTuple.type]]) = flattenTuple(p)
}
}
object FlattenTupleExample extends App {
import FlattenTuple._
println((Tuple1(Some(1)), 11).flatten)
println(((Some(1), Some(2)), 11).flatten)
println(((Some(1), Some(2), Some(3)), 11).flatten)
println(((Some(1), Some(2), Some(3), Some(4)), 11).flatten)
println(((Some(1), Some(2), Some(3), Some(4), Some(5)), 11).flatten)
println(((Some(1), Some(2), Some(3), Some(4), Some(5), Some(6)), 11).flatten)
println(((Some(1), Some(2), Some(3), Some(4), Some(5), Some(6), Some(7)), 11).flatten)
println(((Some(1), Some(2), Some(3), Some(4), Some(5), Some(6), Some(7), Some(8)), 11).flatten)
println(((Some(1), Some(2), Some(3), Some(4), Some(5), Some(6), Some(7), Some(8), Some(9)), 11).flatten)
println(((Some(1), Some(2), Some(3), Some(4), Some(5), Some(6), Some(7), Some(8), Some(9), Some(10)), 11).flatten)
/*
prints:
(1,11)
(1,2,11)
(1,2,3,11)
(1,2,3,4,11)
((Some(1),Some(2),Some(3),Some(4),Some(5)),11)
((Some(1),Some(2),Some(3),Some(4),Some(5),Some(6)),11)
((Some(1),Some(2),Some(3),Some(4),Some(5),Some(6),Some(7)),11)
((Some(1),Some(2),Some(3),Some(4),Some(5),Some(6),Some(7),Some(8)),11)
((Some(1),Some(2),Some(3),Some(4),Some(5),Some(6),Some(7),Some(8),Some(9)),11)
((Some(1),Some(2),Some(3),Some(4),Some(5),Some(6),Some(7),Some(8),Some(9),Some(10)),11)
*/
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment