You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					117 lines
				
				3.2 KiB
			
		
		
			
		
	
	
					117 lines
				
				3.2 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | var util = require('util') | ||
|  | var TrackerBase = require('./tracker-base.js') | ||
|  | var Tracker = require('./tracker.js') | ||
|  | var TrackerStream = require('./tracker-stream.js') | ||
|  | 
 | ||
|  | var TrackerGroup = module.exports = function (name) { | ||
|  |   TrackerBase.call(this, name) | ||
|  |   this.parentGroup = null | ||
|  |   this.trackers = [] | ||
|  |   this.completion = {} | ||
|  |   this.weight = {} | ||
|  |   this.totalWeight = 0 | ||
|  |   this.finished = false | ||
|  |   this.bubbleChange = bubbleChange(this) | ||
|  | } | ||
|  | util.inherits(TrackerGroup, TrackerBase) | ||
|  | 
 | ||
|  | function bubbleChange (trackerGroup) { | ||
|  |   return function (name, completed, tracker) { | ||
|  |     trackerGroup.completion[tracker.id] = completed | ||
|  |     if (trackerGroup.finished) { | ||
|  |       return | ||
|  |     } | ||
|  |     trackerGroup.emit('change', name || trackerGroup.name, trackerGroup.completed(), trackerGroup) | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | TrackerGroup.prototype.nameInTree = function () { | ||
|  |   var names = [] | ||
|  |   var from = this | ||
|  |   while (from) { | ||
|  |     names.unshift(from.name) | ||
|  |     from = from.parentGroup | ||
|  |   } | ||
|  |   return names.join('/') | ||
|  | } | ||
|  | 
 | ||
|  | TrackerGroup.prototype.addUnit = function (unit, weight) { | ||
|  |   if (unit.addUnit) { | ||
|  |     var toTest = this | ||
|  |     while (toTest) { | ||
|  |       if (unit === toTest) { | ||
|  |         throw new Error( | ||
|  |           'Attempted to add tracker group ' + | ||
|  |           unit.name + ' to tree that already includes it ' + | ||
|  |           this.nameInTree(this)) | ||
|  |       } | ||
|  |       toTest = toTest.parentGroup | ||
|  |     } | ||
|  |     unit.parentGroup = this | ||
|  |   } | ||
|  |   this.weight[unit.id] = weight || 1 | ||
|  |   this.totalWeight += this.weight[unit.id] | ||
|  |   this.trackers.push(unit) | ||
|  |   this.completion[unit.id] = unit.completed() | ||
|  |   unit.on('change', this.bubbleChange) | ||
|  |   if (!this.finished) { | ||
|  |     this.emit('change', unit.name, this.completion[unit.id], unit) | ||
|  |   } | ||
|  |   return unit | ||
|  | } | ||
|  | 
 | ||
|  | TrackerGroup.prototype.completed = function () { | ||
|  |   if (this.trackers.length === 0) { | ||
|  |     return 0 | ||
|  |   } | ||
|  |   var valPerWeight = 1 / this.totalWeight | ||
|  |   var completed = 0 | ||
|  |   for (var ii = 0; ii < this.trackers.length; ii++) { | ||
|  |     var trackerId = this.trackers[ii].id | ||
|  |     completed += | ||
|  |       valPerWeight * this.weight[trackerId] * this.completion[trackerId] | ||
|  |   } | ||
|  |   return completed | ||
|  | } | ||
|  | 
 | ||
|  | TrackerGroup.prototype.newGroup = function (name, weight) { | ||
|  |   return this.addUnit(new TrackerGroup(name), weight) | ||
|  | } | ||
|  | 
 | ||
|  | TrackerGroup.prototype.newItem = function (name, todo, weight) { | ||
|  |   return this.addUnit(new Tracker(name, todo), weight) | ||
|  | } | ||
|  | 
 | ||
|  | TrackerGroup.prototype.newStream = function (name, todo, weight) { | ||
|  |   return this.addUnit(new TrackerStream(name, todo), weight) | ||
|  | } | ||
|  | 
 | ||
|  | TrackerGroup.prototype.finish = function () { | ||
|  |   this.finished = true | ||
|  |   if (!this.trackers.length) { | ||
|  |     this.addUnit(new Tracker(), 1, true) | ||
|  |   } | ||
|  |   for (var ii = 0; ii < this.trackers.length; ii++) { | ||
|  |     var tracker = this.trackers[ii] | ||
|  |     tracker.finish() | ||
|  |     tracker.removeListener('change', this.bubbleChange) | ||
|  |   } | ||
|  |   this.emit('change', this.name, 1, this) | ||
|  | } | ||
|  | 
 | ||
|  | var buffer = '                                  ' | ||
|  | TrackerGroup.prototype.debug = function (depth) { | ||
|  |   depth = depth || 0 | ||
|  |   var indent = depth ? buffer.substr(0, depth) : '' | ||
|  |   var output = indent + (this.name || 'top') + ': ' + this.completed() + '\n' | ||
|  |   this.trackers.forEach(function (tracker) { | ||
|  |     if (tracker instanceof TrackerGroup) { | ||
|  |       output += tracker.debug(depth + 1) | ||
|  |     } else { | ||
|  |       output += indent + ' ' + tracker.name + ': ' + tracker.completed() + '\n' | ||
|  |     } | ||
|  |   }) | ||
|  |   return output | ||
|  | } |