declare function flatten <T> (array: flatten.NestedArray<T>): T[];

declare namespace flatten {
  export interface NestedArray <T> extends Array<T | NestedArray<T>> {}

  export interface NestedList <T> {
    [index: number]: T | NestedList<T>;
    length: number;
  }

  export function from <T> (array: NestedList<T>): T[];
  export function depth <T> (array: NestedArray<T>, depth: number): NestedArray<T>;
  export function depthFrom <T> (array: NestedList<T>, depth: number): NestedArray<T>;
}

export = flatten;
