Skip to content

Instantly share code, notes, and snippets.

@apaleslimghost
Created March 13, 2017 11:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save apaleslimghost/914dc087ac48155acf7461013046bed0 to your computer and use it in GitHub Desktop.
Save apaleslimghost/914dc087ac48155acf7461013046bed0 to your computer and use it in GitHub Desktop.
const range = require('lodash.range');
const padStart = require('lodash.padstart');
const featureIndex = (features, enabledFeatures) => parseInt(
features.map(feature => enabledFeatures[feature] ? '1' : '0').join(''),
2
);
const powerSet = features => range(Math.pow(2, features.length));
const indexToFeatures = features => index => Array.from(
padStart(index.toString(2), features.length, '0')
).reduce(
(enabledFeatures, bit, i) => Object.assign(enabledFeatures, {
[features[i]]: bit === '1'
}),
{}
);
const generateMatrix = features => powerSet(features).map(indexToFeatures(features));
module.exports = (features, generateFeature) => {
const matrix = generateMatrix(features).map(generateFeature);
return enabledFeatures => matrix[featureIndex(features, enabledFeatures)];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment