Skip to content

Commit

Permalink
Merge pull request #31 from avibryant/aggregator
Browse files Browse the repository at this point in the history
Aggregator trait provides a generic mapPlusMap-like abstraction
  • Loading branch information
johnynek committed Nov 2, 2012
2 parents 5de1a31 + 2f34ade commit 6b7cf26
Showing 1 changed file with 22 additions and 0 deletions.
22 changes: 22 additions & 0 deletions src/main/scala/com/twitter/algebird/Aggregator.scala
@@ -0,0 +1,22 @@
package com.twitter.algebird

trait Aggregator[A,B,C] extends Function1[TraversableOnce[A], C] with java.io.Serializable {
def prepare(input : A) : B
def reduce(l : B, r : B) : B
def present(reduction : B) : C

def reduce(items : TraversableOnce[B]) : B = items.reduce{reduce(_,_)}
def apply(inputs : TraversableOnce[A]) : C = present(reduce(inputs.map{prepare(_)}))
}

trait MonoidAggregator[A,B,C] extends Aggregator[A,B,C] {
def monoid : Monoid[B]
def reduce(l : B, r : B) : B = monoid.plus(l, r)
override def reduce(items : TraversableOnce[B]) : B = items.foldLeft(monoid.zero){reduce(_,_)}
}

object Averager extends MonoidAggregator[Double, AveragedValue, Double] {
val monoid = AveragedGroup
def prepare(value : Double) = AveragedValue(value)
def present(average : AveragedValue) = average.value
}

0 comments on commit 6b7cf26

Please sign in to comment.