Skip to content

Instantly share code, notes, and snippets.

@julienrf
julienrf / Values.scala
Last active November 18, 2015 08:14
Yet another Scala enumeration-like tool powered by shapeless. Inspired by https://github.com/milessabin/shapeless/blob/master/examples/src/main/scala/shapeless/examples/enum.scala
/** A typeclass giving the values of an enumeration */
@implicitNotFound("Unable to find values of ${A}. Make sure it is a sealed trait and is only extended by case objects.")
class Values[A](val values: Set[A])
/**
* The companion object contains the machinery to automatically derive the values of a sealed trait
* extended by case objects only.
*
* Basically, the derivation process is the following:
* - we are given a sort of list containing the types of the case objects that extend a sealed trait `A` ;
@julienrf
julienrf / code.scala
Created January 15, 2016 15:10
dependent types + higher-kinded types + implicits
object OK {
trait `*`[A]
trait Bar {
type Qux
implicit val `*`: `*`[Qux]
}
def foo(bar: Bar): `*`[bar.Qux] = {
import bar._
@julienrf
julienrf / collections.scala
Created September 13, 2017 16:36
Signature of new operations
trait Iterable[A] {
// https://github.com/scala/collection-strawman/issues/221
/**
* Returns a collection formed by the result of applying a function to each pair of corresponding elements
* from this collection and another collection. It is semantically equivalent to `(xs zip ys) map f`.
* If one of the two collections is longer than the other, its remaining elements are ignored.
*/
def zipWith[B, C](that: Iterable[B])(f: (A, B) => C): Iterable[C]