fable 3.1.24 → 3.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/fable.js +50 -6
- package/dist/fable.js.map +1 -1
- package/dist/fable.min.js +2 -2
- package/dist/fable.min.js.map +1 -1
- package/package.json +1 -1
- package/source/services/Fable-Service-ExpressionParser/Fable-Service-ExpressionParser-FunctionMap.json +34 -1
- package/source/services/Fable-Service-Math.js +28 -0
- package/source/services/Fable-Service-Utility.js +64 -0
- package/test/Utility_tests.js +65 -0
package/dist/fable.js
CHANGED
|
@@ -3054,7 +3054,7 @@ try{if(!global.localStorage)return false;}catch(_){return false;}var val=global.
|
|
|
3054
3054
|
// presumably different callback function.
|
|
3055
3055
|
// This makes sure that own properties are retained, so that
|
|
3056
3056
|
// decorations and such are not lost along the way.
|
|
3057
|
-
module.exports=wrappy;function wrappy(fn,cb){if(fn&&cb)return wrappy(fn)(cb);if(typeof fn!=='function')throw new TypeError('need wrapper function');Object.keys(fn).forEach(function(k){wrapper[k]=fn[k];});return wrapper;function wrapper(){var args=new Array(arguments.length);for(var i=0;i<args.length;i++){args[i]=arguments[i];}var ret=fn.apply(this,args);var cb=args[args.length-1];if(typeof ret==='function'&&ret!==cb){Object.keys(cb).forEach(function(k){ret[k]=cb[k];});}return ret;}}},{}],130:[function(require,module,exports){module.exports=extend;var hasOwnProperty=Object.prototype.hasOwnProperty;function extend(){var target={};for(var i=0;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;}},{}],131:[function(require,module,exports){module.exports={"name":"fable","version":"3.1.
|
|
3057
|
+
module.exports=wrappy;function wrappy(fn,cb){if(fn&&cb)return wrappy(fn)(cb);if(typeof fn!=='function')throw new TypeError('need wrapper function');Object.keys(fn).forEach(function(k){wrapper[k]=fn[k];});return wrapper;function wrapper(){var args=new Array(arguments.length);for(var i=0;i<args.length;i++){args[i]=arguments[i];}var ret=fn.apply(this,args);var cb=args[args.length-1];if(typeof ret==='function'&&ret!==cb){Object.keys(cb).forEach(function(k){ret[k]=cb[k];});}return ret;}}},{}],130:[function(require,module,exports){module.exports=extend;var hasOwnProperty=Object.prototype.hasOwnProperty;function extend(){var target={};for(var i=0;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;}},{}],131:[function(require,module,exports){module.exports={"name":"fable","version":"3.1.26","description":"A service dependency injection, configuration and logging library.","main":"source/Fable.js","scripts":{"start":"node source/Fable.js","coverage":"./node_modules/.bin/nyc --reporter=lcov --reporter=text-lcov ./node_modules/mocha/bin/_mocha -- -u tdd -R spec","test":"./node_modules/.bin/mocha -u tdd -R spec","build":"npx quack build","docker-dev-build":"docker build ./ -f Dockerfile_LUXURYCode -t fable-image:local","docker-dev-run":"docker run -it -d --name fable-dev -p 30001:8080 -p 38086:8086 -v \"$PWD/.config:/home/coder/.config\" -v \"$PWD:/home/coder/fable\" -u \"$(id -u):$(id -g)\" -e \"DOCKER_USER=$USER\" fable-image:local","docker-dev-shell":"docker exec -it fable-dev /bin/bash","tests":"./node_modules/mocha/bin/_mocha -u tdd --exit -R spec --grep"},"mocha":{"diff":true,"extension":["js"],"package":"./package.json","reporter":"spec","slow":"75","timeout":"5000","ui":"tdd","watch-files":["source/**/*.js","test/**/*.js"],"watch-ignore":["lib/vendor"]},"browser":{"./source/service/Fable-Service-EnvironmentData.js":"./source/service/Fable-Service-EnvironmentData-Web.js","./source/service/Fable-Service-FilePersistence.js":"./source/service/Fable-Service-FilePersistence-Web.js"},"repository":{"type":"git","url":"https://github.com/stevenvelozo/fable.git"},"keywords":["entity","behavior"],"author":"Steven Velozo <steven@velozo.com> (http://velozo.com/)","license":"MIT","bugs":{"url":"https://github.com/stevenvelozo/fable/issues"},"homepage":"https://github.com/stevenvelozo/fable","devDependencies":{"quackage":"^1.0.42"},"dependencies":{"async.eachlimit":"^0.5.2","async.waterfall":"^0.5.2","big.js":"^7.0.1","cachetrax":"^1.0.4","cookie":"^1.0.2","data-arithmatic":"^1.0.7","dayjs":"^1.11.18","fable-log":"^3.0.16","fable-serviceproviderbase":"^3.0.15","fable-settings":"^3.0.12","fable-uuid":"^3.0.11","manyfest":"^1.0.42","simple-get":"^4.0.1"}};},{}],132:[function(require,module,exports){/**
|
|
3058
3058
|
* Fable Application Services Support Library
|
|
3059
3059
|
* @author <steven@velozo.com>
|
|
3060
3060
|
*/ // Pre-init services
|
|
@@ -3741,7 +3741,7 @@ tmpCurrentTokenType='Value';tmpCurrentToken+=tmpCharacter;// continue;
|
|
|
3741
3741
|
// }
|
|
3742
3742
|
// tmpResults.ExpressionParserLog.push(`ExpressionParser.tokenize found an unknown character code ${tmpCharCode} character ${tmpCharacter} in the expression: ${pExpression} at index ${i}`);
|
|
3743
3743
|
// this.log.warn(tmpResults.ExpressionParserLog[tmpResults.ExpressionParserLog.length-1]);
|
|
3744
|
-
}if(tmpCurrentTokenType&&tmpCurrentToken.length>0){tmpResults.RawTokens.push(tmpCurrentToken);}return tmpResults.RawTokens;}}module.exports=ExpressionTokenizer;},{"./Fable-Service-ExpressionParser-Base.js":141}],143:[function(require,module,exports){module.exports={"sqrt":{"Name":"Square Root","Address":"fable.Math.sqrtPrecise"},"percent":{"Name":"Compute Percent (in IS over OF format)","Address":"fable.Math.percentagePrecise"},"compare":{"Name":"Compare","Address":"fable.Math.comparePrecise"},"abs":{"Name":"Absolute Value","Address":"fable.Math.absPrecise"},"floor":{"Name":"Floor Value","Address":"fable.Math.floorPrecise"},"ceil":{"Name":"Ceiling Value","Address":"fable.Math.ceilPrecise"},"rad":{"Name":"Degrees to Radians","Address":"fable.Math.radPrecise"},"pi":{"Name":"Pi","Address":"fable.Math.piPrecise"},"euler":{"Name":"Euler","Address":"fable.Math.eulerPrecise"},"log":{"Name":"Logarithm","Address":"fable.Math.logPrecise"},"exp":{"Name":"Eulers Number to the Power Of N","Address":"fable.Math.expPrecise"},"sin":{"Name":"Sine","Address":"fable.Math.sin"},"cos":{"Name":"Cosine","Address":"fable.Math.cos"},"tan":{"Name":"Tangent","Address":"fable.Math.tan"},"count":{"Name":"Count Set Elements","Address":"fable.Math.countSetElements"},"countset":{"Name":"Count Set Elements","Address":"fable.Math.countSetElements"},"sortset":{"Name":"Sort Set","Address":"fable.Math.sortSetPrecise"},"bucketset":{"Name":"Bucket Set","Address":"fable.Math.bucketSetPrecise"},"sorthistogram":{"Name":"Sort Histogram","Address":"fable.Math.sortHistogramPrecise"},"max":{"Name":"Maximum","Address":"fable.Math.maxPrecise"},"min":{"Name":"Minimum","Address":"fable.Math.minPrecise"},"sum":{"Name":"Sum","Address":"fable.Math.sumPrecise"},"avg":{"Name":"Average","Address":"fable.Math.averagePrecise"},"mean":{"Name":"Mean","Address":"fable.Math.meanPrecise"},"median":{"Name":"Median","Address":"fable.Math.medianPrecise"},"mode":{"Name":"Mode","Address":"fable.Math.modePrecise"},"round":{"Name":"Round","Address":"fable.Math.roundPrecise"},"tofixed":{"Name":"To Fixed","Address":"fable.Math.toFixedPrecise"},"cumulativesummation":{"Name":"
|
|
3744
|
+
}if(tmpCurrentTokenType&&tmpCurrentToken.length>0){tmpResults.RawTokens.push(tmpCurrentToken);}return tmpResults.RawTokens;}}module.exports=ExpressionTokenizer;},{"./Fable-Service-ExpressionParser-Base.js":141}],143:[function(require,module,exports){module.exports={"sqrt":{"Name":"Square Root","Address":"fable.Math.sqrtPrecise"},"percent":{"Name":"Compute Percent (in IS over OF format)","Address":"fable.Math.percentagePrecise"},"compare":{"Name":"Compare","Address":"fable.Math.comparePrecise"},"abs":{"Name":"Absolute Value","Address":"fable.Math.absPrecise"},"floor":{"Name":"Floor Value","Address":"fable.Math.floorPrecise"},"ceil":{"Name":"Ceiling Value","Address":"fable.Math.ceilPrecise"},"rad":{"Name":"Degrees to Radians","Address":"fable.Math.radPrecise"},"pi":{"Name":"Pi","Address":"fable.Math.piPrecise"},"euler":{"Name":"Euler","Address":"fable.Math.eulerPrecise"},"log":{"Name":"Logarithm","Address":"fable.Math.logPrecise"},"exp":{"Name":"Eulers Number to the Power Of N","Address":"fable.Math.expPrecise"},"sin":{"Name":"Sine","Address":"fable.Math.sin"},"cos":{"Name":"Cosine","Address":"fable.Math.cos"},"tan":{"Name":"Tangent","Address":"fable.Math.tan"},"count":{"Name":"Count Set Elements","Address":"fable.Math.countSetElements"},"countset":{"Name":"Count Set Elements","Address":"fable.Math.countSetElements"},"sortset":{"Name":"Sort Set","Address":"fable.Math.sortSetPrecise"},"bucketset":{"Name":"Bucket Set","Address":"fable.Math.bucketSetPrecise"},"sorthistogram":{"Name":"Sort Histogram","Address":"fable.Math.sortHistogramPrecise"},"sorthistogrambykeys":{"Name":"Sort Histogram by Keys","Address":"fable.Math.sortHistogramByKeys"},"max":{"Name":"Maximum","Address":"fable.Math.maxPrecise"},"min":{"Name":"Minimum","Address":"fable.Math.minPrecise"},"sum":{"Name":"Sum","Address":"fable.Math.sumPrecise"},"avg":{"Name":"Average","Address":"fable.Math.averagePrecise"},"mean":{"Name":"Mean","Address":"fable.Math.meanPrecise"},"median":{"Name":"Median","Address":"fable.Math.medianPrecise"},"mode":{"Name":"Mode","Address":"fable.Math.modePrecise"},"round":{"Name":"Round","Address":"fable.Math.roundPrecise"},"tofixed":{"Name":"To Fixed","Address":"fable.Math.toFixedPrecise"},"cumulativesummation":{"Name":"Sum each value in a Histogram or Value Map cumulatively, creating or setting a property with the result on each row","Address":"fable.Math.cumulativeSummation"},"subtractingsummation":{"Name":"Subtract each subsequent value in a Histogram or Value Map cumulatively (by default from the first row), creating or setting a property with the result on each row.","Address":"fable.Math.subtractingSummation"},"iterativeseries":{"Name":"Perform an Iterative Series of Mathematical Operations on Set Elements","Address":"fable.Math.iterativeSeries"},"countsetelements":{"Name":"Count Set Elements in a Histogram or Value Map","Address":"fable.Math.countSetElements"},"getvalue":{"Name":"Get Value from Application State or Services (AppData, etc.)","Address":"fable.Utility.getInternalValueByHash"},"objectkeystoarray":{"Name":"Get Array of an Object's keys","Address":"fable.Utility.objectKeysToArray"},"objectvaluestoarray":{"Name":"Get Array of an Object's values","Address":"fable.Utility.objectValuesToArray"},"objectvaluessortbyexternalobjectarray":{"Name":"Get Array of an Object's values sorted by an external array","Address":"fable.Utility.objectValuesSortByExternalArray"},"setkeystoarray":{"Name":"Get Array of an Object's keys","Address":"fable.Utility.objectKeysToArray"},"setvaluestoarray":{"Name":"Get Array of an Object's values","Address":"fable.Utility.objectValuesToArray"},"histogramkeystoarray":{"Name":"Get Array of an Object's keys","Address":"fable.Utility.objectKeysToArray"},"histogramvaluestoarray":{"Name":"Get Array of an Object's values","Address":"fable.Utility.objectValuesToArray"},"createarrayfromabsolutevalues":{"Name":"Create Array from Absolute Values","Address":"fable.Utility.createArrayFromAbsoluteValues"},"flatten":{"Name":"flatten an array of values","Address":"fable.Utility.flattenArrayOfSolverInputs"},"findfirstvaluebyexactmatch":{"Name":"find + map on array of objects","Address":"fable.Utility.findFirstValueByExactMatchInternal"},"findfirstvaluebystringincludes":{"Name":"find + map on array of objects","Address":"fable.Utility.findFirstValueByStringIncludesInternal"},"resolvehtmlentities":{"Name":"resolve HTML entities","Address":"fable.DataFormat.resolveHtmlEntities"},"concat":{"Name":"concatenate an array of values and output a string","Address":"fable.DataFormat.concatenateStringsInternal"},"concatraw":{"Name":"concatenate an array of values and output a string","Address":"fable.DataFormat.concatenateStringsRawInternal"},"join":{"Name":"join an array of values and output a string","Address":"fable.DataFormat.joinStringsInternal"},"joinraw":{"Name":"join an array of values and output a string","Address":"fable.DataFormat.joinStringsRawInternal"},"if":{"Name":"perform a conditional operator on two values, and choose one of two outcomes based on the result","Address":"fable.Logic.checkIf"},"when":{"Name":"perform a 'truthy' check on one value, and return one of two outcomes based on the result","Address":"fable.Logic.when"},"entryinset":{"Name":"Entry in Set","Address":"fable.Math.entryInSet"},"smallestinset":{"Name":"Smallest in Set","Address":"fable.Math.smallestInSet"},"largestinset":{"Name":"Largest in Set","Address":"fable.Math.largestInSet"},"aggregationhistogram":{"Name":"Generate a Histogram by Exact Value Aggregation","Address":"fable.Math.histogramAggregationByExactValueFromInternalState"},"distributionhistogram":{"Name":"Generate a Histogram Based on Value Distribution","Address":"fable.Math.histogramDistributionByExactValueFromInternalState"},"setconcatenate":{"Name":"Set Concatenate","Address":"fable.Math.setConcatenate"},"getvaluearray":{"Name":"Get Value Array from Application State or Services (AppData, etc.)","Address":"fable.Utility.createValueArrayByHashParametersFromInternal"},"getvalueobject":{"Name":"Get Value Object from Application State or Services (AppData, etc.)","Address":"fable.Utility.createValueObjectByHashParametersFromInternal"},"cleanvaluearray":{"Name":"Clean Value Array","Address":"fable.Math.cleanValueArray"},"cleanvalueobject":{"Name":"Clean Value Object","Address":"fable.Math.cleanValueObject"},"randominteger":{"Name":"Random Integer","Address":"fable.DataGeneration.randomInteger"},"randomintegerbetween":{"Name":"Random Integer Between Two Numbers","Address":"fable.DataGeneration.randomIntegerBetween"},"randomintegerupto":{"Name":"Random Integer","Address":"fable.DataGeneration.randomIntegerUpTo"},"randomfloat":{"Name":"Random Float","Address":"fable.DataGeneration.randomFloat"},"randomfloatbetween":{"Name":"Random Float","Address":"fable.DataGeneration.randomFloatBetween"},"randomfloatupto":{"Name":"Random Float","Address":"fable.DataGeneration.randomFloatUpTo"},"datemilliseconddifference":{"Name":"Date Difference in Milliseconds","Address":"fable.Dates.dateMillisecondDifference"},"dateseconddifference":{"Name":"Date Difference in Seconds","Address":"fable.Dates.dateSecondDifference"},"dateminutedifference":{"Name":"Date Difference in Minutes","Address":"fable.Dates.dateMinuteDifference"},"datehourdifference":{"Name":"Date Difference in Hours","Address":"fable.Dates.dateHourDifference"},"datedaydifference":{"Name":"Date Difference in Days","Address":"fable.Dates.dateDayDifference"},"dateweekdifference":{"Name":"Date Difference in Weeks","Address":"fable.Dates.dateWeekDifference"},"datemonthdifference":{"Name":"Date Difference in Months","Address":"fable.Dates.dateMonthDifference"},"dateyeardifference":{"Name":"Date Difference in Years","Address":"fable.Dates.dateYearDifference"},"createValueObjectByHashes":{"Name":"Create Value Object by Hashes","Address":"fable.Utility.createValueObjectByHashes"}};},{}],144:[function(require,module,exports){const libExpressionParserOperationBase=require('./Fable-Service-ExpressionParser-Base.js');class ExpressionParserLinter extends libExpressionParserOperationBase{constructor(pFable,pOptions,pServiceHash){super(pFable,pOptions,pServiceHash);this.serviceType='ExpressionParser-Linter';}lintTokenizedExpression(pTokenizedExpression,pResultObject){let tmpResults=typeof pResultObject==='object'?pResultObject:{ExpressionParserLog:[]};tmpResults.LinterResults=[];// Guard against bad data being passed in
|
|
3745
3745
|
if(!Array.isArray(pTokenizedExpression)){tmpResults.ExpressionParserLog.push(`ERROR: ExpressionParser.lintTokenizedExpression was passed a non-array tokenized expression.`);tmpResults.LinterResults.push(tmpResults.ExpressionParserLog[tmpResults.ExpressionParserLog.length-1]);this.log.error(tmpResults.ExpressionParserLog[tmpResults.ExpressionParserLog.length-1]);return pTokenizedExpression;}if(pTokenizedExpression.length<1){tmpResults.ExpressionParserLog.push(`ERROR: ExpressionParser.lintTokenizedExpression was passed an empty tokenized expression.`);tmpResults.LinterResults.push(tmpResults.ExpressionParserLog[tmpResults.ExpressionParserLog.length-1]);this.log.error(tmpResults.ExpressionParserLog[tmpResults.ExpressionParserLog.length-1]);return pTokenizedExpression;}// 1. Check for balanced parenthesis
|
|
3746
3746
|
let tmpParenthesisDepth=0;// If it is in a state address, we don't care about the parenthesis
|
|
3747
3747
|
// State addresses are between squiggly brackets
|
|
@@ -4174,7 +4174,13 @@ return 1;}return 0;}/**
|
|
|
4174
4174
|
*
|
|
4175
4175
|
* @param {Object} pHistogram - The histogram object to be sorted.
|
|
4176
4176
|
* @returns {Object} - The sorted histogram object.
|
|
4177
|
-
*/sortHistogramPrecise(pHistogram){let tmpSortedHistogram={};let tmpKeys=Object.keys(pHistogram);tmpKeys.sort((pLeft,pRight)=>{return pHistogram[pLeft]-pHistogram[pRight];});for(let i=0;i<tmpKeys.length;i++){tmpSortedHistogram[tmpKeys[i]]=pHistogram[tmpKeys[i]];}return tmpSortedHistogram;}
|
|
4177
|
+
*/sortHistogramPrecise(pHistogram){let tmpSortedHistogram={};let tmpKeys=Object.keys(pHistogram);tmpKeys.sort((pLeft,pRight)=>{return pHistogram[pLeft]-pHistogram[pRight];});for(let i=0;i<tmpKeys.length;i++){tmpSortedHistogram[tmpKeys[i]]=pHistogram[tmpKeys[i]];}return tmpSortedHistogram;}/**
|
|
4178
|
+
* Sorts the histogram object in ascending order based on the keys.
|
|
4179
|
+
*
|
|
4180
|
+
* @param {Object} pHistogram - The histogram object to be sorted.
|
|
4181
|
+
* @returns {Object} - The sorted histogram object.
|
|
4182
|
+
*/sortHistogramByKeys(pHistogram,pDescending){let tmpSortedHistogram={};let tmpKeys=Object.keys(pHistogram);let tmpDescending=typeof pDescending==='undefined'?false:pDescending;// Sort tmpKeys by the string comparison
|
|
4183
|
+
tmpKeys.sort();if(tmpDescending){tmpKeys=tmpKeys.reverse();}for(let i=0;i<tmpKeys.length;i++){tmpSortedHistogram[tmpKeys[i]]=pHistogram[tmpKeys[i]];}return tmpSortedHistogram;}cleanValueArray(pValueArray,pRemoveZeroes){let tmpRemoveZeroes=typeof pRemoveZeroes==='undefined'?false:pRemoveZeroes;if(!Array.isArray(pValueArray)){return[];}let tmpCleanedArray=[];for(let i=0;i<pValueArray.length;i++){let tmpValue=this.parsePrecise(pValueArray[i],NaN);if(!isNaN(tmpValue)&&(!tmpRemoveZeroes||tmpValue!="0")){tmpCleanedArray.push(tmpValue);}}return tmpCleanedArray;}/**
|
|
4178
4184
|
* Calculate the natural log of 2 to a specific precision, for use in the Taylor series.
|
|
4179
4185
|
* Cache outcome so it only runs once per precision.
|
|
4180
4186
|
* @param {number} pPrecision - The decimal precision to calculate ln(2) to.
|
|
@@ -4271,8 +4277,43 @@ let tmpCleanedObject={};let tmpKeys=Object.keys(pValueObject);for(let i=0;i<tmpK
|
|
|
4271
4277
|
*/largestInSet(pValueObjectSet,pValueAddress){return this.entryInSet(pValueObjectSet,pValueAddress,-1);}/**
|
|
4272
4278
|
* Expects an array of objects, and an address in each object to sum. Expects
|
|
4273
4279
|
* an address to put the cumulative summation as well.
|
|
4274
|
-
*
|
|
4275
|
-
|
|
4280
|
+
*
|
|
4281
|
+
* @param {Array} pValueObjectSet - The array of objects to perform a cumulative summation on
|
|
4282
|
+
* @param {string} pValueAddress - The address of the column in each object to sum
|
|
4283
|
+
* @param {string} pCumulationResultAddress - The address in each object to put the cumulative summation result
|
|
4284
|
+
* @param {Object} pManifest - The manifest to use for value retrieval and setting
|
|
4285
|
+
* @returns {Array} The updated value object set with cumulative summation results.
|
|
4286
|
+
*/cumulativeSummation(pValueObjectSet,pValueAddress,pCumulationResultAddress,pManifest){return this.iterativeSeries(pValueObjectSet,pValueAddress,pCumulationResultAddress,"1.0","add","0.0",true,pManifest);}/**
|
|
4287
|
+
* Expects an array of objects, and an address in each object to sum. Expects
|
|
4288
|
+
* an address to put the cumulative summation as well.
|
|
4289
|
+
*
|
|
4290
|
+
* @param {Array} pValueObjectSet - The array of objects to perform a cumulative summation on
|
|
4291
|
+
* @param {string} pValueAddress - The address of the column in each object to sum
|
|
4292
|
+
* @param {string} pCumulationResultAddress - The address in each object to put the cumulative summation result
|
|
4293
|
+
* @param {string} pStartingValue - The (optional) address of the value to start with
|
|
4294
|
+
* @param {Object} pManifest - The manifest to use for value retrieval and setting
|
|
4295
|
+
* @returns {Array} The updated value object set with cumulative summation results.
|
|
4296
|
+
*/subtractingSummation(pValueObjectSet,pValueAddress,pCumulationResultAddress,pStartingValue,pManifest){let tmpProcessFirstRow=true;// If the starting value comes from somewhere else, we want to subtract the first row from it.
|
|
4297
|
+
if(typeof pStartingValue==='undefined'||pStartingValue===null){tmpProcessFirstRow=false;}return this.iterativeSeries(pValueObjectSet,pValueAddress,pCumulationResultAddress,"1.0","subtract",pStartingValue,tmpProcessFirstRow,pManifest);}/**
|
|
4298
|
+
* Expects an array of objects, and an address in each object to perform an iterative mathematical operation on.
|
|
4299
|
+
|
|
4300
|
+
* @param {Array} pValueObjectSet - The array of objects to perform a cumulative summation on
|
|
4301
|
+
* @param {string} pValueAddress - The address of the column in each object to sum
|
|
4302
|
+
* @param {string} pValueMultiplier - The multiplier to apply to each value before summation
|
|
4303
|
+
* @param {string} pSummationOperation - The operation to perform for summation: +, -, *, / (and some textual equivalents)
|
|
4304
|
+
* @param {string} pCumulationResultAddress - The address in each object to put the cumulative summation result
|
|
4305
|
+
* @param {string} pStartingValue - The address of the value to process from; defaults to the first row
|
|
4306
|
+
* @param {boolean} pProcessFirstRowWithAValue - Whether to process the first row's value from all subsequent rows
|
|
4307
|
+
* @param {Object} pManifest - The manifest to
|
|
4308
|
+
* @returns {Array} The updated value object set with cumulative summation results.
|
|
4309
|
+
*/iterativeSeries(pValueObjectSet,pValueAddress,pCumulationResultAddress,pValueMultiplier,pSummationOperation,pStartingValue,pProcessFirstRowWithAValue,pManifest){if(!Array.isArray(pValueObjectSet)){return pValueObjectSet;}if(!pValueAddress||!pCumulationResultAddress){return pValueObjectSet;}// By default don't subtract the first row from the value
|
|
4310
|
+
let tmpProcessFirstRow=typeof pProcessFirstRowWithAValue==='undefined'?false:pProcessFirstRowWithAValue;let tmpValueMultiplier;if(pValueMultiplier&&pValueMultiplier!==''){tmpValueMultiplier=this.parsePrecise(pValueMultiplier);}if(isNaN(tmpValueMultiplier)){tmpValueMultiplier=this.parsePrecise("1.0");}// Default to start from the current value address
|
|
4311
|
+
let tmpSummationValue;// This logic ensures we don't default to 0 when pStartingValue is an empty string
|
|
4312
|
+
if(pStartingValue||pStartingValue!==''){tmpSummationValue=this.parsePrecise(pStartingValue);}if(isNaN(tmpSummationValue)||typeof pStartingValue==='undefined'||pStartingValue===null){tmpSummationValue='';}for(let i=0;i<pValueObjectSet.length;i++){let tmpValue=this.parsePrecise(this.fable.Utility.getValueByHash(pValueObjectSet[i],pValueAddress,pManifest));// Since summation might start on a row after the first,
|
|
4313
|
+
let tmpFirstRowWithValue=false;if(tmpSummationValue===''&&tmpValue&&!isNaN(tmpSummationValue)){// Try to grab the summation value from the first row with a value
|
|
4314
|
+
tmpSummationValue=tmpValue;tmpFirstRowWithValue=true;}// Continue on with the values as they are if the current row doesn't have a change
|
|
4315
|
+
if(isNaN(tmpValue)){this.fable.Utility.setValueByHash(pValueObjectSet[i],pCumulationResultAddress,tmpSummationValue,pManifest);continue;}tmpValue=this.multiplyPrecise(tmpValue,tmpValueMultiplier);// Now perform the operation
|
|
4316
|
+
if(!tmpFirstRowWithValue||tmpProcessFirstRow){switch(pSummationOperation){case'+':case'add':case'plus':case'addition':tmpSummationValue=this.addPrecise(tmpSummationValue,tmpValue);break;case'-':case'sub':case'minus':case'subtract':tmpSummationValue=this.subtractPrecise(tmpSummationValue,tmpValue);break;case'*':case'mul':case'times':case'multiply':tmpSummationValue=this.multiplyPrecise(tmpSummationValue,tmpValue);break;case'-':case'div':case'over':case'divide':tmpSummationValue=this.dividePrecise(tmpSummationValue,tmpValue);break;}}this.fable.Utility.setValueByHash(pValueObjectSet[i],pCumulationResultAddress,tmpSummationValue,pManifest);}return pValueObjectSet;}/**
|
|
4276
4317
|
* Finds the maximum value from a set of precise values.
|
|
4277
4318
|
*
|
|
4278
4319
|
* @param {Array|Object} pValueSet - The set of values to find the maximum from.
|
|
@@ -4618,7 +4659,10 @@ return tmpValueObject;}/**
|
|
|
4618
4659
|
*/addressIsNullOrEmpty(pObject,pValueAddress){// Lazily create a manifest if it doesn't exist
|
|
4619
4660
|
if(!this.manifest){this.manifest=this.fable.newManyfest();}// If it doesn't exist, it is null or empty.
|
|
4620
4661
|
if(!this.manifest.checkAddressExists(pObject,pValueAddress)){return true;}// Get the value from the internal manifest and return it
|
|
4621
|
-
let tmpValue=this.manifest.getValueByHash(pObject,pValueAddress);if(tmpValue===null||tmpValue===''){return true;}return false;}// Convert
|
|
4662
|
+
let tmpValue=this.manifest.getValueByHash(pObject,pValueAddress);if(tmpValue===null||tmpValue===''){return true;}return false;}// Convert objects to arrays of labels or values for solvers
|
|
4663
|
+
objectKeysToArray(pObject){return Object.keys(pObject);}// Convert object values to an array of values
|
|
4664
|
+
objectValuesToArray(pObject){let tmpKeys=Object.keys(pObject);let tmpValues=[];for(let i=0;i<tmpKeys.length;i++){tmpValues.push(pObject[tmpKeys[i]]);}return tmpValues;}objectValuesSortByExternalArray(pArray,pObjectArray,pDescending,pSearchAddress){let tmpDescending=typeof pDescending=='boolean'?pDescending:typeof pDescending=='number'&&pDescending==1?true:typeof pDescending=='string'&&pDescending=='1'?true:false;let tmpManifest=this.fable.newManyfest();let tmpSearchAddresses=pSearchAddress;if(typeof tmpSearchAddresses!='string'){// Defaulting to "label"...
|
|
4665
|
+
tmpSearchAddresses='label';}let tmpSortHelperArray=[];for(let i=0;i<pArray.length;i++){tmpSortHelperArray.push({Value:pArray[i],SortValue:tmpManifest.getValueByHash(pObjectArray[i],tmpSearchAddresses),SortObject:pObjectArray[i]});}let tmpSortedArray=tmpSortHelperArray.sort((pLeft,pRight)=>{if(pLeft.SortValue<pRight.SortValue){return tmpDescending?1:-1;}if(pLeft.SortValue>pRight.SortValue){return tmpDescending?-1:1;}return 0;}).map(pSortHelperArrayObject=>{return pSortHelperArrayObject.Value;});return tmpSortedArray;}// Convert an ISO string to a javascript date object
|
|
4622
4666
|
// Adapted from https://stackoverflow.com/a/54751179
|
|
4623
4667
|
//
|
|
4624
4668
|
// Takes strings like: 2022-11-04T11:34:45.000Z
|