Skip to content

Instantly share code, notes, and snippets.

View milessabin's full-sized avatar

Miles Sabin milessabin

View GitHub Profile
scala> :paste
// Entering paste mode (ctrl-D to finish)
import shapeless._
trait Query[O] ; trait Query0[O] extends Query[O] ; trait Query1[I1, O] extends Query[O]
trait ActorRef[O]
trait Rel[-K, V]
object Rel {
@milessabin
milessabin / gist:63de4353d43721c93677
Last active August 29, 2015 14:18
Function type inference not too shabby ...
import shapeless._
import ops.function._
// Contravariant version of shapeless's FnToProduct
trait ContraFnToProduct[-F] {
type Out
def apply(f: F): Out
}
@milessabin
milessabin / gist:18a9effd4bb354bd1dd4
Last active August 29, 2015 14:18
Demo of SingletonProductArgs from shapeless-2.2.0
scala> :paste
// Entering paste mode (ctrl-D to finish)
import shapeless._, ops.hlist._, ops.record._
object selectAll extends SingletonProductArgs {
class Apply[K <: HList] {
def from[T, R <: HList, S <: HList, Out](t: T)
(implicit
gen: LabelledGeneric.Aux[T, R],
package shapeless.examples
import shapeless._
import nat._
import ops.hlist._
import test._
object TableExample extends App {
final case class Row[L <: HList](cells: L)
@milessabin
milessabin / gist:65fa0d4ef373781d3ab4
Last active July 23, 2017 11:17
Empty refinements prevent unwanted widening when assigning singleton-typed values to a val.
// Used in shapeless here: https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/syntax/singletons.scala#L42
scala> def narrow[T <: AnyRef](t: T): t.type = t
narrow: [T <: AnyRef](t: T)t.type
scala> val s1 = narrow("foo") // Widened
s1: String = foo
scala> def narrow[T <: AnyRef](t: T): t.type {} = t // Note empty refinement
narrow: [T <: AnyRef](t: T)t.type
@milessabin
milessabin / Foldable.scala
Last active August 29, 2015 14:17 — forked from xuwei-k/Foldable.scala
Trampolined to avoid stack overflow ...
import scala.util.control.TailCalls._
import shapeless._
trait Foldable[F[_]] {
def foldLeft[A, B](fa: F[A], b: B)(f: (B, A) => B): B
}
object Foldable {
implicit def apply[F[_]](implicit fr: Lazy[FoldableRec[F]]): Foldable[F] =
@milessabin
milessabin / gist:cadd73b7756fe4097ca0
Last active September 16, 2019 13:44
A new approach to encoding dependently-typed chained implicits, using singleton types ...
object Demo {
// A couple of type classes with type members ...
trait Foo[T] {
type A
}
object Foo {
implicit val fooIS = new Foo[Int] { type A = String }
}
scala> import ops.nat._
import ops.nat._
scala> def foo[T, N <: Nat](l: Sized[Seq[T], N])(implicit ev: LTEq[N, _3]) = l
foo: [T, N <: shapeless.Nat](l: shapeless.Sized[Seq[T],N])(implicit ev: shapeless.ops.nat.LTEq[N,shapeless.nat._3])shapeless.Sized[Seq[T],N]
scala> val l1 = Sized(1, 2, 3)
l1: shapeless.Sized[scala.collection.immutable.IndexedSeq[Int],shapeless.nat._3] = shapeless.Sized@17191095
scala> val l2 = Sized(1, 2, 3, 4)
object FlattenTuple {
import shapeless._
import ops.tuple.FlatMapper
import syntax.std.tuple._
trait LowPriorityFlattenTuple extends Poly1 {
implicit def default[T] = at[T](Tuple1(_))
}
@milessabin
milessabin / gist:081dcf2807f9563052ce
Created December 19, 2014 07:58
whitebox/blackbox abort behaviour difference.
import scala.language.experimental.macros
import scala.reflect.macros.whitebox
trait Foo[T]
object Foo {
implicit def mkFoo[T]: Foo[T] = macro FooMacros.mkFooImpl[T]
}