mirror of
				https://github.com/flynx/features.js.git
				synced 2025-10-31 03:10:09 +00:00 
			
		
		
		
	fixed sorting in new alg...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									91cd7c51a4
								
							
						
					
					
						commit
						86544af835
					
				
							
								
								
									
										65
									
								
								features.js
									
									
									
									
									
								
							
							
						
						
									
										65
									
								
								features.js
									
									
									
									
									
								
							| @ -1027,11 +1027,6 @@ var FeatureSetProto = { | |||||||
| 			data = data || {} | 			data = data || {} | ||||||
| 			_seen = _seen || [] | 			_seen = _seen || [] | ||||||
| 
 | 
 | ||||||
| 			// user filter...
 |  | ||||||
| 			lst = filter ? |  | ||||||
| 				lst.filter(function(n){ return filter.call(that, n) }) |  | ||||||
| 				: lst |  | ||||||
| 
 |  | ||||||
| 			// clear disabled...
 | 			// clear disabled...
 | ||||||
| 			// NOTE: we do as a separate stage to avoid loading a 
 | 			// NOTE: we do as a separate stage to avoid loading a 
 | ||||||
| 			// 		feature before it is disabled in the same list...
 | 			// 		feature before it is disabled in the same list...
 | ||||||
| @ -1131,6 +1126,13 @@ var FeatureSetProto = { | |||||||
| 		var disabled = [] | 		var disabled = [] | ||||||
| 		var missing = [] | 		var missing = [] | ||||||
| 
 | 
 | ||||||
|  | 		// user filter...
 | ||||||
|  | 		// NOTE: we build this out of the full feature list...
 | ||||||
|  | 		var filtered_out = filter ? | ||||||
|  | 			this.features.filter(function(n){ return !filter.call(that, n) }) | ||||||
|  | 			: []  | ||||||
|  | 		disabled = disabled.concat(filtered_out) | ||||||
|  | 
 | ||||||
| 		// build exclusive groups...
 | 		// build exclusive groups...
 | ||||||
| 		// XXX use these as aliases...
 | 		// XXX use these as aliases...
 | ||||||
| 		// 		...we need to do this on the build stage to include correct
 | 		// 		...we need to do this on the build stage to include correct
 | ||||||
| @ -1219,34 +1221,61 @@ var FeatureSetProto = { | |||||||
| 		list.forEach(function(f){ expanddeps(list, f) }) | 		list.forEach(function(f){ expanddeps(list, f) }) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 		// sort by priority...
 | ||||||
| 		list = list | 		list = list | ||||||
| 			// sort by priority...
 |  | ||||||
| 			// format: 
 | 			// format: 
 | ||||||
| 			// 	[ <feature>, <index>, <priority> ]
 | 			// 	[ <feature>, <index>, <priority> ]
 | ||||||
| 			.map(function(e, i){  | 			.map(function(e, i){  | ||||||
| 				return [e, i, (that[e] && that[e].getPriority) ? that[e].getPriority() : 0 ] }) | 				return [e, i, (that[e] && that[e].getPriority) ? that[e].getPriority() : 0 ] }) | ||||||
| 			.sort(function(a, b){  | 			.sort(function(a, b){  | ||||||
| 				return a[2] - b[2] || a[1] - b[1] }) | 				return a[2] - b[2] || a[1] - b[1] }) | ||||||
| 
 |  | ||||||
| 			// sort by dependency...
 |  | ||||||
| 			// format: 
 |  | ||||||
| 			// 	[ <feature>, <index> ]
 |  | ||||||
| 			.map(function(e, i){  |  | ||||||
| 				return [e[0], i] }) |  | ||||||
| 			// NOTE: this can't sort mutually dependant features (loop)...
 |  | ||||||
| 			.sort(function(a, b){ |  | ||||||
| 				return (features[a[0]] || []).indexOf(b[0]) >= 0 ? -1 |  | ||||||
| 					: (features[b[0]] || []).indexOf(a[0]) >= 0 ? 1 |  | ||||||
| 					: a[1] - b[1] }) |  | ||||||
| 	 |  | ||||||
| 			// cleanup...
 | 			// cleanup...
 | ||||||
| 			.map(function(e){ return e[0] }) | 			.map(function(e){ return e[0] }) | ||||||
|  | 			// sort by the order features should be loaded...
 | ||||||
|  | 			.reverse() | ||||||
| 
 | 
 | ||||||
|  | 		// sort by dependency...
 | ||||||
|  | 		// NOTE: this requires the list to be ordered from high to low 
 | ||||||
|  | 		// 		priority, i.e. the same order they should be loaded in...
 | ||||||
|  | 		// XXX dependency loops will throw this into and infinite loop...
 | ||||||
|  | 		// XXX need a better loop detection....
 | ||||||
|  | 		var loops = list.length | ||||||
|  | 		do { | ||||||
|  | 			var moves = 0 | ||||||
|  | 			list | ||||||
|  | 				.slice() | ||||||
|  | 				.forEach(function(e){ | ||||||
|  | 					var deps = features[e] | ||||||
|  | 					if(!deps){ | ||||||
|  | 						return | ||||||
|  | 					} | ||||||
|  | 					var from = list.indexOf(e) | ||||||
|  | 					var to = list | ||||||
|  | 						.map(function(f, i){ return [f, i] }) | ||||||
|  | 						.slice(from+1) | ||||||
|  | 						// keep only dependencies...
 | ||||||
|  | 						.filter(function(f){ return deps.indexOf(f[0]) >= 0 }) | ||||||
|  | 						.pop() | ||||||
|  | 					if(to){ | ||||||
|  | 						// place after last dependency...
 | ||||||
|  | 						list.splice(to[1]+1, 0, e) | ||||||
|  | 						list.splice(from, 1) | ||||||
|  | 						moves++ | ||||||
|  | 					} | ||||||
|  | 				}) | ||||||
|  | 			loops-- | ||||||
|  | 		} while(moves > 0 && loops > 0) | ||||||
|  | 
 | ||||||
|  | 		// sanity check...
 | ||||||
|  | 		loops <= 0 | ||||||
|  | 			&& console.error('Hit loop limit while sorting dependencies!') | ||||||
| 
 | 
 | ||||||
| 		return { | 		return { | ||||||
| 			features: features, | 			features: features, | ||||||
| 			list: list, | 			list: list, | ||||||
| 			loops: loops, | 			loops: loops, | ||||||
|  | 			filtered_out: filtered_out, | ||||||
|  | 			disabled: disabled, | ||||||
| 		} | 		} | ||||||
| 	}, | 	}, | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user