redux-ab-test
Version:
A/B testing React components with Redux and debug tools. Isomorphic with a simple, universal interface. Well documented and lightweight. Tested in popular browsers and Node.js. Includes helpers for React, Redux, and Segment.io
84 lines (64 loc) • 3.27 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.toRanges = exports.toRange = exports.toTotal = exports.toWeight = undefined;
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
exports['default'] = randomVariation;
var _immutable = require('immutable');
var _immutable2 = _interopRequireDefault(_immutable);
var _logger = require('./logger');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
// Helper to convert variation => weight:number
var toWeight = exports.toWeight = function () {
function toWeight(variation) {
return variation.get('weight') || 0;
}
return toWeight;
}();
// Calculate the total weight
var toTotal = exports.toTotal = function () {
function toTotal(variations) {
return variations.reduce(function (total, variation) {
return total + toWeight(variation);
}, 0);
}
return toTotal;
}();
// Generate the next range in the series
var toRange = exports.toRange = function () {
function toRange(list, counter) {
var startAt = list.count() <= 0 ? 0 : list.last().last() + 1;
var range = _immutable2['default'].Range(startAt, startAt + counter);
return list.push(range);
}
return toRange;
}();
// Geneate a contigious range of scores
var toRanges = exports.toRanges = function () {
function toRanges(variations) {
return variations.map(toWeight).reduce(toRange, _immutable2['default'].List([]));
}
return toRanges;
}();
function randomVariation(experiment) {
var random = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Math.random;
var variations = experiment.get('variations').sortBy(toWeight).reverse();
var weightTotal = toTotal(variations);
var weightRanges = toRanges(variations);
var weightRandom = Math.round(weightTotal * random());
(0, _logger.logger)(__filename + ' randomVariation experiment.name=\'' + experiment.get('name') + '\', variations=\'' + (0, _stringify2['default'])(variations) + '\'');
(0, _logger.logger)(__filename + ' randomVariation experiment.name=\'' + experiment.get('name') + '\', weightTotal=\'' + (0, _stringify2['default'])(weightTotal) + '\'');
(0, _logger.logger)(__filename + ' randomVariation experiment.name=\'' + experiment.get('name') + '\', weightRanges=\'' + (0, _stringify2['default'])(weightRanges) + '\'');
(0, _logger.logger)(__filename + ' randomVariation experiment.name=\'' + experiment.get('name') + '\', weightRandom=\'' + (0, _stringify2['default'])(weightRandom) + '\'');
// Find the range that contains our score
var index = weightRanges.findIndex(function (range) {
return range.includes(weightRandom);
});
(0, _logger.logger)(__filename + ' randomVariation experiment.name=\'' + experiment.get('name') + '\', index=\'' + (0, _stringify2['default'])(index) + '\'');
// Return the matching variation. Returns variations.last() if random() was out of range [0, 1)
var variation = variations.get(index, variations.last());
(0, _logger.logger)(__filename + ' randomVariation experiment.name=\'' + experiment.get('name') + '\', variation.name=\'' + (variation && variation.get('name')) + '\'');
return variation;
}
;