@Override
@SuppressWarnings("unchecked")
public Iterator<Tuple2<KeyedWindow, SparkElement>> call(SparkElement se) throws Exception {
final Iterable<Window> windows = windowing.assignWindowsToElement(new SparkElement(
se.getWindow(),
se.getTimestamp(),
left
? Either.left(se.getElement())
: Either.right(se.getElement())));
return Iterators.transform(windows.iterator(), w -> new Tuple2<>(
new KeyedWindow<>(w, se.getTimestamp(), keyExtractor.apply(se.getElement())),
new SparkElement(w, se.getTimestamp(), se.getElement())));
}