| 
									
										
										
										
											2016-06-08 11:13:41 -07:00
										 |  |  | export function shallowEqual(a: {[x: string]: any}, b: {[x: string]: any}): boolean { | 
					
						
							| 
									
										
										
										
											2016-06-15 16:45:19 -07:00
										 |  |  |   const k1 = Object.keys(a); | 
					
						
							|  |  |  |   const k2 = Object.keys(b); | 
					
						
							| 
									
										
										
										
											2016-05-23 16:14:23 -07:00
										 |  |  |   if (k1.length != k2.length) { | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-06-15 16:45:19 -07:00
										 |  |  |   let key: string; | 
					
						
							|  |  |  |   for (let i = 0; i < k1.length; i++) { | 
					
						
							| 
									
										
										
										
											2016-05-23 16:14:23 -07:00
										 |  |  |     key = k1[i]; | 
					
						
							|  |  |  |     if (a[key] !== b[key]) { | 
					
						
							|  |  |  |       return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function flatten<T>(a: T[][]): T[] { | 
					
						
							| 
									
										
										
										
											2016-06-15 16:45:19 -07:00
										 |  |  |   const target: T[] = []; | 
					
						
							| 
									
										
										
										
											2016-05-23 16:14:23 -07:00
										 |  |  |   for (let i = 0; i < a.length; ++i) { | 
					
						
							|  |  |  |     for (let j = 0; j < a[i].length; ++j) { | 
					
						
							|  |  |  |       target.push(a[i][j]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return target; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 09:14:41 -07:00
										 |  |  | export function first<T>(a: T[]): T { | 
					
						
							| 
									
										
										
										
											2016-05-23 16:14:23 -07:00
										 |  |  |   return a.length > 0 ? a[0] : null; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 09:14:41 -07:00
										 |  |  | export function last<T>(a: T[]): T { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:14:26 -07:00
										 |  |  |   return a.length > 0 ? a[a.length - 1] : null; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  | export function and(bools: boolean[]): boolean { | 
					
						
							| 
									
										
										
										
											2016-06-08 11:13:41 -07:00
										 |  |  |   return bools.reduce((a, b) => a && b, true); | 
					
						
							| 
									
										
										
										
											2016-06-01 14:32:15 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-23 16:14:23 -07:00
										 |  |  | export function merge<V>(m1: {[key: string]: V}, m2: {[key: string]: V}): {[key: string]: V} { | 
					
						
							|  |  |  |   var m: {[key: string]: V} = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for (var attr in m1) { | 
					
						
							|  |  |  |     if (m1.hasOwnProperty(attr)) { | 
					
						
							|  |  |  |       m[attr] = m1[attr]; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for (var attr in m2) { | 
					
						
							|  |  |  |     if (m2.hasOwnProperty(attr)) { | 
					
						
							|  |  |  |       m[attr] = m2[attr]; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return m; | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 11:13:41 -07:00
										 |  |  | export function forEach<K, V>( | 
					
						
							|  |  |  |     map: {[key: string]: V}, callback: /*(V, K) => void*/ Function): void { | 
					
						
							| 
									
										
										
										
											2016-05-24 13:23:27 -07:00
										 |  |  |   for (var prop in map) { | 
					
						
							|  |  |  |     if (map.hasOwnProperty(prop)) { | 
					
						
							|  |  |  |       callback(map[prop], prop); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-05-23 16:14:23 -07:00
										 |  |  | } |