diff --git a/src/util/set/_impl/_hashset_add_impl.scad b/src/util/set/_impl/_hashset_add_impl.scad index 25e1ca28..96e5e123 100644 --- a/src/util/set/_impl/_hashset_add_impl.scad +++ b/src/util/set/_impl/_hashset_add_impl.scad @@ -7,5 +7,12 @@ function _hashset_add(buckets, b_numbers, elem, eq, hash) = ) _find_eq(bucket, elem, eq) != -1 ? buckets : _add(buckets, b_numbers, bucket, elem, idx); +function _hashset_add_by(buckets, b_numbers, elem, eq, hash, f_eq) = + let( + idx = hash(elem) % b_numbers, + bucket = buckets[idx] + ) + f_eq(bucket, elem, eq) != -1 ? buckets : _add(buckets, b_numbers, bucket, elem, idx); + function _add(buckets, b_numbers, bucket, elem, idx) = [for(i = 0; i < b_numbers; i = i + 1) i == idx ? [each bucket, elem] : buckets[i]]; \ No newline at end of file diff --git a/src/util/set/_impl/_hashset_impl.scad b/src/util/set/_impl/_hashset_impl.scad index 439b82e1..7d62fc33 100644 --- a/src/util/set/_impl/_hashset_impl.scad +++ b/src/util/set/_impl/_hashset_impl.scad @@ -1,15 +1,18 @@ use <_hashset_add_impl.scad>; +include <../../_impl/_find_eq_search_some.scad>; + function _hashset(lt, leng, buckets, b_numbers, eq, hash) = let( end = leng - 1, + f_eq = is_undef(eq) ? _find_eq_search : _find_eq_some, n_buckets_lt = [ - for(i = 0, n_buckets = _hashset_add(buckets, b_numbers, lt[i], eq, hash), is_continue = i < end; + for(i = 0, n_buckets = _hashset_add_by(buckets, b_numbers, lt[i], eq, hash, f_eq), is_continue = i < end; is_continue; - i = i + 1, is_continue = i < end, n_buckets = is_continue ? _hashset_add(n_buckets, b_numbers, lt[i], eq, hash) : undef) + i = i + 1, is_continue = i < end, n_buckets = is_continue ? _hashset_add_by(n_buckets, b_numbers, lt[i], eq, hash, f_eq) : undef) n_buckets ] ) - _hashset_add(n_buckets_lt[end - 1], b_numbers, lt[end], eq, hash); + _hashset_add_by(n_buckets_lt[end - 1], b_numbers, lt[end], eq, hash, f_eq);