Created
September 2, 2016 05:20
-
-
Save sir-wabbit/5e83de9b4d33f38714bfb85430d19ebe to your computer and use it in GitHub Desktop.
TypeSet.scala
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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