Skip to content

Instantly share code, notes, and snippets.

@sir-wabbit
Created September 2, 2016 05:20
Show Gist options
  • Select an option

  • Save sir-wabbit/5e83de9b4d33f38714bfb85430d19ebe to your computer and use it in GitHub Desktop.

Select an option

Save sir-wabbit/5e83de9b4d33f38714bfb85430d19ebe to your computer and use it in GitHub Desktop.
TypeSet.scala
package sio.eff
import TypeSet._
sealed trait TypeSet[E]
object TypeSet {
trait S0[E ] extends TypeSet[E]
trait S1[E, E1 <: E ] extends TypeSet[E]
trait S2[E, E1 <: E, E2 <: E ] extends TypeSet[E]
trait S3[E, E1 <: E, E2 <: E, E3 <: E ] extends TypeSet[E]
trait SS[E, L <: TypeSet[E], R <: TypeSet[E]] extends TypeSet[E]
type S4[E, T1 <: E, T2 <: E, T3 <: E, T4 <: E] =
SS[E, S3[E, T1, T2, T3], S1[E, T4]]
type S5[E, T1 <: E, T2 <: E, T3 <: E, T4 <: E, T5 <: E] =
SS[E, S3[E, T1, T2, T3], S2[E, T4, T5]]
type S6[E, T1 <: E, T2 <: E, T3 <: E, T4 <: E, T5 <: E, T6 <: E] =
SS[E, S3[E, T1, T2, T3], S3[E, T4, T5, T6]]
type S7[E, T1 <: E, T2 <: E, T3 <: E, T4 <: E, T5 <: E, T6 <: E, T7 <: E] =
SS[E, S6[E, T1, T2, T3, T4, T5, T6], S1[E, T7]]
type S8[E, T1 <: E, T2 <: E, T3 <: E, T4 <: E, T5 <: E, T6 <: E, T7 <: E, T8 <: E] =
SS[E, S6[E, T1, T2, T3, T4, T5, T6], S2[E, T7, T8]]
type S9[E, T1 <: E, T2 <: E, T3 <: E, T4 <: E, T5 <: E, T6 <: E, T7 <: E, T8 <: E, T9 <: E] =
SS[E, S6[E, T1, T2, T3, T4, T5, T6], S3[E, T7, T8, T9]]
type S10[E, T1 <: E, T2 <: E, T3 <: E, T4 <: E, T5 <: E, T6 <: E, T7 <: E, T8 <: E, T9 <: E, T10 <: E] =
SS[E, S6[E, T1, T2, T3, T4, T5, T6], S4[E, T7, T8, T9, T10]]
type S11[E, T1 <: E, T2 <: E, T3 <: E, T4 <: E, T5 <: E, T6 <: E, T7 <: E, T8 <: E, T9 <: E, T10 <: E, T11 <: E] =
SS[E, S6[E, T1, T2, T3, T4, T5, T6], S5[E, T7, T8, T9, T10, T11]]
type S12[E, T1 <: E, T2 <: E, T3 <: E, T4 <: E, T5 <: E, T6 <: E, T7 <: E, T8 <: E, T9 <: E, T10 <: E, T11 <: E, T12 <: E] =
SS[E, S6[E, T1, T2, T3, T4, T5, T6], S6[E, T7, T8, T9, T10, T11, T12]]
}
trait MemberIn[E, T <: E, S <: TypeSet[E]]
object MemberIn extends MemberInLower1
trait Member[E, T <: E, S <: TypeSet[E]] extends MemberIn[E, T, S] { type Out <: TypeSet[E] }
object Member extends MemberLower1 {
type Aux[E, T <: E, S <: TypeSet[E], R <: TypeSet[E]] = Member[E, T, S] { type Out = R }
def apply[E, T <: E, S <: TypeSet[E]](implicit m: Member[E, T, S]): Member[E, T, S] = m
def aux[E, T <: E, S <: TypeSet[E], R <: TypeSet[E]](implicit m: Member.Aux[E, T, S, R]): Member.Aux[E, T, S, R] = m
def unaux[E, T <: E, S <: TypeSet[E], R <: TypeSet[E]](implicit m: Member.Aux[E, T, S, R]): Member[E, T, S] = m
}
trait MemberInLower1 extends MemberInLower2 {
implicit def MemberIn1[E, T <: E]: MemberIn[E, T, S1[E, T]] =
new MemberIn[E, T, S1[E, T]] { }
}
trait MemberInLower2 extends MemberInLower3 {
implicit def MemberIn2L[E, L <: E, R <: E]: MemberIn[E, L, S2[E, L, R]] =
new MemberIn[E, L, S2[E, L, R]] { }
implicit def MemberIn3L[E, L <: E, M <: E, R <: E]: MemberIn[E, L, S3[E, L, M, R]] =
new MemberIn[E, L, S3[E, L, M, R]] { }
implicit def MemberInAppendL[E, T <: E, L <: TypeSet[E], R <: TypeSet[E]]
(implicit append: MemberIn[E, T, L]): MemberIn[E, T, SS[E, L, R]] =
new MemberIn[E, T, SS[E, L, R]] { }
}
trait MemberInLower3 extends MemberInLower4 {
implicit def MemberIn2R[E, L <: E, R <: E]: MemberIn[E, R, S2[E, L, R]] =
new MemberIn[E, R, S2[E, L, R]] { }
implicit def MemberIn3M[E, L <: E, M <: E, R <: E]: MemberIn[E, M, S3[E, L, M, R]] =
new MemberIn[E, M, S3[E, L, M, R]] { }
implicit def MemberInAppendR[E, T <: E, L <: TypeSet[E], R <: TypeSet[E]]
(implicit append: MemberIn[E, T, R]): MemberIn[E, T, SS[E, L, R]] =
new MemberIn[E, T, SS[E, L, R]] { }
}
trait MemberInLower4 extends MemberInLower5 {
implicit def MemberIn3R[E, L <: E, M <: E, R <: E]: MemberIn[E, R, S3[E, L, M, R]] =
new MemberIn[E, R, S3[E, L, M, R]] { }
}
trait MemberInLower5 {
implicit def MemberInAppendAnyL[E, T <: E, R <: TypeSet[E]]: MemberIn[E, T, SS[E, S1[E, T], R]] =
new MemberIn[E, T, SS[E, S1[E, T], R]] { }
implicit def MemberInAppendAnyR[E, T <: E, L <: TypeSet[E], R <: TypeSet[E]]
(implicit m: MemberIn[E, T, R]): MemberIn[E, T, SS[E, L, R]] =
new MemberIn[E, T, SS[E, L, R]] { }
}
trait MemberLower1 extends MemberLower5 {
implicit def Member1[E, T <: E]: Member.Aux[E, T, S1[E, T], S0[E]] =
new Member[E, T, S1[E, T]] { type Out = S0[E] }
implicit def Member2L[E, L <: E, R <: E]: Member.Aux[E, L, S2[E, L, R], S1[E, R]] =
new Member[E, L, S2[E, L, R]] { type Out = S1[E, R] }
implicit def Member3L[E, L <: E, M <: E, R <: E]: Member.Aux[E, L, S3[E, L, M, R], S2[E, M, R]] =
new Member[E, L, S3[E, L, M, R]] { type Out = S2[E, M, R] }
implicit def Member4L[E, T <: E, L <: E, M <: E, R <: E]: Member.Aux[E, T, SS[E, S1[E, T], S3[E, L, M, R]], S3[E, L, M, R]] =
new Member[E, T, SS[E, S1[E, T], S3[E, L, M, R]]] { type Out = S3[E, L, M, R] }
}
trait MemberLower5 extends MemberLower6 {
implicit def Member4RL[E, T <: E, L <: E, M <: E, R <: E]: Member.Aux[E, L, SS[E, S1[E, T], S3[E, L, M, R]], S3[E, T, M, R]] =
new Member[E, L, SS[E, S1[E, T], S3[E, L, M, R]]] { type Out = S3[E, T, M, R] }
}
trait MemberLower6 extends MemberLower7 {
implicit def Member4RM[E, T <: E, L <: E, M <: E, R <: E]: Member.Aux[E, M, SS[E, S1[E, T], S3[E, L, M, R]], S3[E, T, L, R]] =
new Member[E, M, SS[E, S1[E, T], S3[E, L, M, R]]] { type Out = S3[E, T, L, R] }
}
trait MemberLower7 extends MemberLower8 {
implicit def Member4RR[E, T <: E, L, M, R]: Member.Aux[E, R, SS[E, S1[E, T], S3[E, L, M, R]], S3[E, T, L, M]] =
new Member[E, R, SS[E, S1[E, T], S3[E, L, M, R]]] { type Out = S3[E, T, L, M] }
}
trait MemberLower8 extends MemberLower9 {
implicit def MemberAppend1L[E, T <: E, R <: TypeSet[E]]: Member.Aux[E, T, SS[E, S1[E, T], R], R] =
new Member[E, T, SS[E, S1[E, T], R]] { type Out = R }
}
trait MemberLower9 extends MemberLower10 {
implicit def MemberAppend2L[E, T1<: E, T2<: E, R <: TypeSet[E]]: Member.Aux[E, T1, SS[E, S2[E, T1, T2], R], SS[E, S1[E, T2], R]] =
Member.MemberAppendL(Member.Member2L)
}
trait MemberLower10 extends MemberLower11 {
implicit def MemberAppend2R[E, T1<: E, T2<: E, R <: TypeSet[E]]: Member.Aux[E, T2, SS[E, S2[E, T1, T2], R], SS[E, S1[E, T1], R]] =
Member.MemberAppendL(Member.Member2R)
}
trait MemberLower11 extends MemberLower12 {
implicit def MemberAppend3L[E, T1<: E, T2<: E, T3<: E, R <: TypeSet[E]]: Member.Aux[E, T1, SS[E, S3[E, T1, T2, T3], R], SS[E, S2[E, T2, T3], R]] =
Member.MemberAppendL(Member.Member3L)
}
trait MemberLower12 extends MemberLower13 {
implicit def MemberAppend3M[E, T1<: E, T2<: E, T3<: E, R <: TypeSet[E]]: Member.Aux[E, T2, SS[E, S3[E, T1, T2, T3], R], SS[E, S2[E, T1, T3], R]] =
Member.MemberAppendL(Member.Member3M)
}
trait MemberLower13 extends MemberLower14 {
implicit def MemberAppend3R[E, T1 <: E, T2<: E, T3<: E, R <: TypeSet[E]]: Member.Aux[E, T3, SS[E, S3[E, T1, T2, T3], R], SS[E, S2[E, T1, T2], R]] =
Member.MemberAppendL(Member.Member3R)
}
trait MemberLower14 extends MemberLower15 {
implicit def MemberAppendL[E, T <: E, L <: TypeSet[E], R <: TypeSet[E], U <: TypeSet[E]]
(implicit append: Member.Aux[E, T, L, U]): Member.Aux[E, T, SS[E, L, R], SS[E, U, R]] =
new Member[E, T, SS[E, L, R]] { type Out = SS[E, U, R] }
}
trait MemberLower15 extends MemberLower16 {
implicit def Member2R[E, L <: E, R <: E]: Member.Aux[E, R, S2[E, L, R], S1[E, L]] =
new Member[E, R, S2[E, L, R]] { type Out = S1[E, L] }
}
trait MemberLower16 extends MemberLower17 {
implicit def Member3M[E, L <: E, M <: E, R <: E]: Member.Aux[E, M, S3[E, L, M, R], S2[E, L, R]] =
new Member[E, M, S3[E, L, M, R]] { type Out = S2[E, L, R] }
}
trait MemberLower17 extends MemberLower18 {
implicit def MemberAppendR[E, T <: E, L <: TypeSet[E], R <: TypeSet[E], U <: TypeSet[E]]
(implicit append: Member.Aux[E, T, R, U]): Member.Aux[E, T, SS[E, L, R], SS[E, L, U]] =
new Member[E, T, SS[E, L, R]] { type Out = SS[E, L, U] }
}
trait MemberLower18 extends MemberLower19 {
implicit def Member3R[E, L <: E, M <: E, R <: E]: Member.Aux[E, R, S3[E, L, M, R], S2[E, L, M]] =
new Member[E, R, S3[E, L, M, R]] { type Out = S2[E, L, M] }
}
trait MemberLower19 {
implicit def MemberAppendNoFx[E, T <: E, R <: TypeSet[E], U <: TypeSet[E]]
(implicit m: Member.Aux[E, T, R, U]): Member.Aux[E, T, SS[E, R, S0], U] =
new Member[E, T, SS[E, R, S0]] { type Out = U }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment