hamster 1.0.0 → 1.0.1.pre.rc.1
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 -3
- data/lib/hamster/core_ext.rb +1 -0
- data/lib/hamster/core_ext/enumerable.rb +17 -17
- data/lib/hamster/core_ext/enumerator.rb +16 -0
- data/lib/hamster/core_ext/io.rb +17 -15
- data/lib/hamster/enumerable.rb +107 -123
- data/lib/hamster/experimental/mutable_queue.rb +6 -2
- data/lib/hamster/experimental/mutable_set.rb +3 -1
- data/lib/hamster/experimental/mutable_stack.rb +30 -0
- data/lib/hamster/hash.rb +95 -713
- data/lib/hamster/immutable.rb +0 -4
- data/lib/hamster/list.rb +242 -1062
- data/lib/hamster/mutable_hash.rb +3 -1
- data/lib/hamster/queue.rb +87 -0
- data/lib/hamster/read_copy_update.rb +1 -2
- data/lib/hamster/set.rb +73 -478
- data/lib/hamster/sorter.rb +25 -0
- data/lib/hamster/stack.rb +75 -0
- data/lib/hamster/trie.rb +48 -199
- data/lib/hamster/tuple.rb +39 -0
- data/lib/hamster/undefined.rb +3 -1
- data/lib/hamster/vector.rb +72 -1326
- data/lib/hamster/version.rb +1 -1
- data/spec/hamster/core_ext/array_spec.rb +20 -0
- data/spec/{lib/hamster → hamster}/core_ext/enumerable_spec.rb +0 -5
- data/spec/hamster/core_ext/enumerator_spec.rb +19 -0
- data/spec/{lib/hamster → hamster}/core_ext/io_spec.rb +0 -0
- data/spec/hamster/experimental/mutable_set/add_qm_spec.rb +47 -0
- data/spec/hamster/experimental/mutable_set/add_spec.rb +51 -0
- data/spec/hamster/experimental/mutable_set/delete_qm_spec.rb +47 -0
- data/spec/hamster/experimental/mutable_set/delete_spec.rb +47 -0
- data/spec/hamster/experimental/mutable_stack/pop_spec.rb +41 -0
- data/spec/hamster/experimental/mutable_stack/push_spec.rb +41 -0
- data/spec/hamster/hash/all_spec.rb +59 -0
- data/spec/hamster/hash/any_spec.rb +67 -0
- data/spec/hamster/hash/clear_spec.rb +36 -0
- data/spec/hamster/hash/construction_spec.rb +35 -0
- data/spec/{lib/hamster → hamster}/hash/copying_spec.rb +12 -3
- data/spec/hamster/hash/delete_spec.rb +47 -0
- data/spec/hamster/hash/each_spec.rb +41 -0
- data/spec/hamster/hash/empty_spec.rb +27 -0
- data/spec/hamster/hash/eql_spec.rb +62 -0
- data/spec/hamster/hash/except_spec.rb +31 -0
- data/spec/hamster/hash/fetch_spec.rb +95 -0
- data/spec/hamster/hash/filter_spec.rb +63 -0
- data/spec/hamster/hash/find_spec.rb +58 -0
- data/spec/hamster/hash/get_spec.rb +55 -0
- data/spec/hamster/hash/has_key_spec.rb +35 -0
- data/spec/hamster/hash/hash_spec.rb +52 -0
- data/spec/{lib/hamster → hamster}/hash/immutable_spec.rb +3 -0
- data/spec/hamster/hash/inspect_spec.rb +32 -0
- data/spec/hamster/hash/keys_spec.rb +21 -0
- data/spec/hamster/hash/map_spec.rb +64 -0
- data/spec/{lib/hamster → hamster}/hash/marshal_spec.rb +3 -3
- data/spec/hamster/hash/merge_spec.rb +36 -0
- data/spec/{lib/hamster → hamster}/hash/none_spec.rb +14 -12
- data/spec/hamster/hash/put_spec.rb +65 -0
- data/spec/hamster/hash/reduce_spec.rb +60 -0
- data/spec/hamster/hash/remove_spec.rb +63 -0
- data/spec/{lib/hamster → hamster}/hash/size_spec.rb +2 -2
- data/spec/hamster/hash/slice_spec.rb +26 -0
- data/spec/hamster/hash/uniq_spec.rb +23 -0
- data/spec/hamster/hash/values_spec.rb +34 -0
- data/spec/{lib/hamster → hamster}/immutable/copying_spec.rb +8 -1
- data/spec/{lib/hamster → hamster}/immutable/immutable_spec.rb +14 -1
- data/spec/{lib/hamster → hamster}/immutable/memoize_spec.rb +3 -2
- data/spec/{lib/hamster → hamster}/immutable/new_spec.rb +0 -0
- data/spec/{lib/hamster → hamster}/immutable/transform_spec.rb +0 -0
- data/spec/{lib/hamster → hamster}/immutable/transform_unless_spec.rb +0 -0
- data/spec/hamster/list/add_spec.rb +16 -0
- data/spec/hamster/list/all_spec.rb +111 -0
- data/spec/hamster/list/any_spec.rb +79 -0
- data/spec/{lib/hamster → hamster}/list/append_spec.rb +22 -11
- data/spec/hamster/list/at_spec.rb +49 -0
- data/spec/hamster/list/break_spec.rb +85 -0
- data/spec/{lib/hamster → hamster}/list/cadr_spec.rb +17 -6
- data/spec/{lib/hamster → hamster}/list/chunk_spec.rb +17 -6
- data/spec/{lib/hamster → hamster}/list/clear_spec.rb +16 -5
- data/spec/hamster/list/combinations_spec.rb +51 -0
- data/spec/{lib/hamster → hamster}/list/compact_spec.rb +17 -6
- data/spec/hamster/list/cons_spec.rb +41 -0
- data/spec/hamster/list/construction_spec.rb +166 -0
- data/spec/{lib/hamster → hamster}/list/copying_spec.rb +16 -4
- data/spec/hamster/list/count_spec.rb +66 -0
- data/spec/hamster/list/cycle_spec.rb +45 -0
- data/spec/{lib/hamster → hamster}/list/drop_spec.rb +17 -6
- data/spec/hamster/list/drop_while_spec.rb +59 -0
- data/spec/hamster/list/each_slice_spec.rb +80 -0
- data/spec/hamster/list/each_spec.rb +72 -0
- data/spec/hamster/list/each_with_index_spec.rb +42 -0
- data/spec/hamster/list/elem_index_spec.rb +58 -0
- data/spec/hamster/list/elem_indices_spec.rb +45 -0
- data/spec/hamster/list/empty_spec.rb +47 -0
- data/spec/hamster/list/eql_spec.rb +78 -0
- data/spec/hamster/list/filter_spec.rb +70 -0
- data/spec/{lib/hamster → hamster}/list/find_all_spec.rb +2 -3
- data/spec/{lib/hamster → hamster}/list/find_index_spec.rb +27 -5
- data/spec/hamster/list/find_indices_spec.rb +45 -0
- data/spec/{lib/hamster → hamster}/list/find_spec.rb +33 -11
- data/spec/{lib/hamster → hamster}/list/flat_map_spec.rb +0 -0
- data/spec/{lib/hamster → hamster}/list/flatten_spec.rb +17 -6
- data/spec/{lib/hamster → hamster}/list/grep_spec.rb +33 -10
- data/spec/{lib/hamster → hamster}/list/group_by_spec.rb +44 -9
- data/spec/{lib/hamster → hamster}/list/hash_spec.rb +12 -4
- data/spec/{lib/hamster → hamster}/list/head_spec.rb +18 -3
- data/spec/{lib/hamster → hamster}/list/include_spec.rb +27 -6
- data/spec/{lib/hamster → hamster}/list/init_spec.rb +17 -6
- data/spec/hamster/list/inits_spec.rb +42 -0
- data/spec/hamster/list/inspect_spec.rb +43 -0
- data/spec/{lib/hamster → hamster}/list/intersperse_spec.rb +17 -6
- data/spec/hamster/list/join_spec.rb +81 -0
- data/spec/hamster/list/last_spec.rb +44 -0
- data/spec/{lib/hamster → hamster}/list/map_spec.rb +35 -12
- data/spec/hamster/list/maximum_spec.rb +77 -0
- data/spec/{lib/hamster → hamster}/list/merge_by_spec.rb +32 -5
- data/spec/{lib/hamster → hamster}/list/merge_spec.rb +20 -1
- data/spec/hamster/list/minimum_spec.rb +77 -0
- data/spec/{lib/hamster → hamster}/list/none_spec.rb +39 -12
- data/spec/{lib/hamster → hamster}/list/one_spec.rb +38 -13
- data/spec/hamster/list/partition_spec.rb +75 -0
- data/spec/{lib/hamster → hamster}/list/pop_spec.rb +1 -1
- data/spec/hamster/list/product_spec.rb +44 -0
- data/spec/hamster/list/reduce_spec.rb +73 -0
- data/spec/{lib/hamster/list/reject_spec.rb → hamster/list/remove_spec.rb} +35 -11
- data/spec/{lib/hamster → hamster}/list/reverse_spec.rb +25 -8
- data/spec/{lib/hamster → hamster}/list/select_spec.rb +2 -3
- data/spec/{lib/hamster → hamster}/list/size_spec.rb +26 -5
- data/spec/hamster/list/slice_spec.rb +50 -0
- data/spec/{lib/hamster → hamster}/list/sorting_spec.rb +34 -11
- data/spec/hamster/list/span_spec.rb +86 -0
- data/spec/{lib/hamster → hamster}/list/split_at_spec.rb +23 -14
- data/spec/hamster/list/sum_spec.rb +44 -0
- data/spec/hamster/list/tail_spec.rb +48 -0
- data/spec/hamster/list/tails_spec.rb +42 -0
- data/spec/{lib/hamster → hamster}/list/take_spec.rb +17 -6
- data/spec/{lib/hamster → hamster}/list/take_while_spec.rb +18 -11
- data/spec/hamster/list/to_a_spec.rb +54 -0
- data/spec/{lib/hamster → hamster}/list/to_ary_spec.rb +4 -1
- data/spec/{lib/hamster → hamster}/list/to_list_spec.rb +16 -4
- data/spec/hamster/list/to_set_spec.rb +33 -0
- data/spec/{lib/hamster → hamster}/list/union_spec.rb +23 -6
- data/spec/hamster/list/uniq_spec.rb +45 -0
- data/spec/{lib/hamster → hamster}/list/zip_spec.rb +9 -2
- data/spec/hamster/queue/clear_spec.rb +36 -0
- data/spec/hamster/queue/construction_spec.rb +43 -0
- data/spec/hamster/queue/dequeue_spec.rb +40 -0
- data/spec/hamster/queue/empty_spec.rb +47 -0
- data/spec/{lib/hamster/deque → hamster/queue}/enqueue_spec.rb +21 -8
- data/spec/hamster/queue/head_spec.rb +35 -0
- data/spec/hamster/queue/inspect_spec.rb +31 -0
- data/spec/{lib/hamster/deque → hamster/queue}/size_spec.rb +20 -5
- data/spec/hamster/queue/to_a_spec.rb +42 -0
- data/spec/{lib/hamster/deque → hamster/queue}/to_ary_spec.rb +6 -6
- data/spec/hamster/queue/to_list_spec.rb +44 -0
- data/spec/hamster/set/add_spec.rb +51 -0
- data/spec/hamster/set/all_spec.rb +67 -0
- data/spec/hamster/set/any_spec.rb +67 -0
- data/spec/hamster/set/clear_spec.rb +36 -0
- data/spec/{lib/hamster → hamster}/set/compact_spec.rb +16 -5
- data/spec/{lib/hamster → hamster}/set/construction_spec.rb +17 -5
- data/spec/{lib/hamster → hamster}/set/copying_spec.rb +12 -3
- data/spec/{lib/hamster → hamster}/set/count_spec.rb +28 -11
- data/spec/hamster/set/delete_spec.rb +47 -0
- data/spec/{lib/hamster/sorted_set → hamster/set}/difference_spec.rb +21 -7
- data/spec/{lib/hamster/set/reverse_each_spec.rb → hamster/set/each_spec.rb} +7 -8
- data/spec/hamster/set/empty_spec.rb +35 -0
- data/spec/{lib/hamster → hamster}/set/eqeq_spec.rb +0 -0
- data/spec/{lib/hamster → hamster}/set/eql_spec.rb +1 -7
- data/spec/{lib/hamster/sorted_set → hamster/set}/exclusion_spec.rb +20 -5
- data/spec/hamster/set/filter_spec.rb +79 -0
- data/spec/{lib/hamster → hamster}/set/find_spec.rb +25 -8
- data/spec/hamster/set/flatten_spec.rb +49 -0
- data/spec/hamster/set/foreach_spec.rb +39 -0
- data/spec/{lib/hamster → hamster}/set/grep_spec.rb +1 -1
- data/spec/hamster/set/group_by_spec.rb +65 -0
- data/spec/hamster/set/hash_spec.rb +20 -0
- data/spec/hamster/set/head_spec.rb +39 -0
- data/spec/{lib/hamster → hamster}/set/immutable_spec.rb +4 -1
- data/spec/hamster/set/include_spec.rb +35 -0
- data/spec/hamster/set/inspect_spec.rb +32 -0
- data/spec/hamster/set/intersection_spec.rb +46 -0
- data/spec/{lib/hamster/vector → hamster/set}/join_spec.rb +33 -23
- data/spec/hamster/set/map_spec.rb +64 -0
- data/spec/{lib/hamster → hamster}/set/marshal_spec.rb +9 -4
- data/spec/hamster/set/maximum_spec.rb +65 -0
- data/spec/hamster/set/minimum_spec.rb +65 -0
- data/spec/{lib/hamster → hamster}/set/none_spec.rb +30 -15
- data/spec/{lib/hamster → hamster}/set/one_spec.rb +29 -14
- data/spec/hamster/set/partition_spec.rb +71 -0
- data/spec/{lib/hamster → hamster}/set/product_spec.rb +15 -7
- data/spec/hamster/set/reduce_spec.rb +87 -0
- data/spec/hamster/set/remove_spec.rb +63 -0
- data/spec/{lib/hamster → hamster}/set/size_spec.rb +10 -1
- data/spec/{lib/hamster → hamster}/set/sorting_spec.rb +16 -18
- data/spec/hamster/set/subset_spec.rb +39 -0
- data/spec/{lib/hamster/vector → hamster/set}/sum_spec.rb +18 -4
- data/spec/hamster/set/superset_spec.rb +39 -0
- data/spec/hamster/set/to_a_spec.rb +42 -0
- data/spec/{lib/hamster/vector → hamster/set}/to_list_spec.rb +23 -8
- data/spec/{lib/hamster → hamster}/set/to_set_spec.rb +15 -3
- data/spec/hamster/set/union_spec.rb +45 -0
- data/spec/hamster/set/uniq_spec.rb +23 -0
- data/spec/hamster/sorter/immutable_spec.rb +12 -0
- data/spec/hamster/stack/clear_spec.rb +36 -0
- data/spec/hamster/stack/construction_spec.rb +43 -0
- data/spec/hamster/stack/copying_spec.rb +31 -0
- data/spec/hamster/stack/empty_spec.rb +31 -0
- data/spec/hamster/stack/eql_spec.rb +60 -0
- data/spec/hamster/stack/immutable_spec.rb +12 -0
- data/spec/hamster/stack/inspect_spec.rb +31 -0
- data/spec/hamster/stack/peek_spec.rb +40 -0
- data/spec/hamster/stack/pop_spec.rb +41 -0
- data/spec/hamster/stack/push_spec.rb +41 -0
- data/spec/hamster/stack/size_spec.rb +35 -0
- data/spec/hamster/stack/to_a_spec.rb +42 -0
- data/spec/hamster/stack/to_ary.rb +37 -0
- data/spec/hamster/stack/to_list_spec.rb +33 -0
- data/spec/hamster/trie/remove_spec.rb +117 -0
- data/spec/hamster/tuple/copying_spec.rb +24 -0
- data/spec/hamster/tuple/eql_spec.rb +61 -0
- data/spec/hamster/tuple/first_spec.rb +19 -0
- data/spec/hamster/tuple/immutable_spec.rb +12 -0
- data/spec/hamster/tuple/inspect_spec.rb +19 -0
- data/spec/hamster/tuple/last_spec.rb +19 -0
- data/spec/hamster/tuple/to_a_spec.rb +38 -0
- data/spec/hamster/tuple/to_ary_spec.rb +38 -0
- data/spec/hamster/undefined/erase_spec.rb +47 -0
- data/spec/hamster/vector/add_spec.rb +48 -0
- data/spec/{lib/hamster → hamster}/vector/any_spec.rb +0 -0
- data/spec/hamster/vector/clear_spec.rb +35 -0
- data/spec/{lib/hamster → hamster}/vector/copying_spec.rb +14 -4
- data/spec/hamster/vector/each_spec.rb +45 -0
- data/spec/hamster/vector/each_with_index_spec.rb +41 -0
- data/spec/hamster/vector/empty_spec.rb +34 -0
- data/spec/hamster/vector/eql_spec.rb +64 -0
- data/spec/hamster/vector/filter_spec.rb +62 -0
- data/spec/hamster/vector/first_spec.rb +35 -0
- data/spec/hamster/vector/get_spec.rb +80 -0
- data/spec/{lib/hamster → hamster}/vector/include_spec.rb +17 -4
- data/spec/hamster/vector/inspect_spec.rb +33 -0
- data/spec/{lib/hamster → hamster}/vector/last_spec.rb +3 -12
- data/spec/{lib/hamster → hamster}/vector/length_spec.rb +3 -12
- data/spec/hamster/vector/map_spec.rb +63 -0
- data/spec/{lib/hamster → hamster}/vector/reduce_spec.rb +47 -16
- data/spec/hamster/vector/set_spec.rb +113 -0
- data/spec/{lib/hamster → hamster}/vector/to_a_spec.rb +12 -11
- data/spec/{lib/hamster → hamster}/vector/to_ary_spec.rb +0 -0
- data/spec/lib/hamster/vector/cons_spec.rb +48 -0
- data/spec/lib/hamster/vector/exist_spec.rb +70 -0
- data/spec/lib/hamster/vector/exists_spec.rb +70 -0
- data/spec/lib/hamster/vector/ltlt_spec.rb +2 -20
- data/spec/spec_helper.rb +5 -36
- metadata +510 -723
- data/lib/hamster/deque.rb +0 -252
- data/lib/hamster/nested.rb +0 -36
- data/lib/hamster/sorted_set.rb +0 -1397
- data/spec/lib/hamster/core_ext/array_spec.rb +0 -14
- data/spec/lib/hamster/deque/clear_spec.rb +0 -34
- data/spec/lib/hamster/deque/construction_spec.rb +0 -30
- data/spec/lib/hamster/deque/copying_spec.rb +0 -20
- data/spec/lib/hamster/deque/dequeue_spec.rb +0 -35
- data/spec/lib/hamster/deque/empty_spec.rb +0 -40
- data/spec/lib/hamster/deque/first_spec.rb +0 -18
- data/spec/lib/hamster/deque/inspect_spec.rb +0 -24
- data/spec/lib/hamster/deque/last_spec.rb +0 -18
- data/spec/lib/hamster/deque/marshal_spec.rb +0 -34
- data/spec/lib/hamster/deque/new_spec.rb +0 -44
- data/spec/lib/hamster/deque/pop_spec.rb +0 -33
- data/spec/lib/hamster/deque/pretty_print_spec.rb +0 -24
- data/spec/lib/hamster/deque/random_modification_spec.rb +0 -34
- data/spec/lib/hamster/deque/to_a_spec.rb +0 -27
- data/spec/lib/hamster/deque/to_list_spec.rb +0 -26
- data/spec/lib/hamster/deque/unshift_spec.rb +0 -26
- data/spec/lib/hamster/experimental/mutable_set/add_qm_spec.rb +0 -39
- data/spec/lib/hamster/experimental/mutable_set/add_spec.rb +0 -37
- data/spec/lib/hamster/experimental/mutable_set/delete_qm_spec.rb +0 -38
- data/spec/lib/hamster/experimental/mutable_set/delete_spec.rb +0 -37
- data/spec/lib/hamster/hash/all_spec.rb +0 -54
- data/spec/lib/hamster/hash/any_spec.rb +0 -54
- data/spec/lib/hamster/hash/assoc_spec.rb +0 -52
- data/spec/lib/hamster/hash/clear_spec.rb +0 -43
- data/spec/lib/hamster/hash/construction_spec.rb +0 -39
- data/spec/lib/hamster/hash/default_proc_spec.rb +0 -73
- data/spec/lib/hamster/hash/delete_spec.rb +0 -40
- data/spec/lib/hamster/hash/each_spec.rb +0 -78
- data/spec/lib/hamster/hash/each_with_index_spec.rb +0 -30
- data/spec/lib/hamster/hash/empty_spec.rb +0 -44
- data/spec/lib/hamster/hash/eql_spec.rb +0 -70
- data/spec/lib/hamster/hash/except_spec.rb +0 -43
- data/spec/lib/hamster/hash/fetch_spec.rb +0 -58
- data/spec/lib/hamster/hash/find_spec.rb +0 -44
- data/spec/lib/hamster/hash/flat_map_spec.rb +0 -36
- data/spec/lib/hamster/hash/flatten_spec.rb +0 -99
- data/spec/lib/hamster/hash/get_spec.rb +0 -80
- data/spec/lib/hamster/hash/has_key_spec.rb +0 -32
- data/spec/lib/hamster/hash/has_value_spec.rb +0 -28
- data/spec/lib/hamster/hash/hash_spec.rb +0 -30
- data/spec/lib/hamster/hash/inspect_spec.rb +0 -31
- data/spec/lib/hamster/hash/invert_spec.rb +0 -31
- data/spec/lib/hamster/hash/key_spec.rb +0 -28
- data/spec/lib/hamster/hash/keys_spec.rb +0 -17
- data/spec/lib/hamster/hash/map_spec.rb +0 -46
- data/spec/lib/hamster/hash/merge_spec.rb +0 -83
- data/spec/lib/hamster/hash/min_max_spec.rb +0 -46
- data/spec/lib/hamster/hash/new_spec.rb +0 -71
- data/spec/lib/hamster/hash/partition_spec.rb +0 -36
- data/spec/lib/hamster/hash/pretty_print_spec.rb +0 -35
- data/spec/lib/hamster/hash/put_spec.rb +0 -103
- data/spec/lib/hamster/hash/reduce_spec.rb +0 -36
- data/spec/lib/hamster/hash/reject_spec.rb +0 -62
- data/spec/lib/hamster/hash/reverse_each_spec.rb +0 -28
- data/spec/lib/hamster/hash/sample_spec.rb +0 -14
- data/spec/lib/hamster/hash/select_spec.rb +0 -58
- data/spec/lib/hamster/hash/slice_spec.rb +0 -45
- data/spec/lib/hamster/hash/sort_spec.rb +0 -27
- data/spec/lib/hamster/hash/store_spec.rb +0 -76
- data/spec/lib/hamster/hash/take_spec.rb +0 -36
- data/spec/lib/hamster/hash/to_a_spec.rb +0 -14
- data/spec/lib/hamster/hash/to_hash_spec.rb +0 -22
- data/spec/lib/hamster/hash/update_in_spec.rb +0 -80
- data/spec/lib/hamster/hash/values_at_spec.rb +0 -14
- data/spec/lib/hamster/hash/values_spec.rb +0 -25
- data/spec/lib/hamster/list/add_spec.rb +0 -26
- data/spec/lib/hamster/list/all_spec.rb +0 -58
- data/spec/lib/hamster/list/any_spec.rb +0 -50
- data/spec/lib/hamster/list/at_spec.rb +0 -30
- data/spec/lib/hamster/list/break_spec.rb +0 -70
- data/spec/lib/hamster/list/combination_spec.rb +0 -34
- data/spec/lib/hamster/list/compare_spec.rb +0 -31
- data/spec/lib/hamster/list/cons_spec.rb +0 -26
- data/spec/lib/hamster/list/construction_spec.rb +0 -111
- data/spec/lib/hamster/list/count_spec.rb +0 -37
- data/spec/lib/hamster/list/cycle_spec.rb +0 -29
- data/spec/lib/hamster/list/delete_at_spec.rb +0 -19
- data/spec/lib/hamster/list/delete_spec.rb +0 -17
- data/spec/lib/hamster/list/drop_while_spec.rb +0 -39
- data/spec/lib/hamster/list/each_slice_spec.rb +0 -52
- data/spec/lib/hamster/list/each_spec.rb +0 -41
- data/spec/lib/hamster/list/each_with_index_spec.rb +0 -29
- data/spec/lib/hamster/list/empty_spec.rb +0 -24
- data/spec/lib/hamster/list/eql_spec.rb +0 -62
- data/spec/lib/hamster/list/fill_spec.rb +0 -50
- data/spec/lib/hamster/list/index_spec.rb +0 -34
- data/spec/lib/hamster/list/indices_spec.rb +0 -62
- data/spec/lib/hamster/list/inits_spec.rb +0 -29
- data/spec/lib/hamster/list/insert_spec.rb +0 -47
- data/spec/lib/hamster/list/inspect_spec.rb +0 -30
- data/spec/lib/hamster/list/join_spec.rb +0 -64
- data/spec/lib/hamster/list/last_spec.rb +0 -24
- data/spec/lib/hamster/list/ltlt_spec.rb +0 -20
- data/spec/lib/hamster/list/maximum_spec.rb +0 -40
- data/spec/lib/hamster/list/minimum_spec.rb +0 -40
- data/spec/lib/hamster/list/multithreading_spec.rb +0 -48
- data/spec/lib/hamster/list/partition_spec.rb +0 -116
- data/spec/lib/hamster/list/permutation_spec.rb +0 -56
- data/spec/lib/hamster/list/product_spec.rb +0 -24
- data/spec/lib/hamster/list/reduce_spec.rb +0 -54
- data/spec/lib/hamster/list/rotate_spec.rb +0 -37
- data/spec/lib/hamster/list/sample_spec.rb +0 -14
- data/spec/lib/hamster/list/slice_spec.rb +0 -230
- data/spec/lib/hamster/list/span_spec.rb +0 -77
- data/spec/lib/hamster/list/subsequences_spec.rb +0 -24
- data/spec/lib/hamster/list/sum_spec.rb +0 -24
- data/spec/lib/hamster/list/tail_spec.rb +0 -31
- data/spec/lib/hamster/list/tails_spec.rb +0 -29
- data/spec/lib/hamster/list/to_a_spec.rb +0 -40
- data/spec/lib/hamster/list/to_set_spec.rb +0 -19
- data/spec/lib/hamster/list/transpose_spec.rb +0 -20
- data/spec/lib/hamster/list/uniq_spec.rb +0 -30
- data/spec/lib/hamster/nested/construction_spec.rb +0 -44
- data/spec/lib/hamster/set/add_spec.rb +0 -76
- data/spec/lib/hamster/set/all_spec.rb +0 -52
- data/spec/lib/hamster/set/any_spec.rb +0 -52
- data/spec/lib/hamster/set/clear_spec.rb +0 -34
- data/spec/lib/hamster/set/delete_spec.rb +0 -72
- data/spec/lib/hamster/set/difference_spec.rb +0 -50
- data/spec/lib/hamster/set/disjoint_spec.rb +0 -26
- data/spec/lib/hamster/set/each_spec.rb +0 -46
- data/spec/lib/hamster/set/empty_spec.rb +0 -45
- data/spec/lib/hamster/set/exclusion_spec.rb +0 -48
- data/spec/lib/hamster/set/first_spec.rb +0 -29
- data/spec/lib/hamster/set/flatten_spec.rb +0 -47
- data/spec/lib/hamster/set/group_by_spec.rb +0 -60
- data/spec/lib/hamster/set/hash_spec.rb +0 -23
- data/spec/lib/hamster/set/include_spec.rb +0 -61
- data/spec/lib/hamster/set/inspect_spec.rb +0 -48
- data/spec/lib/hamster/set/intersect_spec.rb +0 -26
- data/spec/lib/hamster/set/intersection_spec.rb +0 -53
- data/spec/lib/hamster/set/join_spec.rb +0 -65
- data/spec/lib/hamster/set/map_spec.rb +0 -60
- data/spec/lib/hamster/set/maximum_spec.rb +0 -37
- data/spec/lib/hamster/set/minimum_spec.rb +0 -37
- data/spec/lib/hamster/set/new_spec.rb +0 -54
- data/spec/lib/hamster/set/partition_spec.rb +0 -53
- data/spec/lib/hamster/set/reduce_spec.rb +0 -56
- data/spec/lib/hamster/set/reject_spec.rb +0 -51
- data/spec/lib/hamster/set/sample_spec.rb +0 -14
- data/spec/lib/hamster/set/select_spec.rb +0 -74
- data/spec/lib/hamster/set/subset_spec.rb +0 -52
- data/spec/lib/hamster/set/sum_spec.rb +0 -24
- data/spec/lib/hamster/set/superset_spec.rb +0 -52
- data/spec/lib/hamster/set/to_a_spec.rb +0 -31
- data/spec/lib/hamster/set/to_list_spec.rb +0 -37
- data/spec/lib/hamster/set/union_spec.rb +0 -64
- data/spec/lib/hamster/sorted_set/above_spec.rb +0 -52
- data/spec/lib/hamster/sorted_set/add_spec.rb +0 -63
- data/spec/lib/hamster/sorted_set/at_spec.rb +0 -25
- data/spec/lib/hamster/sorted_set/below_spec.rb +0 -52
- data/spec/lib/hamster/sorted_set/between_spec.rb +0 -52
- data/spec/lib/hamster/sorted_set/clear_spec.rb +0 -44
- data/spec/lib/hamster/sorted_set/construction_spec.rb +0 -29
- data/spec/lib/hamster/sorted_set/delete_at_spec.rb +0 -19
- data/spec/lib/hamster/sorted_set/delete_spec.rb +0 -90
- data/spec/lib/hamster/sorted_set/disjoint_spec.rb +0 -26
- data/spec/lib/hamster/sorted_set/drop_spec.rb +0 -56
- data/spec/lib/hamster/sorted_set/drop_while_spec.rb +0 -35
- data/spec/lib/hamster/sorted_set/each_spec.rb +0 -29
- data/spec/lib/hamster/sorted_set/empty_spec.rb +0 -35
- data/spec/lib/hamster/sorted_set/eql_spec.rb +0 -121
- data/spec/lib/hamster/sorted_set/fetch_spec.rb +0 -65
- data/spec/lib/hamster/sorted_set/find_index_spec.rb +0 -41
- data/spec/lib/hamster/sorted_set/first_spec.rb +0 -19
- data/spec/lib/hamster/sorted_set/from_spec.rb +0 -52
- data/spec/lib/hamster/sorted_set/group_by_spec.rb +0 -58
- data/spec/lib/hamster/sorted_set/include_spec.rb +0 -24
- data/spec/lib/hamster/sorted_set/inspect_spec.rb +0 -38
- data/spec/lib/hamster/sorted_set/intersect_spec.rb +0 -26
- data/spec/lib/hamster/sorted_set/intersection_spec.rb +0 -29
- data/spec/lib/hamster/sorted_set/last_spec.rb +0 -37
- data/spec/lib/hamster/sorted_set/map_spec.rb +0 -36
- data/spec/lib/hamster/sorted_set/marshal_spec.rb +0 -37
- data/spec/lib/hamster/sorted_set/maximum_spec.rb +0 -37
- data/spec/lib/hamster/sorted_set/minimum_spec.rb +0 -20
- data/spec/lib/hamster/sorted_set/new_spec.rb +0 -52
- data/spec/lib/hamster/sorted_set/reverse_each_spec.rb +0 -29
- data/spec/lib/hamster/sorted_set/sample_spec.rb +0 -14
- data/spec/lib/hamster/sorted_set/select_spec.rb +0 -62
- data/spec/lib/hamster/sorted_set/size_spec.rb +0 -18
- data/spec/lib/hamster/sorted_set/slice_spec.rb +0 -257
- data/spec/lib/hamster/sorted_set/sorting_spec.rb +0 -45
- data/spec/lib/hamster/sorted_set/subset_spec.rb +0 -48
- data/spec/lib/hamster/sorted_set/superset_spec.rb +0 -48
- data/spec/lib/hamster/sorted_set/take_spec.rb +0 -55
- data/spec/lib/hamster/sorted_set/take_while_spec.rb +0 -34
- data/spec/lib/hamster/sorted_set/to_set_spec.rb +0 -19
- data/spec/lib/hamster/sorted_set/union_spec.rb +0 -28
- data/spec/lib/hamster/sorted_set/up_to_spec.rb +0 -52
- data/spec/lib/hamster/sorted_set/values_at_spec.rb +0 -34
- data/spec/lib/hamster/vector/add_spec.rb +0 -68
- data/spec/lib/hamster/vector/assoc_spec.rb +0 -36
- data/spec/lib/hamster/vector/bsearch_spec.rb +0 -58
- data/spec/lib/hamster/vector/clear_spec.rb +0 -34
- data/spec/lib/hamster/vector/combination_spec.rb +0 -82
- data/spec/lib/hamster/vector/compact_spec.rb +0 -30
- data/spec/lib/hamster/vector/compare_spec.rb +0 -32
- data/spec/lib/hamster/vector/concat_spec.rb +0 -35
- data/spec/lib/hamster/vector/count_spec.rb +0 -18
- data/spec/lib/hamster/vector/delete_at_spec.rb +0 -54
- data/spec/lib/hamster/vector/delete_spec.rb +0 -31
- data/spec/lib/hamster/vector/drop_spec.rb +0 -42
- data/spec/lib/hamster/vector/drop_while_spec.rb +0 -55
- data/spec/lib/hamster/vector/each_index_spec.rb +0 -41
- data/spec/lib/hamster/vector/each_spec.rb +0 -45
- data/spec/lib/hamster/vector/each_with_index_spec.rb +0 -40
- data/spec/lib/hamster/vector/empty_spec.rb +0 -42
- data/spec/lib/hamster/vector/eql_spec.rb +0 -77
- data/spec/lib/hamster/vector/fetch_spec.rb +0 -65
- data/spec/lib/hamster/vector/fill_spec.rb +0 -89
- data/spec/lib/hamster/vector/first_spec.rb +0 -19
- data/spec/lib/hamster/vector/flat_map_spec.rb +0 -51
- data/spec/lib/hamster/vector/flatten_spec.rb +0 -44
- data/spec/lib/hamster/vector/get_spec.rb +0 -75
- data/spec/lib/hamster/vector/group_by_spec.rb +0 -58
- data/spec/lib/hamster/vector/insert_spec.rb +0 -69
- data/spec/lib/hamster/vector/inspect_spec.rb +0 -50
- data/spec/lib/hamster/vector/map_spec.rb +0 -52
- data/spec/lib/hamster/vector/marshal_spec.rb +0 -32
- data/spec/lib/hamster/vector/maximum_spec.rb +0 -34
- data/spec/lib/hamster/vector/minimum_spec.rb +0 -34
- data/spec/lib/hamster/vector/multiply_spec.rb +0 -48
- data/spec/lib/hamster/vector/new_spec.rb +0 -51
- data/spec/lib/hamster/vector/partition_spec.rb +0 -53
- data/spec/lib/hamster/vector/permutation_spec.rb +0 -92
- data/spec/lib/hamster/vector/pop_spec.rb +0 -27
- data/spec/lib/hamster/vector/product_spec.rb +0 -71
- data/spec/lib/hamster/vector/reject_spec.rb +0 -44
- data/spec/lib/hamster/vector/repeated_combination_spec.rb +0 -78
- data/spec/lib/hamster/vector/repeated_permutation_spec.rb +0 -94
- data/spec/lib/hamster/vector/reverse_each_spec.rb +0 -32
- data/spec/lib/hamster/vector/reverse_spec.rb +0 -22
- data/spec/lib/hamster/vector/rindex_spec.rb +0 -37
- data/spec/lib/hamster/vector/rotate_spec.rb +0 -74
- data/spec/lib/hamster/vector/sample_spec.rb +0 -14
- data/spec/lib/hamster/vector/select_spec.rb +0 -64
- data/spec/lib/hamster/vector/set_spec.rb +0 -175
- data/spec/lib/hamster/vector/shift_spec.rb +0 -28
- data/spec/lib/hamster/vector/shuffle_spec.rb +0 -44
- data/spec/lib/hamster/vector/slice_spec.rb +0 -241
- data/spec/lib/hamster/vector/sorting_spec.rb +0 -57
- data/spec/lib/hamster/vector/take_spec.rb +0 -43
- data/spec/lib/hamster/vector/take_while_spec.rb +0 -35
- data/spec/lib/hamster/vector/to_set_spec.rb +0 -23
- data/spec/lib/hamster/vector/transpose_spec.rb +0 -49
- data/spec/lib/hamster/vector/uniq_spec.rb +0 -56
- data/spec/lib/hamster/vector/unshift_spec.rb +0 -29
- data/spec/lib/hamster/vector/update_in_spec.rb +0 -83
- data/spec/lib/hamster/vector/values_at_spec.rb +0 -34
- data/spec/lib/hamster/vector/zip_spec.rb +0 -58
data/lib/hamster/mutable_hash.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "forwardable"
|
1
2
|
require "hamster/hash"
|
2
3
|
require "hamster/read_copy_update"
|
3
4
|
|
@@ -7,6 +8,7 @@ module Hamster
|
|
7
8
|
end
|
8
9
|
|
9
10
|
class MutableHash
|
11
|
+
extend Forwardable
|
10
12
|
include ReadCopyUpdate
|
11
13
|
|
12
14
|
def put(key, value = Undefined, &block)
|
@@ -17,7 +19,7 @@ module Hamster
|
|
17
19
|
put(key, value)
|
18
20
|
value
|
19
21
|
end
|
20
|
-
|
22
|
+
def_delegator :self, :store, :[]=
|
21
23
|
|
22
24
|
def delete(key)
|
23
25
|
old_value = nil
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require "forwardable"
|
2
|
+
require "hamster/immutable"
|
3
|
+
require "hamster/list"
|
4
|
+
|
5
|
+
module Hamster
|
6
|
+
def self.queue(*items)
|
7
|
+
items.reduce(EmptyQueue) { |queue, item| queue.enqueue(item) }
|
8
|
+
end
|
9
|
+
|
10
|
+
class Queue
|
11
|
+
extend Forwardable
|
12
|
+
include Immutable
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@front = @rear = EmptyList
|
16
|
+
end
|
17
|
+
|
18
|
+
def empty?
|
19
|
+
@front.empty? && @rear.empty?
|
20
|
+
end
|
21
|
+
def_delegator :self, :empty?, :null?
|
22
|
+
|
23
|
+
def size
|
24
|
+
@front.size + @rear.size
|
25
|
+
end
|
26
|
+
def_delegator :self, :size, :length
|
27
|
+
|
28
|
+
def head
|
29
|
+
return @front.head unless @front.empty?
|
30
|
+
@rear.last
|
31
|
+
end
|
32
|
+
def_delegator :self, :head, :first
|
33
|
+
def_delegator :self, :head, :peek
|
34
|
+
def_delegator :self, :head, :front
|
35
|
+
|
36
|
+
def enqueue(item)
|
37
|
+
transform { @rear = @rear.cons(item) }
|
38
|
+
end
|
39
|
+
def_delegator :self, :enqueue, :<<
|
40
|
+
def_delegator :self, :enqueue, :add
|
41
|
+
|
42
|
+
def dequeue
|
43
|
+
front = @front
|
44
|
+
rear = @rear
|
45
|
+
if front.empty?
|
46
|
+
return EmptyQueue if rear.empty?
|
47
|
+
front = rear.reverse
|
48
|
+
rear = EmptyList
|
49
|
+
end
|
50
|
+
|
51
|
+
transform do
|
52
|
+
@front = front.tail
|
53
|
+
@rear = rear
|
54
|
+
end
|
55
|
+
end
|
56
|
+
def_delegator :self, :dequeue, :tail
|
57
|
+
|
58
|
+
def clear
|
59
|
+
EmptyQueue
|
60
|
+
end
|
61
|
+
|
62
|
+
def eql?(other)
|
63
|
+
instance_of?(other.class) &&
|
64
|
+
to_list.eql?(other.to_list)
|
65
|
+
end
|
66
|
+
def_delegator :self, :eql?, :==
|
67
|
+
|
68
|
+
def to_a
|
69
|
+
to_list.to_a
|
70
|
+
end
|
71
|
+
def_delegator :self, :to_a, :entries
|
72
|
+
|
73
|
+
def to_ary
|
74
|
+
to_list.to_ary
|
75
|
+
end
|
76
|
+
|
77
|
+
def to_list
|
78
|
+
@front.append(@rear.reverse)
|
79
|
+
end
|
80
|
+
|
81
|
+
def inspect
|
82
|
+
to_list.inspect
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
EmptyQueue = Hamster::Queue.new
|
87
|
+
end
|
@@ -2,7 +2,6 @@ require "forwardable"
|
|
2
2
|
require "thread"
|
3
3
|
|
4
4
|
module Hamster
|
5
|
-
# @private
|
6
5
|
module ReadCopyUpdate
|
7
6
|
extend Forwardable
|
8
7
|
|
@@ -14,7 +13,7 @@ module Hamster
|
|
14
13
|
def eql?(other)
|
15
14
|
instance_of?(other.class) && @content.eql?(other.instance_variable_get(:@content))
|
16
15
|
end
|
17
|
-
|
16
|
+
def_delegator :self, :eql?, :==
|
18
17
|
|
19
18
|
def_delegator :@content, :inspect
|
20
19
|
def_delegator :@content, :to_s
|
data/lib/hamster/set.rb
CHANGED
@@ -1,572 +1,167 @@
|
|
1
|
+
require "forwardable"
|
1
2
|
require "hamster/immutable"
|
2
3
|
require "hamster/undefined"
|
3
4
|
require "hamster/enumerable"
|
4
|
-
require "hamster/
|
5
|
+
require "hamster/sorter"
|
5
6
|
require "hamster/trie"
|
6
|
-
require "hamster/
|
7
|
-
require "set"
|
7
|
+
require "hamster/list"
|
8
8
|
|
9
9
|
module Hamster
|
10
10
|
def self.set(*items)
|
11
|
-
items.
|
11
|
+
items.reduce(EmptySet) { |set, item| set.add(item) }
|
12
12
|
end
|
13
13
|
|
14
|
-
# `Hamster::Set` is a collection of unordered values with no duplicates. Testing whether
|
15
|
-
# an object is present in the `Set` is fast. `Set` is also `Enumerable`, so you can
|
16
|
-
# iterate over the members of the set with {#each}, transform them with {#map}, filter
|
17
|
-
# them with {#select}, and so on. Some of the `Enumerable` methods are overridden to
|
18
|
-
# return Hamster collections.
|
19
|
-
#
|
20
|
-
# Like the `Set` class in Ruby's standard library, which we will call RubySet,
|
21
|
-
# `Hamster::Set` defines equivalency of objects using `#hash` and `#eql?`. No two
|
22
|
-
# objects with the same `#hash` code, and which are also `#eql?`, can coexist in the
|
23
|
-
# same `Set`. If one is already in the `Set`, attempts to add another one will have
|
24
|
-
# no effect.
|
25
|
-
#
|
26
|
-
# `Set`s have no natural ordering and cannot be compared using `#<=>`. However, they
|
27
|
-
# define {#<}, {#>}, {#<=}, and {#>=} as shorthand for {#proper_subset?},
|
28
|
-
# {#proper_superset?}, {#subset?}, and {#superset?} (respectively).
|
29
|
-
#
|
30
|
-
# The basic set-theoretic operations {#union}, {#intersection}, {#difference}, and
|
31
|
-
# {#exclusion} work with any `Enumerable` object. They may be more efficient when used
|
32
|
-
# with another `Hamster::Set`, or a RubySet.
|
33
|
-
#
|
34
|
-
# A `Set` can be created in any of the following ways:
|
35
|
-
#
|
36
|
-
# Hamster.set('Tom', 'Dick', 'Harry')
|
37
|
-
# Hamster::Set.new([1, 2, 3]) # any Enumerable can be used to initialize
|
38
|
-
# Hamster::Set['A', 'B', 'C', 'D']
|
39
|
-
#
|
40
|
-
# The latter 2 forms of initialization can be used with your own, custom subclasses
|
41
|
-
# of `Hamster::Set`.
|
42
|
-
#
|
43
|
-
# Unlike RubySet, all methods which you might expect to "modify" a `Hamster::Set`
|
44
|
-
# actually return a new set and leave the existing one unchanged.
|
45
|
-
#
|
46
|
-
# @example
|
47
|
-
# require 'hamster/set'
|
48
|
-
# set1 = Hamster.set(1, 2) # => Hamster::Set[1, 2]
|
49
|
-
# set2 = Hamster::Set[1, 2] # => Hamster::Set[1, 2]
|
50
|
-
# set1 == set2 # => true
|
51
|
-
# set3 = set1.add("foo") # => Hamster::Set[1, 2, "foo"]
|
52
|
-
# set3 - set2 # => Hamster::Set["foo"]
|
53
|
-
# set3.subset?(set1) # => false
|
54
|
-
# set1.subset?(set3) # => true
|
55
|
-
#
|
56
14
|
class Set
|
15
|
+
extend Forwardable
|
57
16
|
include Immutable
|
58
17
|
include Enumerable
|
59
18
|
|
60
|
-
|
61
|
-
|
62
|
-
# @return [Set]
|
63
|
-
def [](*items)
|
64
|
-
new(items)
|
65
|
-
end
|
66
|
-
|
67
|
-
# Return an empty `Set`. If used on a subclass, returns an empty instance
|
68
|
-
# of that class.
|
69
|
-
#
|
70
|
-
# @return [Set]
|
71
|
-
def empty
|
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) }
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def initialize(items=[])
|
86
|
-
@trie = Trie.new(0)
|
87
|
-
items.each { |item| @trie.put!(item, nil) }
|
19
|
+
def initialize(trie = EmptyTrie)
|
20
|
+
@trie = trie
|
88
21
|
end
|
89
22
|
|
90
|
-
# Return `true` if this `Set` contains no items.
|
91
|
-
# @return [Boolean]
|
92
23
|
def empty?
|
93
24
|
@trie.empty?
|
94
25
|
end
|
26
|
+
def_delegator :self, :empty?, :null?
|
95
27
|
|
96
|
-
# Return the number of items in this `Set`.
|
97
|
-
# @return [Integer]
|
98
28
|
def size
|
99
29
|
@trie.size
|
100
30
|
end
|
101
|
-
|
31
|
+
def_delegator :self, :size, :length
|
102
32
|
|
103
|
-
# Return a new `Set` with `item` added. If `item` is already in the set,
|
104
|
-
# return `self`.
|
105
|
-
#
|
106
|
-
# @example
|
107
|
-
# Hamster::Set[1, 2, 3].add(4) # => Hamster::Set[1, 2, 4, 3]
|
108
|
-
# Hamster::Set[1, 2, 3].add(2) # => Hamster::Set[1, 2, 3]
|
109
|
-
#
|
110
|
-
# @param item [Object] The object to add
|
111
|
-
# @return [Set]
|
112
33
|
def add(item)
|
113
|
-
include?(item)
|
114
|
-
end
|
115
|
-
alias :<< :add
|
116
|
-
|
117
|
-
# If `item` is not a member of this `Set`, return a new `Set` with `item` added.
|
118
|
-
# Otherwise, return `false`.
|
119
|
-
#
|
120
|
-
# @example
|
121
|
-
# Hamster::Set[1, 2, 3].add?(4) # => Hamster::Set[1, 2, 4, 3]
|
122
|
-
# Hamster::Set[1, 2, 3].add?(2) # => false
|
123
|
-
#
|
124
|
-
# @param item [Object] The object to add
|
125
|
-
# @return [Set, false]
|
126
|
-
def add?(item)
|
127
|
-
!include?(item) && add(item)
|
34
|
+
transform_unless(include?(item)) { @trie = @trie.put(item, nil) }
|
128
35
|
end
|
36
|
+
def_delegator :self, :add, :<<
|
129
37
|
|
130
|
-
# Return a new `Set` with `item` removed. If `item` is not a member of the set,
|
131
|
-
# return `self`.
|
132
|
-
#
|
133
|
-
# @example
|
134
|
-
# Hamster::Set[1, 2, 3].delete(1) # => Hamster::Set[2, 3]
|
135
|
-
# Hamster::Set[1, 2, 3].delete(99) # => Hamster::Set[1, 2, 3]
|
136
|
-
#
|
137
|
-
# @param item [Object] The object to remove
|
138
|
-
# @return [Set]
|
139
38
|
def delete(item)
|
140
39
|
trie = @trie.delete(item)
|
141
|
-
|
40
|
+
transform_unless(trie.equal?(@trie)) { @trie = trie }
|
142
41
|
end
|
143
42
|
|
144
|
-
# If `item` is a member of this `Set`, return a new `Set` with `item` removed.
|
145
|
-
# Otherwise, return `false`.
|
146
|
-
#
|
147
|
-
# @example
|
148
|
-
# Hamster::Set[1, 2, 3].delete?(1) # => Hamster::Set[2, 3]
|
149
|
-
# Hamster::Set[1, 2, 3].delete?(99) # => false
|
150
|
-
#
|
151
|
-
# @param item [Object] The object to remove
|
152
|
-
# @return [Set, false]
|
153
|
-
def delete?(item)
|
154
|
-
include?(item) && delete(item)
|
155
|
-
end
|
156
|
-
|
157
|
-
# Call the block once for each item in this `Set`. No specific iteration order
|
158
|
-
# is guaranteed (but the order will be stable for any particular `Set`.)
|
159
|
-
#
|
160
|
-
# @example
|
161
|
-
# Hamster::Set["Dog", "Elephant", "Lion"].each { |e| puts e }
|
162
|
-
# Elephant
|
163
|
-
# Dog
|
164
|
-
# Lion
|
165
|
-
# # => Hamster::Set["Dog", "Elephant", "Lion"]
|
166
|
-
#
|
167
|
-
# @return [self]
|
168
43
|
def each
|
169
|
-
return
|
170
|
-
@trie.each { |
|
171
|
-
self
|
44
|
+
return self unless block_given?
|
45
|
+
@trie.each { |entry| yield(entry.key) }
|
172
46
|
end
|
173
47
|
|
174
|
-
# Call the block once for each item in this `Set`. Iteration order will be
|
175
|
-
# the opposite of {#each}.
|
176
|
-
#
|
177
|
-
# @example
|
178
|
-
# Hamster::Set["Dog", "Elephant", "Lion"].reverse_each { |e| puts e }
|
179
|
-
# Lion
|
180
|
-
# Dog
|
181
|
-
# Elephant
|
182
|
-
# # => Hamster::Set["Dog", "Elephant", "Lion"]
|
183
|
-
#
|
184
|
-
# @return [self]
|
185
|
-
def reverse_each
|
186
|
-
return enum_for(:reverse_each) if not block_given?
|
187
|
-
@trie.reverse_each { |key, _| yield(key) }
|
188
|
-
self
|
189
|
-
end
|
190
|
-
|
191
|
-
# Return a new `Set` with all the items for which the block returns true.
|
192
|
-
#
|
193
|
-
# @example
|
194
|
-
# Hamster::Set["Elephant", "Dog", "Lion"].select { |e| e.size >= 4 }
|
195
|
-
# # => Hamster::Set["Elephant", "Lion"]
|
196
|
-
#
|
197
|
-
# @return [Set]
|
198
|
-
def select
|
199
|
-
return enum_for(:select) unless block_given?
|
200
|
-
trie = @trie.select { |key, _| yield(key) }
|
201
|
-
new_trie(trie)
|
202
|
-
end
|
203
|
-
alias :find_all :select
|
204
|
-
alias :keep_if :select
|
205
|
-
|
206
|
-
# Call the block once for each item in this `Set`.
|
207
|
-
# All the values returned from the block will be gathered into a new `Set`.
|
208
|
-
#
|
209
|
-
# @example
|
210
|
-
# Hamster::Set["Cat", "Elephant", "Dog", "Lion"].map { |e| e.size }
|
211
|
-
# # => Hamster::Set[8, 4, 3]
|
212
|
-
#
|
213
|
-
# @return [Set]
|
214
48
|
def map
|
215
|
-
return
|
49
|
+
return self unless block_given?
|
216
50
|
return self if empty?
|
217
|
-
|
51
|
+
transform { @trie = @trie.reduce(EmptyTrie) { |trie, entry| trie.put(yield(entry.key), nil) } }
|
52
|
+
end
|
53
|
+
def_delegator :self, :map, :collect
|
54
|
+
|
55
|
+
def filter
|
56
|
+
return self unless block_given?
|
57
|
+
trie = @trie.filter { |entry| yield(entry.key) }
|
58
|
+
return EmptySet if trie.empty?
|
59
|
+
transform_unless(trie.equal?(@trie)) { @trie = trie }
|
218
60
|
end
|
219
|
-
alias :collect :map
|
220
61
|
|
221
|
-
# Return `true` if the given item is present in this `Set`. More precisely,
|
222
|
-
# return `true` if an object with the same `#hash` code, and which is also `#eql?`
|
223
|
-
# to the given object is present.
|
224
|
-
#
|
225
|
-
# @example
|
226
|
-
# Hamster::Set["A", "B", "C"].include?("B") # => true
|
227
|
-
# Hamster::Set["A", "B", "C"].include?("Z") # => false
|
228
|
-
#
|
229
|
-
# @param object [Object] The object to check for
|
230
|
-
# @return [Boolean]
|
231
62
|
def include?(object)
|
232
|
-
|
63
|
+
any? { |item| item.eql?(object) }
|
233
64
|
end
|
234
|
-
alias :member? :include?
|
235
65
|
|
236
|
-
|
237
|
-
|
238
|
-
#
|
239
|
-
# @example
|
240
|
-
# Hamster::Set["A", "B", "C"].first # => "C"
|
241
|
-
#
|
242
|
-
# @return [Object]
|
243
|
-
def first
|
244
|
-
(entry = @trie.at(0)) && entry[0]
|
66
|
+
def head
|
67
|
+
find { true }
|
245
68
|
end
|
69
|
+
def_delegator :self, :head, :first
|
246
70
|
|
247
|
-
# Return a {SortedSet} which contains the same items as this `Set`, ordered by
|
248
|
-
# the given comparator block. The comparator block should take 2 parameters and
|
249
|
-
# return 0, 1, or -1 depending on whether the first parameter is equal, greater than,
|
250
|
-
# or less than the second.
|
251
|
-
#
|
252
|
-
# @example
|
253
|
-
# Hamster::Set["Elephant", "Dog", "Lion"].sort
|
254
|
-
# # => Hamster::SortedSet["Dog", "Elephant", "Lion"]
|
255
|
-
# Hamster::Set["Elephant", "Dog", "Lion"].sort { |a,b| a.size <=> b.size }
|
256
|
-
# # => Hamster::SortedSet["Dog", "Lion", "Elephant"]
|
257
|
-
#
|
258
|
-
# @yield [a, b] A pair of items to be compared
|
259
|
-
# @yieldreturn [Integer]
|
260
|
-
# @return [SortedSet]
|
261
71
|
def sort(&comparator)
|
262
|
-
|
72
|
+
Stream.new { Sorter.new(self).sort(&comparator) }
|
263
73
|
end
|
264
74
|
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
#
|
273
|
-
# @yield [item] The item to obtain a sort key for
|
274
|
-
# @yieldreturn [Object]
|
275
|
-
# @return [SortedSet]
|
276
|
-
def sort_by(&mapper)
|
277
|
-
SortedSet.new(self.to_a, &mapper)
|
75
|
+
def sort_by(&transformer)
|
76
|
+
return sort unless block_given?
|
77
|
+
Stream.new { Sorter.new(self).sort_by(&transformer) }
|
78
|
+
end
|
79
|
+
|
80
|
+
def join(sep = nil)
|
81
|
+
to_a.join(sep)
|
278
82
|
end
|
279
83
|
|
280
|
-
# Return a new `Set` which contains all the members of both this `Set` and `other`.
|
281
|
-
# `other` can be any `Enumerable` object.
|
282
|
-
#
|
283
|
-
# @example
|
284
|
-
# Hamster::Set[1, 2] | Hamster::Set[2, 3] # => Hamster::Set[1, 2, 3]
|
285
|
-
#
|
286
|
-
# @param other [Enumerable] The collection to merge with
|
287
|
-
# @return [Set]
|
288
84
|
def union(other)
|
289
|
-
|
290
|
-
if
|
291
|
-
|
292
|
-
large_set_trie = other.instance_variable_get(:@trie)
|
293
|
-
else
|
294
|
-
small_set_pairs = other.instance_variable_get(:@trie)
|
295
|
-
large_set_trie = @trie
|
296
|
-
end
|
297
|
-
else
|
298
|
-
if other.respond_to?(:lazy)
|
299
|
-
small_set_pairs = other.lazy.map { |e| [e, nil] }
|
300
|
-
else
|
301
|
-
small_set_pairs = other.map { |e| [e, nil] }
|
302
|
-
end
|
303
|
-
large_set_trie = @trie
|
85
|
+
trie = other.reduce(@trie) do |a, element|
|
86
|
+
next a if a.key?(element)
|
87
|
+
a.put(element, nil)
|
304
88
|
end
|
305
|
-
|
306
|
-
trie = large_set_trie.bulk_put(small_set_pairs)
|
307
|
-
new_trie(trie)
|
89
|
+
transform_unless(trie.equal?(@trie)) { @trie = trie }
|
308
90
|
end
|
309
|
-
|
310
|
-
|
311
|
-
|
91
|
+
def_delegator :self, :union, :|
|
92
|
+
def_delegator :self, :union, :+
|
93
|
+
def_delegator :self, :union, :merge
|
312
94
|
|
313
|
-
# Return a new `Set` which contains all the items which are members of both
|
314
|
-
# this `Set` and `other`. `other` can be any `Enumerable` object.
|
315
|
-
#
|
316
|
-
# @example
|
317
|
-
# Hamster::Set[1, 2] & Hamster::Set[2, 3] # => Hamster::Set[2]
|
318
|
-
#
|
319
|
-
# @param other [Enumerable] The collection to intersect with
|
320
|
-
# @return [Set]
|
321
95
|
def intersection(other)
|
322
|
-
|
323
|
-
|
324
|
-
trie = other.instance_variable_get(:@trie).select { |key, _| include?(key) }
|
325
|
-
else
|
326
|
-
trie = Trie.new(0)
|
327
|
-
other.each { |obj| trie.put!(obj, nil) if include?(obj) }
|
328
|
-
end
|
329
|
-
else
|
330
|
-
trie = @trie.select { |key, _| other.include?(key) }
|
331
|
-
end
|
332
|
-
new_trie(trie)
|
96
|
+
trie = @trie.filter { |entry| other.include?(entry.key) }
|
97
|
+
transform_unless(trie.equal?(@trie)) { @trie = trie }
|
333
98
|
end
|
334
|
-
|
99
|
+
def_delegator :self, :intersection, :intersect
|
100
|
+
def_delegator :self, :intersection, :&
|
335
101
|
|
336
|
-
# Return a new `Set` with all the items in `other` removed. `other` can be
|
337
|
-
# any `Enumerable` object.
|
338
|
-
#
|
339
|
-
# @example
|
340
|
-
# Hamster::Set[1, 2] - Hamster::Set[2, 3] # => Hamster::Set[1]
|
341
|
-
#
|
342
|
-
# @param other [Enumerable] The collection to subtract from this set
|
343
|
-
# @return [Set]
|
344
102
|
def difference(other)
|
345
|
-
trie =
|
346
|
-
|
347
|
-
else
|
348
|
-
@trie.bulk_delete(other)
|
349
|
-
end
|
350
|
-
new_trie(trie)
|
103
|
+
trie = @trie.filter { |entry| !other.include?(entry.key) }
|
104
|
+
transform_unless(trie.equal?(@trie)) { @trie = trie }
|
351
105
|
end
|
352
|
-
|
353
|
-
|
106
|
+
def_delegator :self, :difference, :diff
|
107
|
+
def_delegator :self, :difference, :subtract
|
108
|
+
def_delegator :self, :difference, :-
|
354
109
|
|
355
|
-
# Return a new `Set` which contains all the items which are members of this
|
356
|
-
# `Set` or of `other`, but not both. `other` can be any `Enumerable` object.
|
357
|
-
#
|
358
|
-
# @example
|
359
|
-
# Hamster::Set[1, 2] ^ Hamster::Set[2, 3] # => Hamster::Set[1, 3]
|
360
|
-
#
|
361
|
-
# @param other [Enumerable] The collection to take the exclusive disjunction of
|
362
|
-
# @return [Set]
|
363
110
|
def exclusion(other)
|
364
111
|
((self | other) - (self & other))
|
365
112
|
end
|
366
|
-
|
113
|
+
def_delegator :self, :exclusion, :^
|
367
114
|
|
368
|
-
# Return `true` if all items in this `Set` are also in `other`.
|
369
|
-
#
|
370
|
-
# @example
|
371
|
-
# Hamster::Set[2, 3].subset?(Hamster::Set[1, 2, 3]) # => true
|
372
|
-
#
|
373
|
-
# @param other [Set]
|
374
|
-
# @return [Boolean]
|
375
115
|
def subset?(other)
|
376
|
-
return false if other.size < size
|
377
|
-
|
378
|
-
# This method has the potential to be very slow if 'other' is a large Array, so to avoid that,
|
379
|
-
# we convert those Arrays to Sets before checking presence of items
|
380
|
-
# Time to convert Array -> Set is linear in array.size
|
381
|
-
# Time to check for presence of all items in an Array is proportional to set.size * array.size
|
382
|
-
# Note that both sides of that equation have array.size -- hence those terms cancel out,
|
383
|
-
# and the break-even point is solely dependent on the size of this collection
|
384
|
-
# After doing some benchmarking to estimate the constants, it appears break-even is at ~190 items
|
385
|
-
# We also check other.size, to avoid the more expensive #is_a? checks in cases where it doesn't matter
|
386
|
-
#
|
387
|
-
if other.size >= 150 && @trie.size >= 190 && !(other.is_a?(Hamster::Set) || other.is_a?(::Set))
|
388
|
-
other = ::Set.new(other)
|
389
|
-
end
|
390
116
|
all? { |item| other.include?(item) }
|
391
117
|
end
|
392
|
-
alias :<= :subset?
|
393
118
|
|
394
|
-
# Return `true` if all items in `other` are also in this `Set`.
|
395
|
-
#
|
396
|
-
# @example
|
397
|
-
# Hamster::Set[1, 2, 3].superset?(Hamster::Set[2, 3]) # => true
|
398
|
-
#
|
399
|
-
# @param other [Set]
|
400
|
-
# @return [Boolean]
|
401
119
|
def superset?(other)
|
402
120
|
other.subset?(self)
|
403
121
|
end
|
404
|
-
alias :>= :superset?
|
405
|
-
|
406
|
-
# Returns `true` if `other` contains all the items in this `Set`, plus at least
|
407
|
-
# one item which is not in this set.
|
408
|
-
#
|
409
|
-
# @example
|
410
|
-
# Hamster::Set[2, 3].proper_subset?(Hamster::Set[1, 2, 3]) # => true
|
411
|
-
# Hamster::Set[1, 2, 3].proper_subset?(Hamster::Set[1, 2, 3]) # => false
|
412
|
-
#
|
413
|
-
# @param other [Set]
|
414
|
-
# @return [Boolean]
|
415
|
-
def proper_subset?(other)
|
416
|
-
return false if other.size <= size
|
417
|
-
# See comments above
|
418
|
-
if other.size >= 150 && @trie.size >= 190 && !(other.is_a?(Hamster::Set) || other.is_a?(::Set))
|
419
|
-
other = ::Set.new(other)
|
420
|
-
end
|
421
|
-
all? { |item| other.include?(item) }
|
422
|
-
end
|
423
|
-
alias :< :proper_subset?
|
424
|
-
|
425
|
-
# Returns `true` if this `Set` contains all the items in `other`, plus at least
|
426
|
-
# one item which is not in `other`.
|
427
|
-
#
|
428
|
-
# @example
|
429
|
-
# Hamster::Set[1, 2, 3].proper_superset?(Hamster::Set[2, 3]) # => true
|
430
|
-
# Hamster::Set[1, 2, 3].proper_superset?(Hamster::Set[1, 2, 3]) # => false
|
431
|
-
#
|
432
|
-
# @param other [Set]
|
433
|
-
# @return [Boolean]
|
434
|
-
def proper_superset?(other)
|
435
|
-
other.proper_subset?(self)
|
436
|
-
end
|
437
|
-
alias :> :proper_superset?
|
438
|
-
|
439
|
-
# Return `true` if this `Set` and `other` do not share any items.
|
440
|
-
#
|
441
|
-
# @example
|
442
|
-
# Hamster::Set[1, 2].disjoint?(Hamster::Set[8, 9]) # => true
|
443
|
-
#
|
444
|
-
# @param other [Set]
|
445
|
-
# @return [Boolean]
|
446
|
-
def disjoint?(other)
|
447
|
-
if other.size <= size
|
448
|
-
other.each { |item| return false if include?(item) }
|
449
|
-
else
|
450
|
-
# See comment on #subset?
|
451
|
-
if other.size >= 150 && @trie.size >= 190 && !(other.is_a?(Hamster::Set) || other.is_a?(::Set))
|
452
|
-
other = ::Set.new(other)
|
453
|
-
end
|
454
|
-
each { |item| return false if other.include?(item) }
|
455
|
-
end
|
456
|
-
true
|
457
|
-
end
|
458
|
-
|
459
|
-
# Return `true` if this `Set` and `other` have at least one item in common.
|
460
|
-
#
|
461
|
-
# @example
|
462
|
-
# Hamster::Set[1, 2].intersect?(Hamster::Set[2, 3]) # => true
|
463
|
-
#
|
464
|
-
# @param other [Set]
|
465
|
-
# @return [Boolean]
|
466
|
-
def intersect?(other)
|
467
|
-
!disjoint?(other)
|
468
|
-
end
|
469
122
|
|
470
|
-
# Recursively insert the contents of any nested `Set`s into this `Set`, and
|
471
|
-
# remove them.
|
472
|
-
#
|
473
|
-
# @example
|
474
|
-
# Hamster::Set[Hamster::Set[1, 2], Hamster::Set[3, 4]].flatten
|
475
|
-
# # => Hamster::Set[1, 2, 3, 4]
|
476
|
-
#
|
477
|
-
# @return [Set]
|
478
123
|
def flatten
|
479
|
-
reduce(
|
124
|
+
reduce(EmptySet) do |set, item|
|
480
125
|
next set.union(item.flatten) if item.is_a?(Set)
|
481
126
|
set.add(item)
|
482
127
|
end
|
483
128
|
end
|
484
129
|
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
# Hamster::Set[1, 2, 3, 4, 5].sample # => 3
|
492
|
-
#
|
493
|
-
# @return [Object]
|
494
|
-
def sample
|
495
|
-
empty? ? nil : @trie.at(rand(size))[0]
|
130
|
+
def group_by(&block)
|
131
|
+
return group_by { |item| item } unless block_given?
|
132
|
+
reduce(EmptyHash) do |hash, item|
|
133
|
+
key = yield(item)
|
134
|
+
hash.put(key, (hash.get(key) || EmptySet).add(item))
|
135
|
+
end
|
496
136
|
end
|
137
|
+
def_delegator :self, :group_by, :group
|
497
138
|
|
498
|
-
# Return an empty `Set` instance, of the same class as this one. Useful if you
|
499
|
-
# have multiple subclasses of `Set` and want to treat them polymorphically.
|
500
|
-
#
|
501
|
-
# @return [Hash]
|
502
139
|
def clear
|
503
|
-
|
140
|
+
EmptySet
|
504
141
|
end
|
505
142
|
|
506
|
-
# Return true if `other` has the same type and contents as this `Set`.
|
507
|
-
#
|
508
|
-
# @param other [Object] The object to compare with
|
509
|
-
# @return [Boolean]
|
510
143
|
def eql?(other)
|
511
|
-
|
512
|
-
return false if not instance_of?(other.class)
|
513
|
-
other_trie = other.instance_variable_get(:@trie)
|
514
|
-
return false if @trie.size != other_trie.size
|
515
|
-
@trie.each do |key, _|
|
516
|
-
return false if !other_trie.key?(key)
|
517
|
-
end
|
518
|
-
true
|
144
|
+
instance_of?(other.class) && @trie.eql?(other.instance_variable_get(:@trie))
|
519
145
|
end
|
520
|
-
|
146
|
+
def_delegator :self, :eql?, :==
|
521
147
|
|
522
|
-
# See `Object#hash`.
|
523
|
-
# @return [Integer]
|
524
148
|
def hash
|
525
149
|
reduce(0) { |hash, item| (hash << 5) - hash + item.hash }
|
526
150
|
end
|
527
151
|
|
528
|
-
|
529
|
-
|
152
|
+
def_delegator :self, :dup, :uniq
|
153
|
+
def_delegator :self, :dup, :nub
|
154
|
+
def_delegator :self, :dup, :to_set
|
155
|
+
def_delegator :self, :dup, :remove_duplicates
|
530
156
|
|
531
|
-
|
532
|
-
|
533
|
-
# @return [self]
|
534
|
-
def to_set
|
535
|
-
self
|
536
|
-
end
|
537
|
-
|
538
|
-
# @private
|
539
|
-
def marshal_dump
|
540
|
-
output = {}
|
541
|
-
each do |key|
|
542
|
-
output[key] = nil
|
543
|
-
end
|
544
|
-
output
|
157
|
+
def to_list
|
158
|
+
reduce(EmptyList) { |list, item| list.cons(item) }
|
545
159
|
end
|
546
160
|
|
547
|
-
|
548
|
-
|
549
|
-
@trie = dictionary.reduce(EmptyTrie) do |trie, key_value|
|
550
|
-
trie.put(key_value.first, nil)
|
551
|
-
end
|
552
|
-
end
|
553
|
-
|
554
|
-
private
|
555
|
-
|
556
|
-
def new_trie(trie)
|
557
|
-
if trie.empty?
|
558
|
-
self.class.empty
|
559
|
-
elsif trie.equal?(@trie)
|
560
|
-
self
|
561
|
-
else
|
562
|
-
self.class.alloc(trie)
|
563
|
-
end
|
161
|
+
def inspect
|
162
|
+
"{#{to_a.inspect[1..-2]}}"
|
564
163
|
end
|
565
164
|
end
|
566
165
|
|
567
|
-
|
568
|
-
# invoked with no arguments; also returned by `Set.empty`. Prefer using this
|
569
|
-
# one rather than creating many empty sets using `Set.new`.
|
570
|
-
#
|
571
|
-
EmptySet = Hamster::Set.empty
|
166
|
+
EmptySet = Hamster::Set.new
|
572
167
|
end
|