1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-03-14 02:59:42 +01:00

refactor: extract a _sort function

This commit is contained in:
Justin Lin 2022-04-12 14:35:29 +08:00
parent db0d381ceb
commit 4f09162c28

View File

@ -1,26 +1,21 @@
use <_vt_default_comparator.scad>;
function _vt_sort(lt) =
function _sort(lt, less, gt_eq) =
let(leng = len(lt))
leng <= 1 ? lt :
leng == 2 ? (greaterThan(lt[1], lt[0]) || lt[1] == lt[0] ? lt : [lt[1], lt[0]]) :
leng == 2 ? gt_eq(lt[1], lt[0]) ? lt : [lt[1], lt[0]] :
let(
pivot = lt[0],
before = [for(j = 1; j < leng; j = j + 1) if(lessThan(lt[j], pivot)) lt[j]],
after = [for(j = 1; j < leng; j = j + 1) if(greaterThan(lt[j], pivot) || lt[j] == pivot) lt[j]]
before = [for(j = 1; j < leng; j = j + 1) if(less(lt[j], pivot)) lt[j]],
after = [for(j = 1; j < leng; j = j + 1) if(gt_eq(lt[j], pivot)) lt[j]]
)
[each _vt_sort(before), pivot, each _vt_sort(after)];
[each _sort(before, less, gt_eq), pivot, each _sort(after, less, gt_eq)];
function _sort_by_idx(lt, i) =
let(leng = len(lt))
leng <= 1 ? lt :
leng == 2 ? (lt[1][i] >= lt[0][i] ? lt : [lt[1], lt[0]]) :
let(
pivot = lt[0],
before = [for(j = 1; j < leng; j = j + 1) if(lt[j][i] < pivot[i]) lt[j]],
after = [for(j = 1; j < leng; j = j + 1) if(lt[j][i] >= pivot[i]) lt[j]]
)
[each _sort_by_idx(before, i), pivot, each _sort_by_idx(after, i)];
function _vt_sort(lt) = _sort(lt, function(a, b) lessThan(a, b), function(a, b) greaterThan(a, b) || a == b);
function _sort_by_idx(lt, i) = _sort(lt, function(a, b) a[i] < b[i], function(a, b) a[i] >= b[i]);
function _sort_by_cmp(lt, cmp) = _sort(lt, function(a, b) cmp(a, b) < 0, function(a, b) cmp(a, b) >= 0);
function _sort_by(lt, by, idx) =
let(
@ -29,13 +24,4 @@ function _sort_by(lt, by, idx) =
)
_sort_by_idx(lt, i);
function _sort_by_cmp(lt, cmp) =
let(leng = len(lt))
leng <= 1 ? lt :
leng == 2 ? (cmp(lt[1], lt[0]) >= 0 ? lt : [lt[1], lt[0]]) :
let(
pivot = lt[0],
before = [for(j = 1; j < leng; j = j + 1) if(cmp(lt[j], pivot) < 0) lt[j]],
after = [for(j = 1; j < leng; j = j + 1) if(cmp(lt[j], pivot) >= 0) lt[j]]
)
[each _sort_by_cmp(before, cmp), pivot, each _sort_by_cmp(after, cmp)];