import _ = require('underscore'); export class Utilities { objectMapValues( input:_.Dictionary, iterator:_.ObjectIterator, stack?:any ):_.Dictionary; objectMapValues( input:_.List, iterator:_.ListIterator, stack?:any ):_.Dictionary; objectMapValues(input, iterator, stack = {}):any { return this.objectMap( input, (value, key) => { return [key, iterator(value, key)] } ); } objectMapKeys( input:_.Dictionary, iterator:_.ObjectIterator, stack?:any ):_.Dictionary; objectMapKeys( input:_.List, iterator:_.ListIterator, stack?:any ):_.Dictionary; objectMapKeys(input, iterator, stack = {}):any { return this.objectMap( input, (value, key) => { return [iterator(value, key), value] }, stack ) } objectMap( input:_.Dictionary, iterator:_.ObjectIterator, stack?:any ):_.Dictionary; objectMap( input:_.List, iterator:_.ListIterator, stack?:any ):_.Dictionary; objectMap(input, iterator, stack = {}):any { var output = {} _.each(input, (inputValue, inputKey) => { var tuple = iterator(inputValue, inputKey); var outputKey = tuple[0]; var outputValue = tuple[1]; output[outputKey] = outputValue; }) return output; } objectZip( keys:string[], values:T[] ):{[key:string]: T} { var output:{[key:string]: T} = {} for (var i=0; i( input:_.Dictionary, iterator:(value:T, key:string) => boolean ):_.Dictionary { var output:_.Dictionary = {}; _.each(input, (value:T, key:string) => { if (iterator(value, key)) { output[key] = value; } }); return output; } objectCompact( input:_.Dictionary ):_.Dictionary { return this.objectFilter(input, (value) => { return !(value === undefined || value === null) }); } }