in accord-core/src/main/java/accord/primitives/Keys.java [137:177]
public static <A, B> Keys ofMergeSorted(List<A> as, Function<? super A, ? extends Key> fa, List<B> bs, Function<? super B, ? extends Key> fb)
{
ObjectBuffers<Key> cache = ArrayBuffers.cachedKeys();
int asSize = as.size(), bsSize = bs.size();
Key[] array = cache.get(asSize + bsSize);
int count = 0;
try
{
int ai = 0, bi = 0;
while (ai < asSize && bi < bsSize)
{
Key a = fa.apply(as.get(ai));
Key b = fb.apply(bs.get(bi));
int c = a.compareTo(b);
if (c <= 0)
{
array[count++] = a;
ai++;
bi = c == 0 ? bi + 1 : bi;
}
else
{
array[count++] = b;
bi++;
}
}
while (ai < asSize)
array[count++] = fa.apply(as.get(ai++));
while (bi < bsSize)
array[count++] = fb.apply(bs.get(bi++));
Key[] result = cache.complete(array, count);
cache.discard(array, count);
return ofSortedUnique(result);
}
catch (Throwable t)
{
cache.forceDiscard(array, count);
throw t;
}
}