/*______________
| ______ | U I Z E J A V A S C R I P T F R A M E W O R K
| / / | ---------------------------------------------------
| / O / | MODULE : Uize.Templates.Text.Tables.Histogram Package
| / / / |
| / / / /| | ONLINE : http://uize.com
| /____/ /__/_| | COPYRIGHT : (c)2014-2016 UIZE
| /___ | LICENSE : Available under MIT License or GNU General Public License
|_______________| http://uize.com/license.html
*/
/* Module Meta Data
type: Package
importance: 1
codeCompleteness: 100
docCompleteness: 4
*/
/*?
Introduction
The =Uize.Templates.Text.Tables.Histogram= module is a JavaScript Template module, used for generating a text-based histogram table that can be used when outputting to logs, consoles, terminals, etc.
*DEVELOPERS:* `Chris van Rensburg`
*/
Uize.module ({
name:'Uize.Templates.Text.Tables.Histogram',
required:[
'Uize.Templates.Text.Table',
'Uize.Templates.Text.ProgressBar',
'Uize.Data.Util',
'Uize.Array.Util'
],
builder:function () {
'use strict';
return Uize.package ({
process:function (_input) {
var
_occurrencesByValue = _input.occurrencesByValue,
_columnTitles = _input.columnTitles,
_values = Uize.keys (_occurrencesByValue),
_minValue = Uize.min (_values),
_maxValue = Uize.max (_values),
_maxBuckets = Uize.toNumber (_input.maxBuckets,Infinity),
_rows
;
if (_maxBuckets > _values.length) {
_rows = Uize.map (
_values.sort (function (_valueA,_valueB) {return _valueA - _valueB}),
function (_value) {
var _occurrencesForValue = _occurrencesByValue [_value];
return [_value,_occurrencesForValue,_value * _occurrencesForValue];
}
);
} else {
var _bucketSize = (_maxValue - _minValue + 1) / _maxBuckets;
_rows = Uize.map (
_maxBuckets,
function (_value,_bucketNo) {
return [
Math.floor (_minValue + _bucketNo * _bucketSize) +
'-' +
(Math.floor (_minValue + (_bucketNo + 1) * _bucketSize) - 1),
0,
0
];
}
);
Uize.forEach (
_occurrencesByValue,
function (_occurrencesForValue,_value) {
var _row = _rows [Math.floor ((_value - _minValue) / _bucketSize)];
_row [1] += _occurrencesForValue;
_row [2] += _occurrencesForValue * _value;
}
);
}
var
_totals = Uize.Data.Util.getColumn (_rows,2),
_maxOccurrences = Uize.max (Uize.Data.Util.getColumn (_rows,1)),
_maxTotals = Uize.max (_totals),
_trackLength = Uize.constrain (_maxOccurrences,20,50)
;
function _barFormatter (_max) {
return function (_value) {
return (
_value != undefined
? (
_value +
(
Uize.isNumber (_value)
? (
' ' +
Uize.Templates.Text.ProgressBar.process ({
trackLength:_trackLength,
endsChar:'',
fullHeadChar:'',
progress:_value / _max
})
)
: ''
)
)
: ''
);
}
}
return Uize.Templates.Text.Table.process ({
title:_input.title,
columns:[
{title:_columnTitles.count},
{
title:_columnTitles.occurrences,
align:'right',
formatter:_barFormatter (_maxOccurrences)
},
{
title:_columnTitles.total,
align:'right',
formatter:_barFormatter (_maxTotals)
}
],
rows:_rows.concat ([
[
'All (' + _minValue + '-' + _maxValue + ')',
undefined,
Uize.Array.Util.sum (_totals) + ''
]
])
});
}
});
}
});