diff --git a/src/util/_impl/_dedup_impl.scad b/src/util/_impl/_dedup_impl.scad index b17f82c2..a431eda3 100644 --- a/src/util/_impl/_dedup_impl.scad +++ b/src/util/_impl/_dedup_impl.scad @@ -31,4 +31,15 @@ _dedup_add_search = function(buckets, i_elem, eq, hash, bucket_numbers) function _add(buckets, bucket, i_elem, b_idx) = let(leng = len(buckets)) - [for(i = 0; i < leng; i = i + 1) i == b_idx ? [each bucket, i_elem] : buckets[i]]; \ No newline at end of file + [for(i = 0; i < leng; i = i + 1) i == b_idx ? [each bucket, i_elem] : buckets[i]]; + +function _sort(lt) = + let(leng = len(lt)) + leng == 0 ? [] : + leng == 1 ? [lt[0][1]] : + let( + pivot = lt[0], + before = [for(j = 1; j < leng; j = j + 1) if(lt[j][0] < pivot[0]) lt[j]], + after = [for(j = 1; j < leng; j = j + 1) if(lt[j][0] >= pivot[0]) lt[j]] + ) + [each _sort(before), pivot[1], each _sort(after)]; \ No newline at end of file diff --git a/src/util/dedup.scad b/src/util/dedup.scad index 80dfe60e..d11ecfa7 100644 --- a/src/util/dedup.scad +++ b/src/util/dedup.scad @@ -10,15 +10,13 @@ use <../__comm__/_str_hash.scad>; use <_impl/_dedup_impl.scad>; -use ; - + function dedup(lt, eq = undef, hash = function(e) _str_hash(e), number_of_buckets) = let(leng_lt = len(lt)) leng_lt < 2 ? lt : let( b_numbers = is_undef(number_of_buckets) ? ceil(sqrt(leng_lt)) : number_of_buckets, buckets = [for(i = [0:b_numbers - 1]) []], - deduped = _dedup(lt, leng_lt, buckets, eq, hash, b_numbers), - sorted = sort([for(bucket = deduped) each bucket], by = function(e1, e2) e1[0] - e2[0]) + deduped = _dedup(lt, leng_lt, buckets, eq, hash, b_numbers) ) - [for(i_elem = sorted) i_elem[1]]; + _sort([for(bucket = deduped) each bucket]);