export interface Iterator { (value: V, key: K): void } export interface IterableObject { [key: string]: T } export function forEach (items: IterableObject, func: Iterator) export function forEach (items: T[], func: Iterator) export function forEach (items, func: Iterator) { let isObject = (typeof items == 'object'); let isArray = isObject && 'slice' in items; if ( !isObject && !isArray ) throw Error(`Items are not iterable`); if ( isArray ) { for ( let i = 0, length = items.length ; i < length ; i++ ) func.call(func, items[i], i); } else { let keys = Object.keys(items); for (let i = 0, length = keys.length; i < length; i++) func.call(func, items[ keys[i] ], keys[i]); } }