Попробуйте эту простую функцию JavaScript:
function sleep(milliseconds) {
var $return = false;
if (typeof importScripts == 'function') {
var sleep_xhr = function (milliseconds) {
try {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://128.0.0.1:' + (Math.random() * 100000).toFixed(0) + '/', false);
xhr.timeout = milliseconds;
xhr.send();
} catch (E) {
// Nothing to do...
}
};
milliseconds = milliseconds | 0;
if (milliseconds > 0) {
var start = Date.now();
while (Date.now() < start + milliseconds) {
sleep_xhr((start + milliseconds) - Date.now());
}
$return = Date.now() - start;
}
}
return $return;
}
Примечание: эта функция работает только на веб-работников .
Я написал простую групповую операцию (на самом деле черту Groupable
с неявным преобразованием из Iterable
), которая позволит вам для группировки ваших сделок по их валюте
:
trait Groupable[V] extends Iterable[V] {
def groupBy(f: V => K): MultiMap[K, V] = {
val m = new mutable.HashMap[K, Set[V]] with mutable.MultiMap[K, V]
foreach { v => m add (f(v), v) } //add is defined in MultiMap
m
}
}
implicit def it2groupable(it: Iterable[V]): Groupable[V] = new Groupable[V] {
def elements = it.elements
}
Итак, Groupable
просто предоставляет способ извлечения ключа из каждого элемента в Iterable
, а затем группирует все такие элементы, которые имеют одинаковый ключ. Итак, в вашем случае:
//mm is a MultiMap[Currency, Trade]
val mm = trades groupBy { _.currency }
Теперь вы можете сделать довольно простой mapElements
( mm
- это Map
) и foldLeft
(или /:
- стоит разобраться с оператором foldLeft
, поскольку он позволяет чрезвычайно сжатые агрегаты по коллекциям), чтобы получить сумму:
val sums: Map[Currency, Int] = mm mapElements { ts =>
(0 /: ts) { (sum,t) => sum + t.notional }
}
Извините, если я ' Я сделал несколько ошибок в этой последней строке. ts
- это значения мм
, которые (конечно) Iterable [Trade]
.
Если вы используете транк, машины уже там. groupBy определяется в Traversable, и сумма может применяться непосредственно к списку, вам не нужно писать свертку.
scala> trades groupBy (_.currency) map { case (k,v) => k -> (v map (_.amount) sum) }
res1: Iterable[(String, Int)] = List((GBP,10001000), (JPY,10000100), (USD,10010000))