amatiasq
7/6/2017 - 2:14 PM

debounce.ts

class ReadableStream<T> {
  
  // ...
  
  debounce(milliseconds: number): ReadableStream<T[]>;
  debounce<TOut>(milliseconds: number, join?: (list: T[]) => TOut): ReadableStream<TOut> {
    let lastTime = Date.now();
    let buffer: T[] = [];

    return new ReadableStream<TOut>((push: (value: TOut) => void) => {
      return this.subscribe(value => {
        const now = Date.now();
        buffer.push(value);

        if (now - lastTime < milliseconds) {
          return null;
        }

        const joined = join ? join(buffer) : buffer;

        // This line doesn't compile:
        // Argument of type 'T[] | TOut' is not assignable to parameter of type 'TOut'.
        //   Type 'T[]' is not assignable to type 'TOut'.
        push(joined);
        buffer = [];
        lastTime = now;
      });
    });
  }
}