1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
package scala.collection.parallel
import scala.collection.Parallel
import scala.collection.mutable.Builder
import scala.collection.generic.Sizing
/** The base trait for all combiners.
* A combiner lets one construct collections incrementally just like
* a regular builder, but also implements an efficient merge operation of two builders
* via `combine` method. Once the collection is constructed, it may be obtained by invoking
* the `result` method.
*
* @tparam Elem the type of the elements added to the builder
* @tparam To the type of the collection the builder produces
*
* @author prokopec
*/
trait Combiner[-Elem, +To] extends Builder[Elem, To] with Sizing with Parallel with TaskSupport {
self: EnvironmentPassingCombiner[Elem, To] =>
type EPC = EnvironmentPassingCombiner[Elem, To]
/** Combines the contents of the receiver builder and the `other` builder,
* producing a new builder containing both their elements.
*
* This method may combine the two builders by copying them into a larger collection,
* by producing a lazy view that gets evaluated once `result` is invoked, or use
* a merge operation specific to the data structure in question.
*
* Note that both the receiver builder and `other` builder become invalidated
* after the invocation of this method, and should be cleared (see `clear`)
* if they are to be used again.
*
* Also, combining two combiners `c1` and `c2` for which `c1 eq c2` is `true`, that is,
* they are the same objects in memories, always does nothing and returns the first combiner.
*
* @tparam N the type of elements contained by the `other` builder
* @tparam NewTo the type of collection produced by the `other` builder
* @param other the other builder
* @return the parallel builder containing both the elements of this and the `other` builder
*/
def combine[N <: Elem, NewTo >: To](other: Combiner[N, NewTo]): Combiner[N, NewTo]
}
trait EnvironmentPassingCombiner[-Elem, +To] extends Combiner[Elem, To] {
abstract override def result = {
val res = super.result
// res.environment = environment
res
}
}
|