From 3ccc6dd87067278e8af1dadbaa95b9bc62d3579a Mon Sep 17 00:00:00 2001 From: Peter Fajdiga Date: Fri, 25 Oct 2024 12:14:32 +0200 Subject: [PATCH] move `fillSpace` into its own file --- src/lib/utils/fillSpace.ts | 44 +++++++++++++++++++++++++++++++++++++ src/lib/utils/math.ts | 45 -------------------------------------- 2 files changed, 44 insertions(+), 45 deletions(-) create mode 100644 src/lib/utils/fillSpace.ts diff --git a/src/lib/utils/fillSpace.ts b/src/lib/utils/fillSpace.ts new file mode 100644 index 0000000..7c3fc2a --- /dev/null +++ b/src/lib/utils/fillSpace.ts @@ -0,0 +1,44 @@ +function fillSpace(availableSpace: number, items: { min: number, max: number }[]) { + let mean = Math.floor(availableSpace / items.length); + while (true) { + let requiredSpace = 0; + let increasable = 0; + let decreasable = 0; + let low = -Infinity; + let high = Infinity; + for (const constraint of items) { + const value = clamp(mean, constraint.min, constraint.max); + requiredSpace += value; + if (mean > constraint.min) { + decreasable++; + if (value > low) { + low = value; + } + } + if (mean < constraint.max) { + increasable++; + if (value < high) { + high = value; + } + } + } + + const oldMean = mean; + const error = requiredSpace - availableSpace; + if (error > 0) { + // need to decrease mean + if (decreasable > 0) { + mean = Math.floor(low - error / decreasable); + } + } else if (error < 0) { + // need to increase mean + if (increasable > 0) { + mean = Math.floor(high - error / increasable); + } + } + + if (mean === oldMean) { + return mean; + } + } +} diff --git a/src/lib/utils/math.ts b/src/lib/utils/math.ts index 18290b9..7a202aa 100644 --- a/src/lib/utils/math.ts +++ b/src/lib/utils/math.ts @@ -42,51 +42,6 @@ function findMinPositive(items: T[], evaluate: (item: T) => number) { return bestItem; } -function fillSpace(availableSpace: number, items: { min: number, max: number }[]) { - let mean = Math.floor(availableSpace / items.length); - while (true) { - let requiredSpace = 0; - let increasable = 0; - let decreasable = 0; - let low = -Infinity; - let high = Infinity; - for (const constraint of items) { - const value = clamp(mean, constraint.min, constraint.max); - requiredSpace += value; - if (mean > constraint.min) { - decreasable++; - if (value > low) { - low = value; - } - } - if (mean < constraint.max) { - increasable++; - if (value < high) { - high = value; - } - } - } - - const oldMean = mean; - const error = requiredSpace - availableSpace; - if (error > 0) { - // need to decrease mean - if (decreasable > 0) { - mean = Math.floor(low - error / decreasable); - } - } else if (error < 0) { - // need to increase mean - if (increasable > 0) { - mean = Math.floor(high - error / increasable); - } - } - - if (mean === oldMean) { - return mean; - } - } -} - function rectEquals(a: QmlRect, b: QmlRect) { return a.x === b.x && a.y === b.y &&