hamster 1.0.1.pre.rc2 → 1.0.1.pre.rc3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/hamster.rb +2 -2
- data/lib/hamster/core_ext.rb +0 -1
- data/lib/hamster/core_ext/enumerable.rb +17 -17
- data/lib/hamster/core_ext/io.rb +15 -17
- data/lib/hamster/deque.rb +229 -0
- data/lib/hamster/enumerable.rb +147 -105
- data/lib/hamster/experimental/mutable_queue.rb +2 -2
- data/lib/hamster/hash.rb +488 -82
- data/lib/hamster/immutable.rb +4 -0
- data/lib/hamster/list.rb +839 -196
- data/lib/hamster/read_copy_update.rb +1 -0
- data/lib/hamster/set.rb +317 -54
- data/lib/hamster/sorted_set.rb +1014 -0
- data/lib/hamster/trie.rb +67 -47
- data/lib/hamster/undefined.rb +1 -3
- data/lib/hamster/vector.rb +989 -76
- data/lib/hamster/version.rb +1 -1
- data/spec/{hamster → lib/hamster}/core_ext/array_spec.rb +1 -1
- data/spec/{hamster → lib/hamster}/core_ext/enumerable_spec.rb +4 -0
- data/spec/{hamster → lib/hamster}/core_ext/io_spec.rb +0 -0
- data/spec/lib/hamster/deque/clear_spec.rb +34 -0
- data/spec/lib/hamster/deque/construction_spec.rb +30 -0
- data/spec/lib/hamster/deque/copying_spec.rb +20 -0
- data/spec/lib/hamster/deque/dequeue_spec.rb +27 -0
- data/spec/lib/hamster/deque/empty_spec.rb +42 -0
- data/spec/{hamster/queue → lib/hamster/deque}/enqueue_spec.rb +7 -10
- data/spec/lib/hamster/deque/head_spec.rb +20 -0
- data/spec/lib/hamster/deque/inspect_spec.rb +24 -0
- data/spec/lib/hamster/deque/last_spec.rb +20 -0
- data/spec/lib/hamster/deque/marshal_spec.rb +34 -0
- data/spec/lib/hamster/deque/new_spec.rb +44 -0
- data/spec/lib/hamster/deque/pop_spec.rb +25 -0
- data/spec/lib/hamster/deque/random_modification_spec.rb +34 -0
- data/spec/{hamster/queue → lib/hamster/deque}/size_spec.rb +4 -9
- data/spec/lib/hamster/deque/to_a_spec.rb +27 -0
- data/spec/{hamster/queue → lib/hamster/deque}/to_ary_spec.rb +6 -6
- data/spec/lib/hamster/deque/to_list_spec.rb +26 -0
- data/spec/lib/hamster/deque/unshift_spec.rb +26 -0
- data/spec/{hamster → lib/hamster}/experimental/mutable_set/add_qm_spec.rb +0 -0
- data/spec/{hamster → lib/hamster}/experimental/mutable_set/add_spec.rb +0 -0
- data/spec/{hamster → lib/hamster}/experimental/mutable_set/delete_qm_spec.rb +0 -0
- data/spec/{hamster → lib/hamster}/experimental/mutable_set/delete_spec.rb +0 -0
- data/spec/{hamster → lib/hamster}/hash/all_spec.rb +10 -0
- data/spec/lib/hamster/hash/any_spec.rb +56 -0
- data/spec/lib/hamster/hash/assoc_spec.rb +52 -0
- data/spec/lib/hamster/hash/clear_spec.rb +43 -0
- data/spec/lib/hamster/hash/construction_spec.rb +39 -0
- data/spec/{hamster → lib/hamster}/hash/copying_spec.rb +2 -4
- data/spec/lib/hamster/hash/default_proc_spec.rb +73 -0
- data/spec/lib/hamster/hash/delete_spec.rb +40 -0
- data/spec/lib/hamster/hash/each_spec.rb +78 -0
- data/spec/lib/hamster/hash/each_with_index_spec.rb +30 -0
- data/spec/lib/hamster/hash/empty_spec.rb +46 -0
- data/spec/lib/hamster/hash/eql_spec.rb +70 -0
- data/spec/lib/hamster/hash/except_spec.rb +43 -0
- data/spec/lib/hamster/hash/fetch_spec.rb +58 -0
- data/spec/lib/hamster/hash/filter_spec.rb +58 -0
- data/spec/lib/hamster/hash/find_spec.rb +44 -0
- data/spec/lib/hamster/hash/flat_map_spec.rb +36 -0
- data/spec/lib/hamster/hash/flatten_spec.rb +99 -0
- data/spec/lib/hamster/hash/get_spec.rb +80 -0
- data/spec/lib/hamster/hash/has_key_spec.rb +32 -0
- data/spec/lib/hamster/hash/has_value_spec.rb +28 -0
- data/spec/{hamster → lib/hamster}/hash/hash_spec.rb +5 -12
- data/spec/{hamster → lib/hamster}/hash/immutable_spec.rb +0 -0
- data/spec/lib/hamster/hash/inspect_spec.rb +31 -0
- data/spec/lib/hamster/hash/invert_spec.rb +31 -0
- data/spec/lib/hamster/hash/key_spec.rb +28 -0
- data/spec/{hamster → lib/hamster}/hash/keys_spec.rb +3 -6
- data/spec/lib/hamster/hash/map_spec.rb +46 -0
- data/spec/{hamster → lib/hamster}/hash/marshal_spec.rb +3 -3
- data/spec/lib/hamster/hash/merge_spec.rb +77 -0
- data/spec/lib/hamster/hash/min_max_spec.rb +50 -0
- data/spec/lib/hamster/hash/new_spec.rb +71 -0
- data/spec/{hamster → lib/hamster}/hash/none_spec.rb +12 -14
- data/spec/lib/hamster/hash/partition_spec.rb +36 -0
- data/spec/lib/hamster/hash/pretty_print_spec.rb +35 -0
- data/spec/lib/hamster/hash/put_spec.rb +81 -0
- data/spec/lib/hamster/hash/reduce_spec.rb +36 -0
- data/spec/lib/hamster/hash/remove_spec.rb +62 -0
- data/spec/lib/hamster/hash/reverse_each_spec.rb +28 -0
- data/spec/lib/hamster/hash/sample_spec.rb +14 -0
- data/spec/{hamster → lib/hamster}/hash/size_spec.rb +2 -2
- data/spec/lib/hamster/hash/slice_spec.rb +45 -0
- data/spec/lib/hamster/hash/sort_spec.rb +27 -0
- data/spec/lib/hamster/hash/store_spec.rb +54 -0
- data/spec/lib/hamster/hash/take_spec.rb +36 -0
- data/spec/lib/hamster/hash/to_a_spec.rb +14 -0
- data/spec/lib/hamster/hash/to_hash_spec.rb +22 -0
- data/spec/{hamster → lib/hamster}/hash/uniq_spec.rb +2 -4
- data/spec/lib/hamster/hash/values_at_spec.rb +14 -0
- data/spec/lib/hamster/hash/values_spec.rb +25 -0
- data/spec/{hamster → lib/hamster}/immutable/copying_spec.rb +0 -0
- data/spec/{hamster → lib/hamster}/immutable/immutable_spec.rb +0 -0
- data/spec/{hamster → lib/hamster}/immutable/memoize_spec.rb +2 -2
- data/spec/{hamster → lib/hamster}/immutable/new_spec.rb +0 -0
- data/spec/{hamster → lib/hamster}/immutable/transform_spec.rb +0 -0
- data/spec/{hamster → lib/hamster}/immutable/transform_unless_spec.rb +0 -0
- data/spec/lib/hamster/list/add_spec.rb +20 -0
- data/spec/lib/hamster/list/all_spec.rb +60 -0
- data/spec/{hamster → lib/hamster}/list/any_spec.rb +12 -20
- data/spec/{hamster → lib/hamster}/list/append_spec.rb +9 -10
- data/spec/lib/hamster/list/at_spec.rb +30 -0
- data/spec/lib/hamster/list/break_spec.rb +70 -0
- data/spec/{hamster → lib/hamster}/list/cadr_spec.rb +5 -8
- data/spec/{hamster → lib/hamster}/list/chunk_spec.rb +5 -8
- data/spec/{hamster → lib/hamster}/list/clear_spec.rb +4 -7
- data/spec/lib/hamster/list/combination_spec.rb +34 -0
- data/spec/{hamster → lib/hamster}/list/compact_spec.rb +5 -8
- data/spec/lib/hamster/list/compare_spec.rb +31 -0
- data/spec/{hamster → lib/hamster}/list/cons_spec.rb +5 -9
- data/spec/lib/hamster/list/construction_spec.rb +118 -0
- data/spec/{hamster → lib/hamster}/list/copying_spec.rb +3 -7
- data/spec/lib/hamster/list/count_spec.rb +37 -0
- data/spec/lib/hamster/list/cycle_spec.rb +29 -0
- data/spec/lib/hamster/list/delete_at_spec.rb +19 -0
- data/spec/lib/hamster/list/delete_spec.rb +17 -0
- data/spec/{hamster → lib/hamster}/list/drop_spec.rb +5 -8
- data/spec/lib/hamster/list/drop_while_spec.rb +39 -0
- data/spec/lib/hamster/list/each_slice_spec.rb +52 -0
- data/spec/lib/hamster/list/each_spec.rb +43 -0
- data/spec/lib/hamster/list/each_with_index_spec.rb +29 -0
- data/spec/{hamster → lib/hamster}/list/elem_index_spec.rb +4 -14
- data/spec/{hamster → lib/hamster}/list/elem_indices_spec.rb +5 -9
- data/spec/{hamster → lib/hamster}/list/empty_spec.rb +4 -13
- data/spec/{hamster → lib/hamster}/list/eql_spec.rb +2 -8
- data/spec/lib/hamster/list/fill_spec.rb +50 -0
- data/spec/{hamster → lib/hamster}/list/filter_spec.rb +3 -2
- data/spec/{hamster → lib/hamster}/list/find_all_spec.rb +3 -2
- data/spec/{hamster → lib/hamster}/list/find_index_spec.rb +4 -14
- data/spec/{hamster → lib/hamster}/list/find_indices_spec.rb +11 -9
- data/spec/{hamster → lib/hamster}/list/find_spec.rb +10 -16
- data/spec/{hamster → lib/hamster}/list/flat_map_spec.rb +0 -0
- data/spec/{hamster → lib/hamster}/list/flatten_spec.rb +5 -8
- data/spec/{hamster → lib/hamster}/list/grep_spec.rb +9 -17
- data/spec/{hamster → lib/hamster}/list/group_by_spec.rb +8 -24
- data/spec/{hamster → lib/hamster}/list/hash_spec.rb +4 -12
- data/spec/{hamster → lib/hamster}/list/head_spec.rb +2 -7
- data/spec/{hamster → lib/hamster}/list/include_spec.rb +4 -13
- data/spec/{hamster → lib/hamster}/list/init_spec.rb +5 -9
- data/spec/lib/hamster/list/inits_spec.rb +29 -0
- data/spec/lib/hamster/list/insert_spec.rb +47 -0
- data/spec/lib/hamster/list/inspect_spec.rb +30 -0
- data/spec/{hamster → lib/hamster}/list/intersperse_spec.rb +5 -8
- data/spec/lib/hamster/list/join_spec.rb +64 -0
- data/spec/lib/hamster/list/last_spec.rb +24 -0
- data/spec/{hamster → lib/hamster}/list/map_spec.rb +11 -20
- data/spec/lib/hamster/list/maximum_spec.rb +42 -0
- data/spec/{hamster → lib/hamster}/list/merge_by_spec.rb +4 -13
- data/spec/{hamster → lib/hamster}/list/merge_spec.rb +0 -0
- data/spec/lib/hamster/list/minimum_spec.rb +42 -0
- data/spec/lib/hamster/list/multithreading_spec.rb +48 -0
- data/spec/{hamster → lib/hamster}/list/none_spec.rb +11 -21
- data/spec/{hamster → lib/hamster}/list/one_spec.rb +12 -22
- data/spec/lib/hamster/list/partition_spec.rb +116 -0
- data/spec/lib/hamster/list/permutation_spec.rb +56 -0
- data/spec/{hamster → lib/hamster}/list/pop_spec.rb +1 -1
- data/spec/lib/hamster/list/product_spec.rb +24 -0
- data/spec/lib/hamster/list/reduce_spec.rb +97 -0
- data/spec/{hamster → lib/hamster}/list/remove_spec.rb +9 -19
- data/spec/{hamster → lib/hamster}/list/reverse_spec.rb +7 -14
- data/spec/lib/hamster/list/rotate_spec.rb +37 -0
- data/spec/lib/hamster/list/sample_spec.rb +14 -0
- data/spec/{hamster → lib/hamster}/list/select_spec.rb +3 -2
- data/spec/{hamster → lib/hamster}/list/size_spec.rb +4 -13
- data/spec/lib/hamster/list/slice_spec.rb +230 -0
- data/spec/{hamster → lib/hamster}/list/sorting_spec.rb +10 -20
- data/spec/lib/hamster/list/span_spec.rb +77 -0
- data/spec/{hamster → lib/hamster}/list/split_at_spec.rb +13 -14
- data/spec/lib/hamster/list/subsequences_spec.rb +24 -0
- data/spec/lib/hamster/list/sum_spec.rb +24 -0
- data/spec/lib/hamster/list/tail_spec.rb +31 -0
- data/spec/lib/hamster/list/tails_spec.rb +29 -0
- data/spec/{hamster → lib/hamster}/list/take_spec.rb +5 -8
- data/spec/{hamster → lib/hamster}/list/take_while_spec.rb +11 -17
- data/spec/lib/hamster/list/to_a_spec.rb +40 -0
- data/spec/{hamster → lib/hamster}/list/to_ary_spec.rb +1 -3
- data/spec/{hamster → lib/hamster}/list/to_list_spec.rb +3 -7
- data/spec/{hamster → lib/hamster}/list/to_set_spec.rb +2 -10
- data/spec/lib/hamster/list/transpose_spec.rb +20 -0
- data/spec/{hamster → lib/hamster}/list/union_spec.rb +5 -12
- data/spec/{hamster → lib/hamster}/list/uniq_spec.rb +5 -8
- data/spec/{hamster → lib/hamster}/list/zip_spec.rb +2 -9
- data/spec/lib/hamster/set/add_spec.rb +76 -0
- data/spec/{hamster → lib/hamster}/set/all_spec.rb +18 -14
- data/spec/{hamster → lib/hamster}/set/any_spec.rb +19 -16
- data/spec/{hamster → lib/hamster}/set/clear_spec.rb +8 -11
- data/spec/{hamster → lib/hamster}/set/compact_spec.rb +4 -7
- data/spec/{hamster → lib/hamster}/set/construction_spec.rb +4 -8
- data/spec/{hamster → lib/hamster}/set/copying_spec.rb +3 -5
- data/spec/{hamster → lib/hamster}/set/count_spec.rb +11 -16
- data/spec/lib/hamster/set/delete_spec.rb +72 -0
- data/spec/lib/hamster/set/difference_spec.rb +50 -0
- data/spec/lib/hamster/set/disjoint_spec.rb +26 -0
- data/spec/lib/hamster/set/each_spec.rb +46 -0
- data/spec/lib/hamster/set/empty_spec.rb +47 -0
- data/spec/{hamster → lib/hamster}/set/eqeq_spec.rb +0 -0
- data/spec/{hamster → lib/hamster}/set/eql_spec.rb +7 -1
- data/spec/lib/hamster/set/exclusion_spec.rb +48 -0
- data/spec/lib/hamster/set/filter_spec.rb +74 -0
- data/spec/{hamster → lib/hamster}/set/find_spec.rb +7 -11
- data/spec/lib/hamster/set/flatten_spec.rb +47 -0
- data/spec/{hamster → lib/hamster}/set/foreach_spec.rb +5 -4
- data/spec/{hamster → lib/hamster}/set/grep_spec.rb +1 -1
- data/spec/lib/hamster/set/group_by_spec.rb +60 -0
- data/spec/lib/hamster/set/hash_spec.rb +23 -0
- data/spec/lib/hamster/set/head_spec.rb +31 -0
- data/spec/{hamster → lib/hamster}/set/immutable_spec.rb +0 -0
- data/spec/lib/hamster/set/include_spec.rb +61 -0
- data/spec/lib/hamster/set/inspect_spec.rb +48 -0
- data/spec/lib/hamster/set/intersect_spec.rb +26 -0
- data/spec/lib/hamster/set/intersection_spec.rb +53 -0
- data/spec/lib/hamster/set/join_spec.rb +65 -0
- data/spec/lib/hamster/set/map_spec.rb +60 -0
- data/spec/{hamster → lib/hamster}/set/marshal_spec.rb +3 -3
- data/spec/{hamster → lib/hamster}/set/maximum_spec.rb +6 -15
- data/spec/{hamster → lib/hamster}/set/minimum_spec.rb +6 -16
- data/spec/lib/hamster/set/new_spec.rb +54 -0
- data/spec/{hamster → lib/hamster}/set/none_spec.rb +15 -15
- data/spec/{hamster → lib/hamster}/set/one_spec.rb +14 -16
- data/spec/lib/hamster/set/partition_spec.rb +53 -0
- data/spec/{hamster → lib/hamster}/set/product_spec.rb +6 -6
- data/spec/lib/hamster/set/reduce_spec.rb +56 -0
- data/spec/lib/hamster/set/remove_spec.rb +51 -0
- data/spec/{hamster/set/each_spec.rb → lib/hamster/set/reverse_each_spec.rb} +8 -7
- data/spec/lib/hamster/set/sample_spec.rb +14 -0
- data/spec/{hamster → lib/hamster}/set/size_spec.rb +0 -1
- data/spec/{hamster → lib/hamster}/set/sorting_spec.rb +17 -13
- data/spec/lib/hamster/set/subset_spec.rb +52 -0
- data/spec/lib/hamster/set/sum_spec.rb +24 -0
- data/spec/lib/hamster/set/superset_spec.rb +52 -0
- data/spec/lib/hamster/set/to_a_spec.rb +31 -0
- data/spec/lib/hamster/set/to_list_spec.rb +37 -0
- data/spec/{hamster → lib/hamster}/set/to_set_spec.rb +2 -6
- data/spec/lib/hamster/set/union_spec.rb +55 -0
- data/spec/{hamster → lib/hamster}/set/uniq_spec.rb +2 -5
- data/spec/lib/hamster/sorted_set/above_spec.rb +52 -0
- data/spec/lib/hamster/sorted_set/add_spec.rb +63 -0
- data/spec/lib/hamster/sorted_set/at_spec.rb +25 -0
- data/spec/lib/hamster/sorted_set/below_spec.rb +52 -0
- data/spec/lib/hamster/sorted_set/between_spec.rb +52 -0
- data/spec/lib/hamster/sorted_set/clear_spec.rb +35 -0
- data/spec/lib/hamster/sorted_set/construction_spec.rb +29 -0
- data/spec/lib/hamster/sorted_set/delete_at_spec.rb +19 -0
- data/spec/lib/hamster/sorted_set/delete_spec.rb +81 -0
- data/spec/{hamster/set → lib/hamster/sorted_set}/difference_spec.rb +5 -9
- data/spec/lib/hamster/sorted_set/disjoint_spec.rb +26 -0
- data/spec/lib/hamster/sorted_set/drop_spec.rb +29 -0
- data/spec/lib/hamster/sorted_set/drop_while_spec.rb +35 -0
- data/spec/lib/hamster/sorted_set/each_spec.rb +31 -0
- data/spec/lib/hamster/sorted_set/empty_spec.rb +37 -0
- data/spec/lib/hamster/sorted_set/eql_spec.rb +121 -0
- data/spec/{hamster/set → lib/hamster/sorted_set}/exclusion_spec.rb +4 -9
- data/spec/lib/hamster/sorted_set/fetch_spec.rb +65 -0
- data/spec/lib/hamster/sorted_set/filter_spec.rb +62 -0
- data/spec/lib/hamster/sorted_set/find_index_spec.rb +33 -0
- data/spec/lib/hamster/sorted_set/first_spec.rb +21 -0
- data/spec/lib/hamster/sorted_set/from_spec.rb +52 -0
- data/spec/lib/hamster/sorted_set/group_by_spec.rb +58 -0
- data/spec/lib/hamster/sorted_set/include_spec.rb +24 -0
- data/spec/lib/hamster/sorted_set/inspect_spec.rb +38 -0
- data/spec/lib/hamster/sorted_set/intersect_spec.rb +26 -0
- data/spec/lib/hamster/sorted_set/intersection_spec.rb +29 -0
- data/spec/lib/hamster/sorted_set/last_spec.rb +37 -0
- data/spec/lib/hamster/sorted_set/map_spec.rb +36 -0
- data/spec/lib/hamster/sorted_set/marshal_spec.rb +37 -0
- data/spec/lib/hamster/sorted_set/minimum_spec.rb +22 -0
- data/spec/lib/hamster/sorted_set/new_spec.rb +52 -0
- data/spec/lib/hamster/sorted_set/reverse_each_spec.rb +29 -0
- data/spec/lib/hamster/sorted_set/sample_spec.rb +14 -0
- data/spec/lib/hamster/sorted_set/size_spec.rb +18 -0
- data/spec/lib/hamster/sorted_set/slice_spec.rb +241 -0
- data/spec/lib/hamster/sorted_set/sorting_spec.rb +45 -0
- data/spec/lib/hamster/sorted_set/subset_spec.rb +48 -0
- data/spec/lib/hamster/sorted_set/superset_spec.rb +48 -0
- data/spec/lib/hamster/sorted_set/take_spec.rb +26 -0
- data/spec/lib/hamster/sorted_set/take_while_spec.rb +34 -0
- data/spec/lib/hamster/sorted_set/to_set_spec.rb +19 -0
- data/spec/lib/hamster/sorted_set/union_spec.rb +28 -0
- data/spec/lib/hamster/sorted_set/up_to_spec.rb +52 -0
- data/spec/lib/hamster/sorted_set/values_at_spec.rb +34 -0
- data/spec/lib/hamster/vector/add_spec.rb +68 -0
- data/spec/{hamster → lib/hamster}/vector/any_spec.rb +0 -0
- data/spec/lib/hamster/vector/assoc_spec.rb +36 -0
- data/spec/lib/hamster/vector/bsearch_spec.rb +58 -0
- data/spec/lib/hamster/vector/clear_spec.rb +34 -0
- data/spec/lib/hamster/vector/combination_spec.rb +82 -0
- data/spec/lib/hamster/vector/compact_spec.rb +30 -0
- data/spec/lib/hamster/vector/compare_spec.rb +32 -0
- data/spec/lib/hamster/vector/concat_spec.rb +35 -0
- data/spec/{hamster → lib/hamster}/vector/copying_spec.rb +3 -6
- data/spec/lib/hamster/vector/count_spec.rb +18 -0
- data/spec/lib/hamster/vector/delete_at_spec.rb +54 -0
- data/spec/lib/hamster/vector/delete_spec.rb +31 -0
- data/spec/lib/hamster/vector/drop_spec.rb +35 -0
- data/spec/lib/hamster/vector/drop_while_spec.rb +55 -0
- data/spec/lib/hamster/vector/each_index_spec.rb +41 -0
- data/spec/lib/hamster/vector/each_spec.rb +47 -0
- data/spec/lib/hamster/vector/each_with_index_spec.rb +40 -0
- data/spec/lib/hamster/vector/empty_spec.rb +44 -0
- data/spec/lib/hamster/vector/eql_spec.rb +77 -0
- data/spec/lib/hamster/vector/exist_spec.rb +4 -4
- data/spec/lib/hamster/vector/exists_spec.rb +4 -4
- data/spec/lib/hamster/vector/fetch_spec.rb +65 -0
- data/spec/lib/hamster/vector/fill_spec.rb +89 -0
- data/spec/lib/hamster/vector/filter_spec.rb +64 -0
- data/spec/{hamster → lib/hamster}/vector/first_spec.rb +2 -6
- data/spec/lib/hamster/vector/flatten_spec.rb +44 -0
- data/spec/lib/hamster/vector/get_spec.rb +75 -0
- data/spec/lib/hamster/vector/group_by_spec.rb +58 -0
- data/spec/{hamster → lib/hamster}/vector/include_spec.rb +2 -6
- data/spec/lib/hamster/vector/insert_spec.rb +69 -0
- data/spec/lib/hamster/vector/inspect_spec.rb +50 -0
- data/spec/{hamster/set → lib/hamster/vector}/join_spec.rb +23 -18
- data/spec/{hamster → lib/hamster}/vector/last_spec.rb +12 -3
- data/spec/{hamster → lib/hamster}/vector/length_spec.rb +12 -3
- data/spec/lib/hamster/vector/ltlt_spec.rb +20 -2
- data/spec/lib/hamster/vector/map_spec.rb +52 -0
- data/spec/lib/hamster/vector/marshal_spec.rb +32 -0
- data/spec/lib/hamster/vector/maximum_spec.rb +36 -0
- data/spec/lib/hamster/vector/minimum_spec.rb +36 -0
- data/spec/lib/hamster/vector/multiply_spec.rb +48 -0
- data/spec/lib/hamster/vector/new_spec.rb +51 -0
- data/spec/lib/hamster/vector/partition_spec.rb +53 -0
- data/spec/lib/hamster/vector/permutation_spec.rb +92 -0
- data/spec/lib/hamster/vector/pop_spec.rb +27 -0
- data/spec/lib/hamster/vector/product_spec.rb +71 -0
- data/spec/lib/hamster/vector/reduce_spec.rb +108 -0
- data/spec/lib/hamster/vector/remove_spec.rb +44 -0
- data/spec/lib/hamster/vector/repeated_combination_spec.rb +78 -0
- data/spec/lib/hamster/vector/repeated_permutation_spec.rb +94 -0
- data/spec/lib/hamster/vector/reverse_each_spec.rb +32 -0
- data/spec/lib/hamster/vector/reverse_spec.rb +22 -0
- data/spec/lib/hamster/vector/rindex_spec.rb +37 -0
- data/spec/lib/hamster/vector/rotate_spec.rb +74 -0
- data/spec/lib/hamster/vector/sample_spec.rb +14 -0
- data/spec/{hamster → lib/hamster}/vector/set_spec.rb +48 -14
- data/spec/lib/hamster/vector/shift_spec.rb +28 -0
- data/spec/lib/hamster/vector/shuffle_spec.rb +44 -0
- data/spec/lib/hamster/vector/slice_spec.rb +241 -0
- data/spec/lib/hamster/vector/sorting_spec.rb +57 -0
- data/spec/{hamster/set → lib/hamster/vector}/sum_spec.rb +3 -9
- data/spec/lib/hamster/vector/take_spec.rb +29 -0
- data/spec/lib/hamster/vector/take_while_spec.rb +35 -0
- data/spec/{hamster → lib/hamster}/vector/to_a_spec.rb +11 -12
- data/spec/{hamster → lib/hamster}/vector/to_ary_spec.rb +0 -0
- data/spec/{hamster/set → lib/hamster/vector}/to_list_spec.rb +7 -12
- data/spec/lib/hamster/vector/to_set_spec.rb +23 -0
- data/spec/lib/hamster/vector/transpose_spec.rb +49 -0
- data/spec/lib/hamster/vector/uniq_spec.rb +56 -0
- data/spec/lib/hamster/vector/unshift_spec.rb +29 -0
- data/spec/lib/hamster/vector/values_at_spec.rb +34 -0
- data/spec/lib/hamster/vector/zip_spec.rb +58 -0
- data/spec/spec_helper.rb +34 -1
- metadata +684 -467
- data/lib/hamster/core_ext/enumerator.rb +0 -16
- data/lib/hamster/experimental/mutable_stack.rb +0 -30
- data/lib/hamster/groupable.rb +0 -12
- data/lib/hamster/queue.rb +0 -86
- data/lib/hamster/sorter.rb +0 -25
- data/lib/hamster/stack.rb +0 -77
- data/lib/hamster/tuple.rb +0 -24
- data/spec/hamster/core_ext/enumerator_spec.rb +0 -19
- data/spec/hamster/experimental/mutable_stack/pop_spec.rb +0 -35
- data/spec/hamster/experimental/mutable_stack/push_spec.rb +0 -21
- data/spec/hamster/hash/any_spec.rb +0 -52
- data/spec/hamster/hash/clear_spec.rb +0 -29
- data/spec/hamster/hash/construction_spec.rb +0 -27
- data/spec/hamster/hash/delete_spec.rb +0 -38
- data/spec/hamster/hash/each_spec.rb +0 -30
- data/spec/hamster/hash/empty_spec.rb +0 -27
- data/spec/hamster/hash/eql_spec.rb +0 -70
- data/spec/hamster/hash/except_spec.rb +0 -22
- data/spec/hamster/hash/fetch_spec.rb +0 -72
- data/spec/hamster/hash/filter_spec.rb +0 -48
- data/spec/hamster/hash/find_spec.rb +0 -45
- data/spec/hamster/hash/get_spec.rb +0 -55
- data/spec/hamster/hash/has_key_spec.rb +0 -26
- data/spec/hamster/hash/inspect_spec.rb +0 -24
- data/spec/hamster/hash/map_spec.rb +0 -49
- data/spec/hamster/hash/merge_spec.rb +0 -30
- data/spec/hamster/hash/new_spec.rb +0 -21
- data/spec/hamster/hash/put_spec.rb +0 -67
- data/spec/hamster/hash/reduce_spec.rb +0 -52
- data/spec/hamster/hash/remove_spec.rb +0 -48
- data/spec/hamster/hash/slice_spec.rb +0 -26
- data/spec/hamster/hash/values_spec.rb +0 -29
- data/spec/hamster/list/add_spec.rb +0 -11
- data/spec/hamster/list/all_spec.rb +0 -84
- data/spec/hamster/list/at_spec.rb +0 -37
- data/spec/hamster/list/break_spec.rb +0 -73
- data/spec/hamster/list/combinations_spec.rb +0 -41
- data/spec/hamster/list/construction_spec.rb +0 -137
- data/spec/hamster/list/count_spec.rb +0 -52
- data/spec/hamster/list/cycle_spec.rb +0 -36
- data/spec/hamster/list/drop_while_spec.rb +0 -47
- data/spec/hamster/list/each_slice_spec.rb +0 -64
- data/spec/hamster/list/each_spec.rb +0 -56
- data/spec/hamster/list/each_with_index_spec.rb +0 -33
- data/spec/hamster/list/inits_spec.rb +0 -34
- data/spec/hamster/list/inspect_spec.rb +0 -33
- data/spec/hamster/list/join_spec.rb +0 -64
- data/spec/hamster/list/last_spec.rb +0 -34
- data/spec/hamster/list/maximum_spec.rb +0 -58
- data/spec/hamster/list/minimum_spec.rb +0 -58
- data/spec/hamster/list/partition_spec.rb +0 -63
- data/spec/hamster/list/product_spec.rb +0 -34
- data/spec/hamster/list/reduce_spec.rb +0 -72
- data/spec/hamster/list/slice_spec.rb +0 -40
- data/spec/hamster/list/span_spec.rb +0 -75
- data/spec/hamster/list/sum_spec.rb +0 -34
- data/spec/hamster/list/tail_spec.rb +0 -38
- data/spec/hamster/list/tails_spec.rb +0 -34
- data/spec/hamster/list/to_a_spec.rb +0 -42
- data/spec/hamster/queue/clear_spec.rb +0 -28
- data/spec/hamster/queue/construction_spec.rb +0 -34
- data/spec/hamster/queue/dequeue_spec.rb +0 -30
- data/spec/hamster/queue/empty_spec.rb +0 -35
- data/spec/hamster/queue/head_spec.rb +0 -25
- data/spec/hamster/queue/inspect_spec.rb +0 -23
- data/spec/hamster/queue/to_a_spec.rb +0 -32
- data/spec/hamster/queue/to_list_spec.rb +0 -34
- data/spec/hamster/set/add_spec.rb +0 -40
- data/spec/hamster/set/delete_spec.rb +0 -38
- data/spec/hamster/set/empty_spec.rb +0 -25
- data/spec/hamster/set/filter_spec.rb +0 -72
- data/spec/hamster/set/flatten_spec.rb +0 -47
- data/spec/hamster/set/group_by_spec.rb +0 -56
- data/spec/hamster/set/hash_spec.rb +0 -20
- data/spec/hamster/set/head_spec.rb +0 -28
- data/spec/hamster/set/include_spec.rb +0 -27
- data/spec/hamster/set/inspect_spec.rb +0 -24
- data/spec/hamster/set/intersection_spec.rb +0 -36
- data/spec/hamster/set/map_spec.rb +0 -49
- data/spec/hamster/set/new_spec.rb +0 -21
- data/spec/hamster/set/partition_spec.rb +0 -59
- data/spec/hamster/set/reduce_spec.rb +0 -62
- data/spec/hamster/set/remove_spec.rb +0 -48
- data/spec/hamster/set/subset_spec.rb +0 -31
- data/spec/hamster/set/superset_spec.rb +0 -31
- data/spec/hamster/set/to_a_spec.rb +0 -32
- data/spec/hamster/set/union_spec.rb +0 -35
- data/spec/hamster/sorter/immutable_spec.rb +0 -9
- data/spec/hamster/stack/clear_spec.rb +0 -28
- data/spec/hamster/stack/construction_spec.rb +0 -34
- data/spec/hamster/stack/copying_spec.rb +0 -23
- data/spec/hamster/stack/empty_spec.rb +0 -23
- data/spec/hamster/stack/eql_spec.rb +0 -48
- data/spec/hamster/stack/immutable_spec.rb +0 -9
- data/spec/hamster/stack/inspect_spec.rb +0 -23
- data/spec/hamster/stack/peek_spec.rb +0 -30
- data/spec/hamster/stack/pop_spec.rb +0 -31
- data/spec/hamster/stack/push_spec.rb +0 -31
- data/spec/hamster/stack/size_spec.rb +0 -25
- data/spec/hamster/stack/to_a_spec.rb +0 -32
- data/spec/hamster/stack/to_ary.rb +0 -37
- data/spec/hamster/stack/to_list_spec.rb +0 -25
- data/spec/hamster/trie/remove_spec.rb +0 -117
- data/spec/hamster/tuple/construction_spec.rb +0 -30
- data/spec/hamster/tuple/copying_spec.rb +0 -17
- data/spec/hamster/tuple/eql_spec.rb +0 -78
- data/spec/hamster/tuple/first_spec.rb +0 -14
- data/spec/hamster/tuple/immutable_spec.rb +0 -9
- data/spec/hamster/tuple/inspect_spec.rb +0 -14
- data/spec/hamster/tuple/last_spec.rb +0 -14
- data/spec/hamster/tuple/to_a_spec.rb +0 -30
- data/spec/hamster/tuple/to_ary_spec.rb +0 -37
- data/spec/hamster/undefined/erase_spec.rb +0 -36
- data/spec/hamster/vector/add_spec.rb +0 -56
- data/spec/hamster/vector/clear_spec.rb +0 -28
- data/spec/hamster/vector/each_spec.rb +0 -35
- data/spec/hamster/vector/each_with_index_spec.rb +0 -33
- data/spec/hamster/vector/empty_spec.rb +0 -32
- data/spec/hamster/vector/eql_spec.rb +0 -53
- data/spec/hamster/vector/filter_spec.rb +0 -58
- data/spec/hamster/vector/get_spec.rb +0 -58
- data/spec/hamster/vector/inspect_spec.rb +0 -33
- data/spec/hamster/vector/map_spec.rb +0 -57
- data/spec/hamster/vector/new_spec.rb +0 -48
- data/spec/hamster/vector/reduce_spec.rb +0 -62
- data/spec/lib/hamster/vector/cons_spec.rb +0 -48
data/lib/hamster/set.rb
CHANGED
@@ -2,122 +2,293 @@ require "forwardable"
|
|
2
2
|
require "hamster/immutable"
|
3
3
|
require "hamster/undefined"
|
4
4
|
require "hamster/enumerable"
|
5
|
-
require "hamster/groupable"
|
6
|
-
require "hamster/sorter"
|
7
5
|
require "hamster/trie"
|
8
|
-
require "hamster/
|
6
|
+
require "hamster/sorted_set"
|
9
7
|
|
10
8
|
module Hamster
|
11
9
|
def self.set(*items)
|
12
|
-
Set.new(
|
10
|
+
items.empty? ? EmptySet : Set.new(items)
|
13
11
|
end
|
14
12
|
|
13
|
+
# `Hamster::Set` is a collection of unordered values with no duplicates. Testing whether
|
14
|
+
# an object is present in the `Set` is fast. `Set` is also `Enumerable`, so you can
|
15
|
+
# iterate over the members of the set with {#each}, transform them with {#map}, filter
|
16
|
+
# them with {#select}, and so on. Some of the `Enumerable` methods are overridden to
|
17
|
+
# return Hamster collections.
|
18
|
+
#
|
19
|
+
# Like the `Set` class in Ruby's standard library, which we will call RubySet,
|
20
|
+
# `Hamster::Set` defines equivalency of objects using `#hash` and `#eql?`. No two
|
21
|
+
# objects with the same `#hash` code, and which are also `#eql?`, can coexist in the
|
22
|
+
# same `Set`. If one is already in the `Set`, attempts to add another one will have
|
23
|
+
# no effect.
|
24
|
+
#
|
25
|
+
# `Set`s have no natural ordering and cannot be compared using `#<=>`. However, they
|
26
|
+
# define {#<}, {#>}, {#<=}, and {#>=} as shorthand for {#proper_subset?},
|
27
|
+
# {#proper_superset?}, {#subset?}, and {#superset?} (respectively).
|
28
|
+
#
|
29
|
+
# The basic set-theoretic operations {#union}, {#intersection}, {#difference}, and
|
30
|
+
# {#exclusion} work with any `Enumerable` object. They may be more efficient when used
|
31
|
+
# with another `Hamster::Set`, or a RubySet.
|
32
|
+
#
|
33
|
+
# A `Set` can be created in any of the following ways:
|
34
|
+
#
|
35
|
+
# Hamster.set('Tom', 'Dick', 'Harry')
|
36
|
+
# Hamster::Set.new([1, 2, 3]) # any Enumerable can be used to initialize
|
37
|
+
# Hamster::Set['A', 'B', 'C', 'D']
|
38
|
+
#
|
39
|
+
# The latter 2 forms of initialization can be used with your own, custom subclasses
|
40
|
+
# of `Hamster::Set`.
|
41
|
+
#
|
42
|
+
# Unlike RubySet, all methods which you might expect to "modify" a `Hamster::Set`
|
43
|
+
# actually return a new set and leave the existing one unchanged.
|
44
|
+
#
|
45
|
+
# @example
|
46
|
+
# require 'hamster/set'
|
47
|
+
# set1 = Hamster.set(1, 2) # => Hamster::Set[1, 2]
|
48
|
+
# set2 = Hamster::Set[1, 2] # => Hamster::Set[1, 2]
|
49
|
+
# set1 == set2 # => true
|
50
|
+
# set3 = set1.add("foo") # => Hamster::Set[1, 2, "foo"]
|
51
|
+
# set3 - set2 # => Hamster::Set["foo"]
|
52
|
+
# set3.subset?(set1) # => false
|
53
|
+
# set1.subset?(set3) # => true
|
54
|
+
#
|
15
55
|
class Set
|
16
56
|
extend Forwardable
|
17
57
|
include Immutable
|
18
58
|
include Enumerable
|
19
|
-
include Groupable
|
20
59
|
|
21
60
|
class << self
|
22
|
-
|
23
|
-
|
24
|
-
def
|
25
|
-
|
61
|
+
# Create a new `Set` populated with the given items.
|
62
|
+
# @return [Set]
|
63
|
+
def [](*items)
|
64
|
+
new(items)
|
26
65
|
end
|
27
66
|
|
67
|
+
# Return an empty `Set`. If used on a subclass, returns an empty instance
|
68
|
+
# of that class.
|
69
|
+
#
|
70
|
+
# @return [Set]
|
28
71
|
def empty
|
29
|
-
@empty ||= self.
|
72
|
+
@empty ||= self.new
|
73
|
+
end
|
74
|
+
|
75
|
+
# "Raw" allocation of a new `Set`. Used internally to create a new
|
76
|
+
# instance quickly after obtaining a modified {Trie}.
|
77
|
+
#
|
78
|
+
# @return [Set]
|
79
|
+
# @private
|
80
|
+
def alloc(trie = EmptyTrie)
|
81
|
+
allocate.tap { |s| s.instance_variable_set(:@trie, trie) }
|
30
82
|
end
|
31
83
|
end
|
32
84
|
|
33
|
-
def initialize(
|
34
|
-
@trie =
|
85
|
+
def initialize(items=[])
|
86
|
+
@trie = Trie.new(0)
|
87
|
+
items.each { |item| @trie.put!(item, nil) }
|
35
88
|
end
|
36
89
|
|
90
|
+
# Return `true` if this `Set` contains no items.
|
91
|
+
# @return [Boolean]
|
37
92
|
def empty?
|
38
93
|
@trie.empty?
|
39
94
|
end
|
40
95
|
def_delegator :self, :empty?, :null?
|
41
96
|
|
97
|
+
# Return the number of items in this `Set`.
|
98
|
+
# @return [Integer]
|
42
99
|
def size
|
43
100
|
@trie.size
|
44
101
|
end
|
45
102
|
def_delegator :self, :size, :length
|
46
103
|
|
104
|
+
# Return a new `Set` with `item` added. If `item` is already in the set,
|
105
|
+
# return `self`.
|
106
|
+
#
|
107
|
+
# @param item [Object] The object to add
|
108
|
+
# @return [Set]
|
47
109
|
def add(item)
|
48
|
-
|
110
|
+
include?(item) ? self : self.class.alloc(@trie.put(item, nil))
|
49
111
|
end
|
50
112
|
def_delegator :self, :add, :<<
|
51
113
|
def_delegator :self, :add, :conj
|
52
114
|
def_delegator :self, :add, :conjoin
|
53
115
|
|
116
|
+
# If `item` is not a member of this `Set`, return a new `Set` with `item` added.
|
117
|
+
# Otherwise, return `false`.
|
118
|
+
#
|
119
|
+
# @param item [Object] The object to add
|
120
|
+
# @return [Set, false]
|
121
|
+
def add?(item)
|
122
|
+
!include?(item) && add(item)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Return a new `Set` with `item` removed. If `item` is not a member of the set,
|
126
|
+
# return `self`.
|
127
|
+
#
|
128
|
+
# @param item [Object] The object to remove
|
129
|
+
# @return [Set]
|
54
130
|
def delete(item)
|
55
131
|
trie = @trie.delete(item)
|
56
|
-
|
132
|
+
if trie.equal?(@trie)
|
133
|
+
self
|
134
|
+
elsif trie.empty?
|
135
|
+
self.class.empty
|
136
|
+
else
|
137
|
+
self.class.alloc(trie)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# If `item` is a member of this `Set`, return a new `Set` with `item` removed.
|
142
|
+
# Otherwise, return `false`.
|
143
|
+
#
|
144
|
+
# @param item [Object] The object to remove
|
145
|
+
# @return [Set, false]
|
146
|
+
def delete?(item)
|
147
|
+
include?(item) && delete(item)
|
57
148
|
end
|
58
149
|
|
150
|
+
# Call the block once for each item in this `Set`. No specific iteration order
|
151
|
+
# is guaranteed (but the order will be stable for any particular `Set`.)
|
152
|
+
#
|
153
|
+
# @return [self]
|
59
154
|
def each
|
60
|
-
return
|
61
|
-
@trie.each { |
|
155
|
+
return to_enum if not block_given?
|
156
|
+
@trie.each { |key, _| yield(key) }
|
157
|
+
self
|
62
158
|
end
|
63
159
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
160
|
+
# Call the block once for each item in this `Set`. Iteration order will be
|
161
|
+
# the opposite of {#each}.
|
162
|
+
#
|
163
|
+
# @return [self]
|
164
|
+
def reverse_each
|
165
|
+
return enum_for(:reverse_each) if not block_given?
|
166
|
+
@trie.reverse_each { |key, _| yield(key) }
|
167
|
+
self
|
68
168
|
end
|
69
|
-
def_delegator :self, :map, :collect
|
70
169
|
|
170
|
+
# Return a new `Set` with all the items for which the block returns true.
|
171
|
+
#
|
172
|
+
# @return [Set]
|
71
173
|
def filter
|
72
|
-
return
|
73
|
-
trie = @trie.filter { |entry| yield(entry
|
174
|
+
return enum_for(:filter) unless block_given?
|
175
|
+
trie = @trie.filter { |entry| yield(entry[0]) }
|
74
176
|
return self.class.empty if trie.empty?
|
75
|
-
|
177
|
+
trie.equal?(@trie) ? self : self.class.alloc(trie)
|
178
|
+
end
|
179
|
+
|
180
|
+
def_delegator :self, :reduce, :foldr # set is not ordered, so foldr is same as reduce
|
181
|
+
|
182
|
+
# Call the block once for each item in this `Set`.
|
183
|
+
# All the values returned from the block will be gathered into a new `Set`.
|
184
|
+
#
|
185
|
+
# @return [Set]
|
186
|
+
def map
|
187
|
+
return enum_for(:map) if not block_given?
|
188
|
+
return self if empty?
|
189
|
+
self.class.new(super)
|
76
190
|
end
|
191
|
+
def_delegator :self, :map, :collect
|
77
192
|
|
193
|
+
# Return `true` if the given item is present in this `Set`. More precisely,
|
194
|
+
# return `true` if an object with the same `#hash` code, and which is also `#eql?`
|
195
|
+
# to the given object is present.
|
196
|
+
#
|
197
|
+
# @param object [Object] The object to check for
|
198
|
+
# @return [Boolean]
|
78
199
|
def include?(object)
|
79
200
|
@trie.key?(object)
|
80
201
|
end
|
81
|
-
|
82
|
-
|
83
|
-
|
202
|
+
def_delegator :self, :include?, :member?
|
203
|
+
|
204
|
+
# Return a member of this `Set`. The member chosen will be the first one which
|
205
|
+
# would be yielded by {#each}. If the set is empty, return `nil`.
|
206
|
+
#
|
207
|
+
# @return [Object]
|
208
|
+
def first
|
209
|
+
(entry = @trie.at(0)) && entry[0]
|
84
210
|
end
|
85
|
-
def_delegator :self, :
|
86
|
-
|
211
|
+
def_delegator :self, :first, :head
|
212
|
+
|
213
|
+
# Return a {SortedSet} which contains the same items as this `Set`, ordered by
|
214
|
+
# the given comparator block. The comparator block should take 2 parameters and
|
215
|
+
# return 0, 1, or -1 depending on whether the first parameter is equal, greater than,
|
216
|
+
# or less than the second.
|
217
|
+
#
|
218
|
+
# @yield [a, b] A pair of items to be compared
|
219
|
+
# @yieldreturn [Integer]
|
220
|
+
# @return [SortedSet]
|
87
221
|
def sort(&comparator)
|
88
|
-
|
222
|
+
SortedSet.new(self.to_a, &comparator)
|
89
223
|
end
|
90
224
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
225
|
+
# Return a {SortedSet} which contains the same items as this `Set`, ordered by
|
226
|
+
# mapping each item through the provided block to obtain sort keys, and then
|
227
|
+
# sorting the keys.
|
228
|
+
#
|
229
|
+
# @yield [item] The item to obtain a sort key for
|
230
|
+
# @yieldreturn [Object]
|
231
|
+
# @return [SortedSet]
|
232
|
+
def sort_by(&mapper)
|
233
|
+
SortedSet.new(self.to_a, &mapper)
|
98
234
|
end
|
99
235
|
|
236
|
+
# Return a new `Set` which contains all the members of both this `Set` and `other`.
|
237
|
+
# `other` can be any `Enumerable` object.
|
238
|
+
#
|
239
|
+
# @example
|
240
|
+
# Hamster::Set[1, 2] | Hamster::Set[2, 3] # => Hamster::Set[1, 2, 3]
|
241
|
+
#
|
242
|
+
# @param other [Enumerable] The collection to merge with
|
243
|
+
# @return [Set]
|
100
244
|
def union(other)
|
101
|
-
|
245
|
+
if other.is_a?(Hamster::Set) && other.size > size
|
246
|
+
small_set = self
|
247
|
+
large_set_trie = other.instance_variable_get(:@trie)
|
248
|
+
else
|
249
|
+
small_set = other
|
250
|
+
large_set_trie = @trie
|
251
|
+
end
|
252
|
+
trie = small_set.reduce(large_set_trie) do |a, element|
|
102
253
|
next a if a.key?(element)
|
103
254
|
a.put(element, nil)
|
104
255
|
end
|
105
|
-
|
256
|
+
trie.equal?(@trie) ? self : self.class.alloc(trie)
|
106
257
|
end
|
107
258
|
def_delegator :self, :union, :|
|
108
259
|
def_delegator :self, :union, :+
|
109
260
|
def_delegator :self, :union, :merge
|
110
261
|
|
262
|
+
# Return a new `Set` which contains all the items which are members of both
|
263
|
+
# this `Set` and `other`. `other` can be any `Enumerable` object.
|
264
|
+
#
|
265
|
+
# @example
|
266
|
+
# Hamster::Set[1, 2] & Hamster::Set[2, 3] # => Hamster::Set[2]
|
267
|
+
#
|
268
|
+
# @param other [Enumerable] The collection to intersect with
|
269
|
+
# @return [Set]
|
111
270
|
def intersection(other)
|
112
|
-
|
113
|
-
|
271
|
+
if (other.size < @trie.size) && other.is_a?(Hamster::Set)
|
272
|
+
trie = other.instance_variable_get(:@trie).filter { |key, _| include?(key) }
|
273
|
+
else
|
274
|
+
trie = @trie.filter { |key, _| other.include?(key) }
|
275
|
+
end
|
276
|
+
trie.equal?(@trie) ? self : self.class.alloc(trie)
|
114
277
|
end
|
115
278
|
def_delegator :self, :intersection, :intersect
|
116
279
|
def_delegator :self, :intersection, :&
|
117
280
|
|
281
|
+
# Return a new `Set` with all the items in `other` removed. `other` can be
|
282
|
+
# any `Enumerable` object.
|
283
|
+
#
|
284
|
+
# @example
|
285
|
+
# Hamster::Set[1, 2] - Hamster::Set[2, 3] # => Hamster::Set[1]
|
286
|
+
#
|
287
|
+
# @param other [Enumerable] The collection to subtract from this set
|
288
|
+
# @return [Set]
|
118
289
|
def difference(other)
|
119
290
|
trie = if (@trie.size <= other.size) && (other.is_a?(Hamster::Set) || (defined?(::Set) && other.is_a?(::Set)))
|
120
|
-
@trie.filter { |
|
291
|
+
@trie.filter { |key, _| !other.include?(key) }
|
121
292
|
else
|
122
293
|
other.reduce(@trie) { |trie, item| trie.delete(item) }
|
123
294
|
end
|
@@ -127,19 +298,88 @@ module Hamster
|
|
127
298
|
def_delegator :self, :difference, :subtract
|
128
299
|
def_delegator :self, :difference, :-
|
129
300
|
|
301
|
+
# Return a new `Set` which contains all the items which are members of this
|
302
|
+
# `Set` or of `other`, but not both. `other` can be any `Enumerable` object.
|
303
|
+
#
|
304
|
+
# @example
|
305
|
+
# Hamster::Set[1, 2] ^ Hamster::Set[2, 3] # => Hamster::Set[1, 3]
|
306
|
+
#
|
307
|
+
# @param other [Enumerable] The collection to take the exclusive disjunction of
|
308
|
+
# @return [Set]
|
130
309
|
def exclusion(other)
|
131
310
|
((self | other) - (self & other))
|
132
311
|
end
|
133
312
|
def_delegator :self, :exclusion, :^
|
134
313
|
|
314
|
+
# Return `true` if all items in this `Set` are also in `other`.
|
315
|
+
#
|
316
|
+
# @param other [Set]
|
317
|
+
# @return [Boolean]
|
135
318
|
def subset?(other)
|
319
|
+
return false if other.size < size
|
136
320
|
all? { |item| other.include?(item) }
|
137
321
|
end
|
322
|
+
alias :<= :subset?
|
138
323
|
|
324
|
+
# Return `true` if all items in `other` are also in this `Set`.
|
325
|
+
#
|
326
|
+
# @param other [Set]
|
327
|
+
# @return [Boolean]
|
139
328
|
def superset?(other)
|
140
329
|
other.subset?(self)
|
141
330
|
end
|
331
|
+
alias :>= :superset?
|
332
|
+
|
333
|
+
# Returns `true` if `other` contains all the items in this `Set`, plus at least
|
334
|
+
# one item which is not in this set.
|
335
|
+
#
|
336
|
+
# @param other [Set]
|
337
|
+
# @return [Boolean]
|
338
|
+
def proper_subset?(other)
|
339
|
+
return false if other.size <= size
|
340
|
+
all? { |item| other.include?(item) }
|
341
|
+
end
|
342
|
+
alias :< :proper_subset?
|
343
|
+
|
344
|
+
# Returns `true` if this `Set` contains all the items in `other`, plus at least
|
345
|
+
# one item which is not in `other`.
|
346
|
+
#
|
347
|
+
# @param other [Set]
|
348
|
+
# @return [Boolean]
|
349
|
+
def proper_superset?(other)
|
350
|
+
other.proper_subset?(self)
|
351
|
+
end
|
352
|
+
alias :> :proper_superset?
|
353
|
+
|
354
|
+
# Return `true` if this `Set` and `other` do not share any items.
|
355
|
+
#
|
356
|
+
# @param other [Set]
|
357
|
+
# @return [Boolean]
|
358
|
+
def disjoint?(other)
|
359
|
+
if size < other.size
|
360
|
+
each { |item| return false if other.include?(item) }
|
361
|
+
else
|
362
|
+
other.each { |item| return false if include?(item) }
|
363
|
+
end
|
364
|
+
true
|
365
|
+
end
|
142
366
|
|
367
|
+
# Return `true` if this `Set` and `other` have at least one item in common.
|
368
|
+
#
|
369
|
+
# @param other [Set]
|
370
|
+
# @return [Boolean]
|
371
|
+
def intersect?(other)
|
372
|
+
!disjoint?(other)
|
373
|
+
end
|
374
|
+
|
375
|
+
# Recursively insert the contents of any nested `Set`s into this `Set`, and
|
376
|
+
# remove them.
|
377
|
+
#
|
378
|
+
# @example
|
379
|
+
# Hamster::Set[Hamster::Set[1, 2], Hamster::Set[3, 4]].flatten
|
380
|
+
# # => Hamster::Set[1, 2, 3, 4]
|
381
|
+
#
|
382
|
+
# @return [Set]
|
143
383
|
def flatten
|
144
384
|
reduce(self.class.empty) do |set, item|
|
145
385
|
next set.union(item.flatten) if item.is_a?(Set)
|
@@ -147,43 +387,61 @@ module Hamster
|
|
147
387
|
end
|
148
388
|
end
|
149
389
|
|
150
|
-
def group_by(&block)
|
151
|
-
group_by_with(self.class.empty, &block)
|
152
|
-
end
|
153
390
|
def_delegator :self, :group_by, :group
|
391
|
+
def_delegator :self, :group_by, :classify
|
154
392
|
|
393
|
+
# Return a randomly chosen item from this `Set`. If the set is empty, return `nil`.
|
394
|
+
#
|
395
|
+
# @return [Object]
|
396
|
+
def sample
|
397
|
+
empty? ? nil : @trie.at(rand(size))[0]
|
398
|
+
end
|
399
|
+
|
400
|
+
# Return an empty `Set` instance, of the same class as this one. Useful if you
|
401
|
+
# have multiple subclasses of `Set` and want to treat them polymorphically.
|
402
|
+
#
|
403
|
+
# @return [Hash]
|
155
404
|
def clear
|
156
405
|
self.class.empty
|
157
406
|
end
|
158
407
|
|
408
|
+
# Return true if `other` has the same type and contents as this `Set`.
|
409
|
+
#
|
410
|
+
# @param other [Object] The object to compare with
|
411
|
+
# @return [Boolean]
|
159
412
|
def eql?(other)
|
413
|
+
return true if other.equal?(self)
|
160
414
|
return false if not instance_of?(other.class)
|
161
415
|
other_trie = other.instance_variable_get(:@trie)
|
162
416
|
return false if @trie.size != other_trie.size
|
163
|
-
@trie.each do |
|
164
|
-
return false if !other_trie.key?(
|
417
|
+
@trie.each do |key, _|
|
418
|
+
return false if !other_trie.key?(key)
|
165
419
|
end
|
166
420
|
true
|
167
421
|
end
|
168
422
|
def_delegator :self, :eql?, :==
|
169
423
|
|
424
|
+
# See `Object#hash`.
|
425
|
+
# @return [Integer]
|
170
426
|
def hash
|
171
427
|
reduce(0) { |hash, item| (hash << 5) - hash + item.hash }
|
172
428
|
end
|
173
429
|
|
430
|
+
undef :"<=>" # Sets are not ordered, so Enumerable#<=> will give a meaningless result
|
431
|
+
undef :each_index # Set members cannot be accessed by 'index', so #each_index is not meaningful
|
432
|
+
|
174
433
|
def_delegator :self, :dup, :uniq
|
175
434
|
def_delegator :self, :dup, :nub
|
176
|
-
def_delegator :self, :dup, :to_set
|
177
435
|
def_delegator :self, :dup, :remove_duplicates
|
178
436
|
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
"{#{to_a.inspect[1..-2]}}"
|
437
|
+
# Return `self`.
|
438
|
+
#
|
439
|
+
# @return [self]
|
440
|
+
def to_set
|
441
|
+
self
|
185
442
|
end
|
186
443
|
|
444
|
+
# @private
|
187
445
|
def marshal_dump
|
188
446
|
output = {}
|
189
447
|
each do |key|
|
@@ -192,6 +450,7 @@ module Hamster
|
|
192
450
|
output
|
193
451
|
end
|
194
452
|
|
453
|
+
# @private
|
195
454
|
def marshal_load(dictionary)
|
196
455
|
@trie = dictionary.reduce(EmptyTrie) do |trie, key_value|
|
197
456
|
trie.put(key_value.first, nil)
|
@@ -199,5 +458,9 @@ module Hamster
|
|
199
458
|
end
|
200
459
|
end
|
201
460
|
|
461
|
+
# The canonical empty `Set`. Returned by `Hamster.set` and `Set[]` when
|
462
|
+
# invoked with no arguments; also returned by `Set.empty`. Prefer using this
|
463
|
+
# one rather than creating many empty sets using `Set.new`.
|
464
|
+
#
|
202
465
|
EmptySet = Hamster::Set.empty
|
203
466
|
end
|