1
1
import sbt ._
2
2
3
+ import scala .annotation .tailrec
4
+
3
5
/**
4
6
* Copied, with some modifications, from https://github.com/milessabin/shapeless/blob/master/project/Boilerplate.scala
5
7
*
@@ -28,8 +30,13 @@ object Boilerplate {
28
30
GenTupleSemigroupalSyntax ,
29
31
GenParallelArityFunctions ,
30
32
GenParallelArityFunctions2 ,
33
+ GenFoldableArityFunctions ,
31
34
GenTupleParallelSyntax ,
32
- GenFoldableArityFunctions
35
+ GenTupleShowInstances ,
36
+ GenTupleMonadInstances ,
37
+ GenTupleBifunctorInstances ,
38
+ GenTupleBitraverseInstances ,
39
+ GenTupleUnorderedFoldableInstances
33
40
)
34
41
35
42
val header = " // auto-generated boilerplate by /project/Boilerplate.scala" // TODO: put something meaningful here?
@@ -49,21 +56,58 @@ object Boilerplate {
49
56
final class TemplateVals (val arity : Int ) {
50
57
val synTypes = (0 until arity).map(n => s " A $n" )
51
58
val synVals = (0 until arity).map(n => s " a $n" )
52
- val synTypedVals = ( synVals.zip(synTypes) ).map { case (v, t) => v + " :" + t }
59
+ val synTypedVals = synVals.zip(synTypes).map { case (v, t) => v + " :" + t }
53
60
val `A..N` = synTypes.mkString(" , " )
54
61
val `a..n` = synVals.mkString(" , " )
55
62
val `_.._` = Seq .fill(arity)(" _" ).mkString(" , " )
56
- val `(A..N)` = if (arity == 1 ) " Tuple1[A ]" else synTypes.mkString(" (" , " , " , " )" )
63
+ val `(A..N)` = if (arity == 1 ) " Tuple1[A0 ]" else synTypes.mkString(" (" , " , " , " )" )
57
64
val `(_.._)` = if (arity == 1 ) " Tuple1[_]" else Seq .fill(arity)(" _" ).mkString(" (" , " , " , " )" )
58
65
val `(a..n)` = if (arity == 1 ) " Tuple1(a)" else synVals.mkString(" (" , " , " , " )" )
59
66
val `a:A..n:N` = synTypedVals.mkString(" , " )
67
+
68
+ val `A..(N - 1)` = (0 until (arity - 1 )).map(n => s " A $n" )
69
+ val `A..(N - 2)` = (0 until (arity - 2 )).map(n => s " A $n" )
70
+ val `A0, A(N - 1)` = if (arity <= 1 ) " " else `A..(N - 1)`.mkString(" , " )
71
+ val `A0, A(N - 2)` = if (arity <= 2 ) " " else `A..(N - 2)`.mkString(" " , " , " , " , " )
72
+ val `[A0, A(N - 2)]` = if (arity <= 2 ) " " else `A..(N - 2)`.mkString(" [" , " , " , " ]" )
73
+ val `(A..N - 2, *, *)` =
74
+ if (arity <= 2 ) " (*, *)"
75
+ else `A..(N - 2)`.mkString(" (" , " , " , " , *, *)" )
76
+ val `a..(n - 1)` = (0 until (arity - 1 )).map(n => s " a $n" )
77
+ val `fa._1..fa._(n - 2)` =
78
+ if (arity <= 2 ) " " else (0 until (arity - 2 )).map(n => s " fa._ ${n + 1 }" ).mkString(" " , " , " , " , " )
79
+ val `pure(fa._1..(n - 2))` =
80
+ if (arity <= 2 ) " " else (0 until (arity - 2 )).map(n => s " G.pure(fa._ ${n + 1 }) " ).mkString(" " , " , " , " , " )
81
+ val `a0, a(n - 1)` = if (arity <= 1 ) " " else `a..(n - 1)`.mkString(" , " )
82
+ val `[A0, A(N - 1)]` = if (arity <= 1 ) " " else `A..(N - 1)`.mkString(" [" , " , " , " ]" )
83
+ val `(A0, A(N - 1))` =
84
+ if (arity == 1 ) " Tuple1[A0]"
85
+ else if (arity == 2 ) " A0"
86
+ else `A..(N - 1)`.mkString(" (" , " , " , " )" )
87
+ val `(A..N - 1, *)` =
88
+ if (arity == 1 ) " Tuple1"
89
+ else `A..(N - 1)`.mkString(" (" , " , " , " , *)" )
90
+ val `(fa._1..(n - 1))` =
91
+ if (arity <= 1 ) " Tuple1.apply" else (0 until (arity - 1 )).map(n => s " fa._ ${n + 1 }" ).mkString(" (" , " , " , " , _)" )
92
+
93
+ def `A0, A(N - 1)&` (a : String ): String =
94
+ if (arity <= 1 ) s " Tuple1[ $a] " else `A..(N - 1)`.mkString(" (" , " , " , s " , $a) " )
95
+
96
+ def `fa._1..(n - 1) & ` (a : String ): String =
97
+ if (arity <= 1 ) s " Tuple1( $a) " else (0 until (arity - 1 )).map(n => s " fa._ ${n + 1 }" ).mkString(" (" , " , " , s " , $a) " )
98
+
99
+ def `constraints A..N` (c : String ): String = synTypes.map(tpe => s " $tpe: $c[ $tpe] " ).mkString(" (implicit " , " , " , " )" )
100
+ def `constraints A..(N-1)` (c : String ): String =
101
+ if (arity <= 1 ) " " else `A..(N - 1)`.map(tpe => s " $tpe: $c[ $tpe] " ).mkString(" (implicit " , " , " , " )" )
102
+ def `parameters A..(N-1)` (c : String ): String = `A..(N - 1)`.map(tpe => s " $tpe: $c[ $tpe] " ).mkString(" , " )
60
103
}
61
104
62
105
trait Template {
63
106
def filename (root : File ): File
64
107
def content (tv : TemplateVals ): String
65
108
def range = 1 to maxArity
66
109
def body : String = {
110
+ @ tailrec
67
111
def expandInstances (contents : IndexedSeq [Array [String ]], acc : Array [String ] = Array .empty): Array [String ] =
68
112
if (! contents.exists(_.exists(_.startsWith(" -" ))))
69
113
acc.map(_.tail)
@@ -108,8 +152,7 @@ object Boilerplate {
108
152
val tpes = synTypes.map { tpe =>
109
153
s " F[ $tpe] "
110
154
}
111
- val tpesString = synTypes.mkString(" , " )
112
- val params = (synVals.zip(tpes)).map { case (v, t) => s " $v: $t" }.mkString(" , " )
155
+ val params = synVals.zip(tpes).map { case (v, t) => s " $v: $t" }.mkString(" , " )
113
156
val next = if (arity + 1 <= maxArity) {
114
157
s " def |@|[Z](z: F[Z]) = new SemigroupalBuilder ${arity + 1 }( ${`a..n`}, z) "
115
158
} else {
@@ -179,7 +222,7 @@ object Boilerplate {
179
222
s " F[ $tpe] "
180
223
}
181
224
val fargs = (0 until arity).map(" f" + _)
182
- val fparams = ( fargs.zip(tpes) ).map { case (v, t) => s " $v: $t" }.mkString(" , " )
225
+ val fparams = fargs.zip(tpes).map { case (v, t) => s " $v: $t" }.mkString(" , " )
183
226
184
227
val a = arity / 2
185
228
val b = arity - a
@@ -258,8 +301,7 @@ object Boilerplate {
258
301
s " M[ $tpe] "
259
302
}
260
303
val fargs = (0 until arity).map(" m" + _)
261
- val fparams = (fargs.zip(tpes)).map { case (v, t) => s " $v: $t" }.mkString(" , " )
262
- val fargsS = fargs.mkString(" , " )
304
+ val fparams = fargs.zip(tpes).map { case (v, t) => s " $v: $t" }.mkString(" , " )
263
305
val nestedExpansion = ParallelNestedExpansions (arity)
264
306
265
307
block """
@@ -291,8 +333,7 @@ object Boilerplate {
291
333
s " M[ $tpe] "
292
334
}
293
335
val fargs = (0 until arity).map(" m" + _)
294
- val fparams = (fargs.zip(tpes)).map { case (v, t) => s " $v: $t" }.mkString(" , " )
295
- val fargsS = fargs.mkString(" , " )
336
+ val fparams = fargs.zip(tpes).map { case (v, t) => s " $v: $t" }.mkString(" , " )
296
337
val nestedExpansion = ParallelNestedExpansions (arity)
297
338
298
339
block """
@@ -324,7 +365,7 @@ object Boilerplate {
324
365
s " F[ $tpe] "
325
366
}
326
367
val fargs = (0 until arity).map(" f" + _)
327
- val fparams = ( fargs.zip(tpes) ).map { case (v, t) => s " $v: $t" }.mkString(" , " )
368
+ val fparams = fargs.zip(tpes).map { case (v, t) => s " $v: $t" }.mkString(" , " )
328
369
val fargsS = fargs.mkString(" , " )
329
370
330
371
val nestedProducts = (0 until (arity - 2 ))
@@ -392,7 +433,7 @@ object Boilerplate {
392
433
393
434
val tuple = s " Tuple $arity[ $tpesString] "
394
435
val tupleTpe = s " t $arity: $tuple"
395
- val tupleArgs = (1 to arity).map { case n => s " t $arity._ $n" } .mkString(" , " )
436
+ val tupleArgs = (1 to arity).map( n => s " t $arity._ $n" ) .mkString(" , " )
396
437
397
438
val n = if (arity == 1 ) {
398
439
" "
@@ -443,7 +484,7 @@ object Boilerplate {
443
484
444
485
val tuple = s " Tuple $arity[ $tpesString] "
445
486
val tupleTpe = s " t $arity: $tuple"
446
- val tupleArgs = (1 to arity).map { case n => s " t $arity._ $n" } .mkString(" , " )
487
+ val tupleArgs = (1 to arity).map( n => s " t $arity._ $n" ) .mkString(" , " )
447
488
448
489
val n = if (arity == 1 ) {
449
490
" "
@@ -485,8 +526,6 @@ object Boilerplate {
485
526
|package cats
486
527
|package syntax
487
528
|
488
- |
489
- |
490
529
|trait TupleSemigroupalSyntax {
491
530
- implicit def catsSyntaxTuple ${arity}Semigroupal[F[_], ${`A..N`}]( $tupleTpe): Tuple ${arity}SemigroupalOps[F, ${`A..N`}] = new Tuple ${arity}SemigroupalOps(t $arity)
492
531
|}
@@ -512,7 +551,6 @@ object Boilerplate {
512
551
513
552
val tupleTpe = (1 to arity).map(_ => " A" ).mkString(" (" , " , " , " )" )
514
553
def listXN (range : Range ) = range.map(" x" + _).mkString(" :: " )
515
- val reverseXN = listXN(1 to arity - 1 )
516
554
val tupleXN = (1 to arity).map(" x" + _).mkString(" (" , " , " , " )" )
517
555
518
556
block """
@@ -550,7 +588,7 @@ object Boilerplate {
550
588
- val (acc, l) = eval.value
551
589
- l match {
552
590
- case ${listXN(2 to arity)} :: Nil =>
553
- - Now(( $tupleXN :: acc, ${listXN(1 to arity - 1 )} :: Nil))
591
+ - Now(( $tupleXN :: acc, ${listXN(1 until arity)} :: Nil))
554
592
- case l =>
555
593
- Now((acc, x1 :: l))
556
594
- }
0 commit comments