Files
SnowLuma/.pnpm-store/v11/files/a3/cf5b2f8ff4198613c5111b159613b1c230fcec4a1d820049a4282f96450284d325e3723ff7d03fb1ec46e36bdd17c1d7f537b8b183758caa21005262207230
T
TanTan 2a69b23b47
Dev Build / cleanup (push) Waiting to run
Dev Build / typecheck (push) Waiting to run
docs: 仓库链接指向本镜像仓库
2026-11-13 09:27:07 +08:00

52 lines
1.9 KiB
Plaintext

import { AnyConfig } from './types'
/**
* Sorts modifiers according to following schema:
* - Predefined modifiers are sorted alphabetically
* - When an arbitrary variant appears, it must be preserved which modifiers are before and after it
*/
export const createSortModifiers = (config: AnyConfig) => {
// Pre-compute weights for all known modifiers for O(1) comparison
const modifierWeights = new Map<string, number>()
// Assign weights to sensitive modifiers (highest priority, but preserve order)
config.orderSensitiveModifiers.forEach((mod, index) => {
modifierWeights.set(mod, 1000000 + index) // High weights for sensitive mods
})
return (modifiers: readonly string[]): string[] => {
const result: string[] = []
let currentSegment: string[] = []
// Process modifiers in one pass
for (let i = 0; i < modifiers.length; i++) {
const modifier = modifiers[i]!
// Check if modifier is sensitive (starts with '[' or in orderSensitiveModifiers)
const isArbitrary = modifier[0] === '['
const isOrderSensitive = modifierWeights.has(modifier)
if (isArbitrary || isOrderSensitive) {
// Sort and flush current segment alphabetically
if (currentSegment.length > 0) {
currentSegment.sort()
result.push(...currentSegment)
currentSegment = []
}
result.push(modifier)
} else {
// Regular modifier - add to current segment for batch sorting
currentSegment.push(modifier)
}
}
// Sort and add any remaining segment items
if (currentSegment.length > 0) {
currentSegment.sort()
result.push(...currentSegment)
}
return result
}
}