diff options
| author | Henry Jameson <me@hjkos.com> | 2024-02-09 16:04:45 +0200 |
|---|---|---|
| committer | Henry Jameson <me@hjkos.com> | 2024-02-09 16:04:45 +0200 |
| commit | 1af8ca29f33a43f72175f4b17a2447149694a7d8 (patch) | |
| tree | 37dea2d841d87d2b926ec69b4e4ae2b9b859f9f7 /src/services/theme_data/theme_data_3.service.js | |
| parent | 1cfdde819b611c7572ac89cc00d886f07d26b3d7 (diff) | |
optimize combinatorics and defaults, now it's twice as fast!
Diffstat (limited to 'src/services/theme_data/theme_data_3.service.js')
| -rw-r--r-- | src/services/theme_data/theme_data_3.service.js | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/services/theme_data/theme_data_3.service.js b/src/services/theme_data/theme_data_3.service.js index 66de974b..9bb1db94 100644 --- a/src/services/theme_data/theme_data_3.service.js +++ b/src/services/theme_data/theme_data_3.service.js @@ -146,13 +146,12 @@ const combinationsMatch = (criteria, subject, strict) => { if (criteria.component !== subject.component) return false // All variants inherit from normal - const subjectVariant = Object.prototype.hasOwnProperty.call(subject, 'variant') ? subject.variant : 'normal' - if (subjectVariant !== 'normal' || strict) { + if (subject.variant !== 'normal' || strict) { if (criteria.variant !== subject.variant) return false } - const subjectStatesSet = new Set(['normal', ...(subject.state || [])]) - const criteriaStatesSet = new Set(['normal', ...(criteria.state || [])]) + const subjectStatesSet = new Set(subject.state) + const criteriaStatesSet = new Set(criteria.state) // Subject states > 1 essentially means state is "normal" and therefore matches if (subjectStatesSet.size > 1 || strict) { @@ -198,7 +197,12 @@ export const init = (extraRuleset, palette) => { const ruleset = [ ...Object.values(components).map(c => c.defaultRules.map(r => ({ component: c.name, ...r })) || []).reduce((acc, arr) => [...acc, ...arr], []), ...extraRuleset - ] + ].map(rule => { + rule.variant = rule.variant ?? 'normal' + rule.state = [...new Set(['normal', ...(rule.state || [])])] + + return rule + }) const virtualComponents = new Set(Object.values(components).filter(c => c.virtual).map(c => c.name)) @@ -344,7 +348,9 @@ export const init = (extraRuleset, palette) => { const variants = { normal: '', ...originalVariants } const innerComponents = validInnerComponents.map(name => components[name]) - const stateCombinations = getAllPossibleCombinations(Object.keys(states)) + // Optimization: we only really need combinations without "normal" because all states implicitly have it + const permutationStateKeys = Object.keys(states).filter(s => s !== 'normal') + const stateCombinations = [['normal'], ...getAllPossibleCombinations(permutationStateKeys).map(combination => ['normal', ...combination])] const stateVariantCombination = Object.keys(variants).map(variant => { return stateCombinations.map(state => ({ variant, state })) |
