/**
 * Flowtype definitions for utils
 * Generated by Flowgen from a Typescript Definition
 * Flowgen v1.11.0
 * @flow
 */

declare export function lastOf<T>(ts: T[]): T | null;
declare export function sortBy<T>(
  ts: T[],
  key: (t: T) => number | string
): void;
declare export function getOrInsert<K, V>(
  map: Map<K, V>,
  k: K,
  fallback: (k: K) => V
): V;
declare export function getOrElse<K, V>(
  map: Map<K, V>,
  k: K,
  fallback: (k: K) => V
): V;
declare export function getOrThrow<K, V>(map: Map<K, V>, k: K): V;
export interface HasKey {
  +key: string | number;
}
declare export class KeyedSet<T: HasKey> implements Iterable<T> {
  getOrInsert(t: T): T;
  forEach(fn: (t: T) => void): void;
  @@iterator: () => Iterator<T>;
}
declare export function itMap<T, U>(
  it: Iterable<T>,
  f: (t: T) => U
): Iterable<U>;
declare export function itForEach<T>(it: Iterable<T>, f: (t: T) => void): void;
declare export function itReduce<T, U>(
  it: Iterable<T>,
  f: (a: U, b: T) => U,
  init: U
): U;
declare export function zeroPad(s: string, width: number): string;
declare export function formatPercent(percent: number): string;
declare export function fract(x: number): number;
declare export function triangle(x: number): number;
declare export function binarySearch(
  lo: number,
  hi: number,
  f: (val: number) => number,
  target: number,
  targetRangeSize?: number
): [number, number];
declare export function noop(...args: any[]): void;
declare export function objectsHaveShallowEquality<T: { [key: string]: any }>(
  a: T,
  b: T
): boolean;
declare export function memoizeByShallowEquality<T: { [key: string]: any }, U>(
  cb: (t: T) => U
): (t: T) => U;
declare export function memoizeByReference<T, U>(cb: (t: T) => U): (t: T) => U;
declare export function lazyStatic<T>(cb: () => T): () => T;
declare export function decodeBase64(encoded: string): Uint8Array;
