Skip to content

Instantly share code, notes, and snippets.

@wheaties
Last active July 31, 2018 20:55
Show Gist options
  • Select an option

  • Save wheaties/17322f3f13e224fd79f3 to your computer and use it in GitHub Desktop.

Select an option

Save wheaties/17322f3f13e224fd79f3 to your computer and use it in GitHub Desktop.

Revisions

  1. wheaties revised this gist Feb 18, 2016. 1 changed file with 6 additions and 6 deletions.
    12 changes: 6 additions & 6 deletions OneOf.scala
    Original file line number Diff line number Diff line change
    @@ -1,15 +1,15 @@
    trait OneOf[Obj, Items]

    object OneOf extends OneOf0{
    object OneOf extends LowPriorityOneOf{
    implicit def apply[Obj, Items](implicit oneOf: OneOf[Obj, Items]) = oneOf

    implicit def left[L, R, Obj <: L] = new OneOf[Obj, L | R]{ type Cond = True }
    implicit def left[L, R, Obj <: L] = new OneOf[Obj, L | R]{}
    }

    protected trait OneOf0 extends OneOf1{
    implicit def right[L, R, Obj <: R] = new OneOf[Obj, L | R]{ type Cond = True }
    protected trait LowPriorityOneOf extends LowPriorityOneOf1{
    implicit def right[L, R, Obj <: R] = new OneOf[Obj, L | R]{}
    }

    protected trait OneOf1{
    implicit def recur[L, R, Obj](implicit oneOf: OneOf[Obj, R]) = new OneOf[Obj, L | R]{ type Cond = oneOf.Cond }
    protected trait LowPriorityOneOf1{
    implicit def recur[L, R, Obj](implicit oneOf: OneOf[Obj, R]) = new OneOf[Obj, L | R]{}
    }
  2. wheaties revised this gist Feb 18, 2016. 2 changed files with 4 additions and 5 deletions.
    8 changes: 4 additions & 4 deletions OneOf.scala
    Original file line number Diff line number Diff line change
    @@ -1,15 +1,15 @@
    trait OneOf[A, Items]
    trait OneOf[Obj, Items]

    object OneOf extends OneOf0{
    implicit def apply[Obj, Items](implicit oneOf: OneOf[Obj, Items]) = oneOf

    implicit def head[A, B, Obj <: A] = new OneOf[Obj, A | B]{ type Cond = True }
    implicit def left[L, R, Obj <: L] = new OneOf[Obj, L | R]{ type Cond = True }
    }

    protected trait OneOf0 extends OneOf1{
    implicit def tail[A, B, Obj <: B] = new OneOf[Obj, A | B]{ type Cond = True }
    implicit def right[L, R, Obj <: R] = new OneOf[Obj, L | R]{ type Cond = True }
    }

    protected trait OneOf1{
    implicit def recur[A, B, Obj](implicit oneOf: OneOf[Obj, B]) = new OneOf[Obj, A | B]{ type Cond = oneOf.Cond }
    implicit def recur[L, R, Obj](implicit oneOf: OneOf[Obj, R]) = new OneOf[Obj, L | R]{ type Cond = oneOf.Cond }
    }
    1 change: 0 additions & 1 deletion abs.scala
    Original file line number Diff line number Diff line change
    @@ -1 +0,0 @@
    type |[A, B] = (A, B)
  3. wheaties created this gist Feb 11, 2016.
    15 changes: 15 additions & 0 deletions OneOf.scala
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,15 @@
    trait OneOf[A, Items]

    object OneOf extends OneOf0{
    implicit def apply[Obj, Items](implicit oneOf: OneOf[Obj, Items]) = oneOf

    implicit def head[A, B, Obj <: A] = new OneOf[Obj, A | B]{ type Cond = True }
    }

    protected trait OneOf0 extends OneOf1{
    implicit def tail[A, B, Obj <: B] = new OneOf[Obj, A | B]{ type Cond = True }
    }

    protected trait OneOf1{
    implicit def recur[A, B, Obj](implicit oneOf: OneOf[Obj, B]) = new OneOf[Obj, A | B]{ type Cond = oneOf.Cond }
    }
    1 change: 1 addition & 0 deletions abs.scala
    Original file line number Diff line number Diff line change
    @@ -0,0 +1 @@
    type |[A, B] = (A, B)