Skip to content

Commit 37c740d

Browse files
committed
Merge pull request #484 from nevillelyh/develop
add immutable version of sorted(Reverse)Take
2 parents 2aa6ba8 + e2f6f70 commit 37c740d

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

algebird-core/src/main/scala/com/twitter/algebird/Aggregator.scala

+10
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,16 @@ object Aggregator extends java.io.Serializable {
102102
*/
103103
def sortedReverseTake[T: Ordering](count: Int): MonoidAggregator[T, PriorityQueue[T], Seq[T]] =
104104
new mutable.PriorityQueueToListAggregator[T](count)(implicitly[Ordering[T]].reverse)
105+
/**
106+
* Immutable version of sortedTake, for frameworks that check immutability of reduce functions.
107+
*/
108+
def immutableSortedTake[T: Ordering](count: Int): MonoidAggregator[T, TopK[T], Seq[T]] =
109+
new TopKToListAggregator[T](count)
110+
/**
111+
* Immutable version of sortedReverseTake, for frameworks that check immutability of reduce functions.
112+
*/
113+
def immutableSortedReverseTake[T: Ordering](count: Int): MonoidAggregator[T, TopK[T], Seq[T]] =
114+
new TopKToListAggregator[T](count)(implicitly[Ordering[T]].reverse)
105115
/**
106116
* Put everything in a List. Note, this could fill the memory if the List is very large.
107117
*/

algebird-core/src/main/scala/com/twitter/algebird/TopKMonoid.scala

+6
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,9 @@ class TopKMonoid[T](k: Int)(implicit ord: Ordering[T]) extends Monoid[TopK[T]] {
8787
TopK(size, reversed, max)
8888
}
8989
}
90+
91+
class TopKToListAggregator[A](max: Int)(implicit ord: Ordering[A]) extends MonoidAggregator[A, TopK[A], List[A]] {
92+
val monoid: Monoid[TopK[A]] = new TopKMonoid[A](max)(ord)
93+
override def present(a: TopK[A]): List[A] = a.items
94+
override def prepare(a: A): TopK[A] = TopK(1, List(a), Some(a))
95+
}

0 commit comments

Comments
 (0)