1
1
package dotty .tools .benchmarks .tuples
2
2
3
3
import org .openjdk .jmh .annotations ._
4
+ import scala .util .Random
4
5
5
6
@ State (Scope .Thread )
6
7
class TupleOps {
7
8
var tuple1 : Tuple = _
8
9
var tuple2 : Tuple = _
10
+ var tuple3 : Tuple = _
9
11
10
12
@ Setup
11
13
def setup (): Unit = {
@@ -16,6 +18,8 @@ class TupleOps {
16
18
tuple2 = ()
17
19
for (i <- 1 until 10 )
18
20
tuple2 = s " elem $i" *: tuple2
21
+
22
+ tuple3 = Tuple .fromArray(Random .shuffle(1 to 15 ).toArray)
19
23
}
20
24
21
25
def tupleFlatMap (tuple : Tuple , f : [A ] => A => Tuple ): Tuple = {
@@ -34,6 +38,22 @@ class TupleOps {
34
38
tailRecReverse(tuple, ())
35
39
}
36
40
41
+ def tupleMerge (tuple1 : Tuple , tuple2 : Tuple ): Tuple = (tuple1, tuple2) match {
42
+ case (_, ()) => tuple1
43
+ case ((), _) => tuple2
44
+ case (x *: xs, y *: ys) =>
45
+ if (x.asInstanceOf [Int ] <= y.asInstanceOf [Int ]) x *: tupleMerge(xs, tuple2)
46
+ else y *: tupleMerge(tuple1, ys)
47
+ }
48
+
49
+ def tupleMergeSort (tuple : Tuple ): Tuple =
50
+ if (tuple.size <= 1 ) tuple
51
+ else {
52
+ val (tuple1, tuple2) = tuple.splitAt(tuple.size / 2 )
53
+ val (sorted1, sorted2) = (tupleMergeSort(tuple1), tupleMergeSort(tuple2))
54
+ tupleMerge(sorted1, sorted2)
55
+ }
56
+
37
57
@ Benchmark
38
58
def reverse (): Tuple = {
39
59
tupleReverse(tuple1)
@@ -43,4 +63,9 @@ class TupleOps {
43
63
def flatMap (): Tuple = {
44
64
tupleFlatMap(tuple2, [A ] => (x : A ) => (x, x))
45
65
}
66
+
67
+ @ Benchmark
68
+ def mergeSort (): Tuple = {
69
+ tupleMergeSort(tuple3)
70
+ }
46
71
}
0 commit comments