class TopPerKey extends ShuffleOperator<InputT, KeyT, Triple<KeyT, ValueT, ScoreT>> implements TypeAware.Value<ValueT>, CompositeOperator<InputT, Triple<KeyT, ValueT, ScoreT>> {

  public static <InputT> KeyByBuilder<InputT> of(PCollection<InputT> input) {
    return named(null).of(input);
  }

  private  TopPerKey(
      @Nullable String name,
      UnaryFunction<InputT, KeyT> keyExtractor,
      @Nullable TypeDescriptor<KeyT> keyType,
      UnaryFunction<InputT, ValueT> valueExtractor,
      @Nullable TypeDescriptor<ValueT> valueType,
      UnaryFunction<InputT, ScoreT> scoreExtractor,
      @Nullable TypeDescriptor<ScoreT> scoreType,
      @Nullable Window<InputT> window,
      @Nullable TypeDescriptor<Triple<KeyT, ValueT, ScoreT>> outputType);

}