UNPKG

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
'use strict'; 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; }