maxLen := make(map[string]int)
for _, fractal := range fractals {
maxLen[fractal.kind] = max(maxLen[fractal.kind], len(normalizeName(fractal.name)))
}
format := map[string]string{
"mandelbrot": fmt.Sprintf("%%-%ds %%v, %%vi", maxLen["mandelbrot"] + 1),
"julia": fmt.Sprintf("%%-%ds c = %%v + %%vi", maxLen["julia"] + 1),
}
labelEntries := make(map[string]map[string]string, len(fractals))
sortedMenuItems := make(map[string][]string)
for _, kind := range kinds(fractals) {
labelEntries[kind] = make(map[string]string)
sortedFractalNames := slices.SortedFunc(fractalNamesByKind(fractals, kind), func(a, b string) int {
prioA := 0; if isUnnamed(a) { prioA = 1 }
prioB := 0; if isUnnamed(b) { prioB = 1 }
if prioA != prioB { return prioA - prioB }
return cmp.Compare(a, b)
})
sortedMenuItems[kind] = sortedFractalNames
for _, name := range sortedFractalNames {
fractal := fractals[name]
displayName := normalizeName(fractal.name)
switch kind {
case "mandelbrot":
displayXReal := fmt.Sprintf("%v", fractal.params.xReal)
if !strings.HasPrefix(displayXReal, "-") {
displayXReal = " " + fmt.Sprintf("%v", fractal.params.xReal)
}
labelEntries[kind][name] = fmt.Sprintf(format[kind], displayName + ":", displayXReal, fractal.params.yImag)
case "julia":
displayCReal := fmt.Sprintf("%v", fractal.params.cReal)
displayCImag := fmt.Sprintf("%v", fractal.params.cImag)
if !strings.HasPrefix(displayCReal, "-") {
displayCReal = " " + fmt.Sprintf("%v", fractal.params.cReal)
}
if fractal.name == "golden" {
displayCReal = "(φ - 2)"
displayCImag = "(φ - 1)"
}
labelEntries[kind][name] = fmt.Sprintf(format[kind], displayName + ":", displayCReal, displayCImag)
}
}
}
return labelEntries, sortedMenuItems
}