1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-07-31 20:10:36 +02:00

add sorted

This commit is contained in:
Justin Lin
2022-04-15 08:07:38 +08:00
parent bde84c004c
commit 35cf05dd42
4 changed files with 55 additions and 2 deletions

View File

@@ -0,0 +1,14 @@
function _sorted(lt, less, gt_eq) =
let(leng = len(lt))
leng <= 1 ? lt :
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(less(lt[j], pivot)) lt[j]],
after = [for(j = 1; j < leng; j = j + 1) if(gt_eq(lt[j], pivot)) lt[j]]
)
[each _sorted(before, less, gt_eq), pivot, each _sorted(after, less, gt_eq)];
function _sorted_default(lt) = _sorted(lt, function(a, b) a < b, function(a, b) a >= b);
function _sorted_cmp(lt, cmp) = _sorted(lt, function(a, b) cmp(a, b) < 0, function(a, b) cmp(a, b) >= 0);

14
src/util/sorted.scad Normal file
View File

@@ -0,0 +1,14 @@
/**
* sort.scad
*
* @copyright Justin Lin, 2022
* @license https://opensource.org/licenses/lgpl-3.0.html
*
* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-sorted.html
*
**/
use <_impl/_sorted_impl.scad>;
function sorted(lt, cmp = undef) =
is_undef(cmp) ? _sorted_default(lt) : _sorted_cmp(lt, cmp);

View File

@@ -65,7 +65,7 @@ include <util/test_sub_str.scad>;
include <util/test_split_str.scad>; include <util/test_split_str.scad>;
include <util/test_parse_number.scad>; include <util/test_parse_number.scad>;
include <util/test_slice.scad>; include <util/test_slice.scad>;
include <util/test_sort.scad>; include <util/test_sorted.scad>;
include <util/test_reverse.scad>; include <util/test_reverse.scad>;
include <util/test_fibseq.scad>; include <util/test_fibseq.scad>;
include <util/test_bsearch.scad>; include <util/test_bsearch.scad>;
@@ -80,7 +80,7 @@ include <util/test_spherical_coordinate.scad>;
include <util/test_count.scad>; include <util/test_count.scad>;
include <util/set/test_hashset.scad>; include <util/set/test_hashset.scad>;
include <util/map/test_hashmap.scad>; include <util/map/test_hashmap.scad>;
include <util/test_sort.scad>;
// Voxel // Voxel
include <voxel/test_vx_bezier.scad>; include <voxel/test_vx_bezier.scad>;

View File

@@ -0,0 +1,25 @@
use <util/sorted.scad>;
module test_sorted() {
echo("==== test_sorted ====");
assert([1, 2, 3, 4, 5, 6] == sorted([1, 6, 2, 5, 4, 3])
);
assert(
[[2, 0, 0], [5, 0, 0], [7, 0, 0], [9, 0, 0], [10, 0, 0]] ==
sorted([[2, 0, 0], [5, 0, 0], [7, 0, 0], [9, 0, 0], [10, 0, 0]])
);
assert(
[[2, 0, 0], [5, 0, 0], [7, 0, 0], [9, 0, 0], [10, 0, 0]] ==
sorted([[10, 0, 0], [5, 0, 0], [7, 0, 0], [2, 0, 0], [9, 0, 0]], cmp = function(a, b) a[0] - b[0])
);
ascending = function(e1, e2) e1 - e2;
descending = function(e1, e2) e2 - e1;
assert(sorted([2, 1, 3, 5, 4], ascending) == [1, 2, 3, 4, 5]);
assert(sorted([2, 1, 3, 5, 4], descending) == [5, 4, 3, 2, 1]);
}
test_sorted();