hamster 1.0.1.pre.rc3 → 2.0.0
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 -0
- data/lib/hamster/associable.rb +49 -0
- data/lib/hamster/core_ext/enumerable.rb +3 -13
- data/lib/hamster/core_ext/io.rb +1 -1
- data/lib/hamster/core_ext/struct.rb +9 -0
- data/lib/hamster/deque.rb +57 -38
- data/lib/hamster/enumerable.rb +14 -41
- data/lib/hamster/experimental/mutable_queue.rb +5 -8
- data/lib/hamster/experimental/mutable_set.rb +6 -7
- data/lib/hamster/hash.rb +301 -110
- data/lib/hamster/immutable.rb +1 -1
- data/lib/hamster/list.rb +479 -194
- data/lib/hamster/mutable_hash.rb +6 -7
- data/lib/hamster/nested.rb +78 -0
- data/lib/hamster/read_copy_update.rb +1 -1
- data/lib/hamster/set.rb +198 -88
- data/lib/hamster/sorted_set.rb +706 -261
- data/lib/hamster/trie.rb +134 -15
- data/lib/hamster/vector.rb +571 -140
- data/lib/hamster/version.rb +3 -1
- data/spec/lib/hamster/associable/associable_spec.rb +150 -0
- data/spec/lib/hamster/core_ext/array_spec.rb +1 -1
- data/spec/lib/hamster/core_ext/enumerable_spec.rb +2 -2
- data/spec/lib/hamster/core_ext/io_spec.rb +1 -1
- data/spec/lib/hamster/deque/clear_spec.rb +3 -3
- data/spec/lib/hamster/deque/construction_spec.rb +8 -8
- data/spec/lib/hamster/deque/copying_spec.rb +1 -1
- data/spec/lib/hamster/deque/dequeue_spec.rb +12 -4
- data/spec/lib/hamster/deque/empty_spec.rb +14 -16
- data/spec/lib/hamster/deque/enqueue_spec.rb +4 -4
- data/spec/lib/hamster/deque/first_spec.rb +18 -0
- data/spec/lib/hamster/deque/inspect_spec.rb +1 -1
- data/spec/lib/hamster/deque/last_spec.rb +9 -11
- data/spec/lib/hamster/deque/marshal_spec.rb +6 -6
- data/spec/lib/hamster/deque/new_spec.rb +5 -5
- data/spec/lib/hamster/deque/pop_spec.rb +15 -3
- data/spec/lib/hamster/deque/pretty_print_spec.rb +24 -0
- data/spec/lib/hamster/deque/push_spec.rb +37 -0
- data/spec/lib/hamster/deque/shift_spec.rb +30 -0
- data/spec/lib/hamster/deque/size_spec.rb +1 -1
- data/spec/lib/hamster/deque/to_a_spec.rb +2 -2
- data/spec/lib/hamster/deque/to_ary_spec.rb +1 -1
- data/spec/lib/hamster/deque/to_list_spec.rb +3 -3
- data/spec/lib/hamster/deque/unshift_spec.rb +8 -3
- data/spec/lib/hamster/experimental/mutable_set/add_qm_spec.rb +3 -3
- data/spec/lib/hamster/experimental/mutable_set/add_spec.rb +3 -3
- data/spec/lib/hamster/experimental/mutable_set/delete_qm_spec.rb +3 -3
- data/spec/lib/hamster/experimental/mutable_set/delete_spec.rb +3 -3
- data/spec/lib/hamster/hash/all_spec.rb +32 -34
- data/spec/lib/hamster/hash/any_spec.rb +34 -36
- data/spec/lib/hamster/hash/assoc_spec.rb +3 -3
- data/spec/lib/hamster/hash/clear_spec.rb +4 -4
- data/spec/lib/hamster/hash/construction_spec.rb +8 -8
- data/spec/lib/hamster/hash/copying_spec.rb +1 -1
- data/spec/lib/hamster/hash/default_proc_spec.rb +3 -3
- data/spec/lib/hamster/hash/delete_spec.rb +4 -4
- data/spec/lib/hamster/hash/each_spec.rb +3 -3
- data/spec/lib/hamster/hash/each_with_index_spec.rb +1 -1
- data/spec/lib/hamster/hash/empty_spec.rb +13 -15
- data/spec/lib/hamster/hash/eql_spec.rb +4 -4
- data/spec/lib/hamster/hash/except_spec.rb +7 -7
- data/spec/lib/hamster/hash/fetch_spec.rb +10 -10
- data/spec/lib/hamster/hash/find_spec.rb +2 -2
- data/spec/lib/hamster/hash/flat_map_spec.rb +4 -4
- data/spec/lib/hamster/hash/flatten_spec.rb +13 -13
- data/spec/lib/hamster/hash/get_spec.rb +7 -7
- data/spec/lib/hamster/hash/has_key_spec.rb +3 -3
- data/spec/lib/hamster/hash/has_value_spec.rb +4 -4
- data/spec/lib/hamster/hash/hash_spec.rb +5 -5
- data/spec/lib/hamster/hash/inspect_spec.rb +2 -2
- data/spec/lib/hamster/hash/invert_spec.rb +6 -6
- data/spec/lib/hamster/hash/key_spec.rb +2 -2
- data/spec/lib/hamster/hash/keys_spec.rb +2 -2
- data/spec/lib/hamster/hash/map_spec.rb +4 -4
- data/spec/lib/hamster/hash/marshal_spec.rb +2 -2
- data/spec/lib/hamster/hash/merge_spec.rb +62 -56
- data/spec/lib/hamster/hash/min_max_spec.rb +9 -13
- data/spec/lib/hamster/hash/new_spec.rb +6 -6
- data/spec/lib/hamster/hash/none_spec.rb +3 -3
- data/spec/lib/hamster/hash/partition_spec.rb +2 -2
- data/spec/lib/hamster/hash/put_spec.rb +29 -7
- data/spec/lib/hamster/hash/reduce_spec.rb +4 -4
- data/spec/lib/hamster/hash/{remove_spec.rb → reject_spec.rb} +7 -7
- data/spec/lib/hamster/hash/reverse_each_spec.rb +1 -1
- data/spec/lib/hamster/hash/{filter_spec.rb → select_spec.rb} +6 -6
- data/spec/lib/hamster/hash/size_spec.rb +3 -3
- data/spec/lib/hamster/hash/slice_spec.rb +4 -4
- data/spec/lib/hamster/hash/sort_spec.rb +2 -2
- data/spec/lib/hamster/hash/store_spec.rb +29 -7
- data/spec/lib/hamster/hash/take_spec.rb +2 -2
- data/spec/lib/hamster/hash/to_a_spec.rb +1 -1
- data/spec/lib/hamster/hash/to_hash_spec.rb +4 -4
- data/spec/lib/hamster/hash/values_at_spec.rb +3 -3
- data/spec/lib/hamster/hash/values_spec.rb +2 -2
- data/spec/lib/hamster/immutable/new_spec.rb +14 -0
- data/spec/lib/hamster/list/add_spec.rb +16 -10
- data/spec/lib/hamster/list/all_spec.rb +33 -35
- data/spec/lib/hamster/list/any_spec.rb +29 -31
- data/spec/lib/hamster/list/append_spec.rb +6 -6
- data/spec/lib/hamster/list/at_spec.rb +1 -1
- data/spec/lib/hamster/list/break_spec.rb +4 -4
- data/spec/lib/hamster/list/cadr_spec.rb +9 -9
- data/spec/lib/hamster/list/chunk_spec.rb +5 -5
- data/spec/lib/hamster/list/clear_spec.rb +3 -3
- data/spec/lib/hamster/list/combination_spec.rb +3 -3
- data/spec/lib/hamster/list/compact_spec.rb +3 -3
- data/spec/lib/hamster/list/compare_spec.rb +3 -3
- data/spec/lib/hamster/list/cons_spec.rb +15 -17
- data/spec/lib/hamster/list/construction_spec.rb +20 -27
- data/spec/lib/hamster/list/copying_spec.rb +1 -1
- data/spec/lib/hamster/list/count_spec.rb +1 -1
- data/spec/lib/hamster/list/cycle_spec.rb +4 -4
- data/spec/lib/hamster/list/delete_at_spec.rb +4 -4
- data/spec/lib/hamster/list/drop_spec.rb +3 -3
- data/spec/lib/hamster/list/drop_while_spec.rb +3 -3
- data/spec/lib/hamster/list/each_slice_spec.rb +5 -5
- data/spec/lib/hamster/list/each_spec.rb +26 -28
- data/spec/lib/hamster/list/each_with_index_spec.rb +1 -1
- data/spec/lib/hamster/list/empty_spec.rb +13 -15
- data/spec/lib/hamster/list/eql_spec.rb +21 -21
- data/spec/lib/hamster/list/fill_spec.rb +8 -8
- data/spec/lib/hamster/list/find_all_spec.rb +3 -3
- data/spec/lib/hamster/list/find_index_spec.rb +1 -1
- data/spec/lib/hamster/list/find_spec.rb +1 -1
- data/spec/lib/hamster/list/flat_map_spec.rb +2 -2
- data/spec/lib/hamster/list/flatten_spec.rb +5 -5
- data/spec/lib/hamster/list/grep_spec.rb +4 -4
- data/spec/lib/hamster/list/group_by_spec.rb +6 -6
- data/spec/lib/hamster/list/hash_spec.rb +2 -2
- data/spec/lib/hamster/list/head_spec.rb +1 -1
- data/spec/lib/hamster/list/include_spec.rb +2 -2
- data/spec/lib/hamster/list/index_spec.rb +38 -0
- data/spec/lib/hamster/list/indices_spec.rb +62 -0
- data/spec/lib/hamster/list/init_spec.rb +3 -3
- data/spec/lib/hamster/list/inits_spec.rb +3 -3
- data/spec/lib/hamster/list/insert_spec.rb +1 -1
- data/spec/lib/hamster/list/inspect_spec.rb +1 -1
- data/spec/lib/hamster/list/intersperse_spec.rb +3 -3
- data/spec/lib/hamster/list/join_spec.rb +5 -5
- data/spec/lib/hamster/list/last_spec.rb +1 -1
- data/spec/lib/hamster/list/ltlt_spec.rb +20 -0
- data/spec/lib/hamster/list/map_spec.rb +4 -4
- data/spec/lib/hamster/list/maximum_spec.rb +24 -26
- data/spec/lib/hamster/list/merge_by_spec.rb +10 -10
- data/spec/lib/hamster/list/merge_spec.rb +10 -10
- data/spec/lib/hamster/list/minimum_spec.rb +24 -26
- data/spec/lib/hamster/list/multithreading_spec.rb +6 -6
- data/spec/lib/hamster/list/none_spec.rb +5 -5
- data/spec/lib/hamster/list/one_spec.rb +5 -5
- data/spec/lib/hamster/list/partition_spec.rb +8 -8
- data/spec/lib/hamster/list/permutation_spec.rb +8 -8
- data/spec/lib/hamster/list/pop_spec.rb +3 -3
- data/spec/lib/hamster/list/product_spec.rb +1 -1
- data/spec/lib/hamster/list/reduce_spec.rb +5 -48
- data/spec/lib/hamster/list/{remove_spec.rb → reject_spec.rb} +4 -4
- data/spec/lib/hamster/list/reverse_spec.rb +3 -3
- data/spec/lib/hamster/list/rotate_spec.rb +7 -7
- data/spec/lib/hamster/list/sample_spec.rb +1 -1
- data/spec/lib/hamster/list/select_spec.rb +3 -3
- data/spec/lib/hamster/list/size_spec.rb +1 -1
- data/spec/lib/hamster/list/slice_spec.rb +123 -123
- data/spec/lib/hamster/list/sorting_spec.rb +5 -5
- data/spec/lib/hamster/list/span_spec.rb +5 -5
- data/spec/lib/hamster/list/split_at_spec.rb +4 -4
- data/spec/lib/hamster/list/subsequences_spec.rb +1 -1
- data/spec/lib/hamster/list/sum_spec.rb +1 -1
- data/spec/lib/hamster/list/tail_spec.rb +4 -4
- data/spec/lib/hamster/list/tails_spec.rb +3 -3
- data/spec/lib/hamster/list/take_spec.rb +3 -3
- data/spec/lib/hamster/list/take_while_spec.rb +4 -4
- data/spec/lib/hamster/list/to_a_spec.rb +2 -2
- data/spec/lib/hamster/list/to_ary_spec.rb +1 -1
- data/spec/lib/hamster/list/to_list_spec.rb +1 -1
- data/spec/lib/hamster/list/to_set_spec.rb +1 -1
- data/spec/lib/hamster/list/union_spec.rb +4 -4
- data/spec/lib/hamster/list/uniq_spec.rb +23 -19
- data/spec/lib/hamster/list/zip_spec.rb +5 -5
- data/spec/lib/hamster/nested/construction_spec.rb +103 -0
- data/spec/lib/hamster/set/add_spec.rb +13 -11
- data/spec/lib/hamster/set/all_spec.rb +32 -34
- data/spec/lib/hamster/set/any_spec.rb +32 -34
- data/spec/lib/hamster/set/clear_spec.rb +3 -3
- data/spec/lib/hamster/set/compact_spec.rb +3 -3
- data/spec/lib/hamster/set/construction_spec.rb +3 -3
- data/spec/lib/hamster/set/copying_spec.rb +1 -1
- data/spec/lib/hamster/set/count_spec.rb +1 -1
- data/spec/lib/hamster/set/delete_spec.rb +8 -8
- data/spec/lib/hamster/set/difference_spec.rb +8 -8
- data/spec/lib/hamster/set/disjoint_spec.rb +1 -1
- data/spec/lib/hamster/set/each_spec.rb +2 -2
- data/spec/lib/hamster/set/empty_spec.rb +15 -17
- data/spec/lib/hamster/set/eqeq_spec.rb +3 -3
- data/spec/lib/hamster/set/eql_spec.rb +3 -3
- data/spec/lib/hamster/set/exclusion_spec.rb +7 -7
- data/spec/lib/hamster/set/find_spec.rb +2 -2
- data/spec/lib/hamster/set/first_spec.rb +29 -0
- data/spec/lib/hamster/set/flatten_spec.rb +9 -9
- data/spec/lib/hamster/set/grep_spec.rb +1 -1
- data/spec/lib/hamster/set/group_by_spec.rb +12 -12
- data/spec/lib/hamster/set/hash_spec.rb +3 -3
- data/spec/lib/hamster/set/include_spec.rb +8 -8
- data/spec/lib/hamster/set/inspect_spec.rb +2 -2
- data/spec/lib/hamster/set/intersect_spec.rb +1 -1
- data/spec/lib/hamster/set/intersection_spec.rb +13 -13
- data/spec/lib/hamster/set/join_spec.rb +6 -6
- data/spec/lib/hamster/set/map_spec.rb +7 -7
- data/spec/lib/hamster/set/marshal_spec.rb +2 -2
- data/spec/lib/hamster/set/maximum_spec.rb +22 -24
- data/spec/lib/hamster/set/minimum_spec.rb +22 -24
- data/spec/lib/hamster/set/new_spec.rb +5 -5
- data/spec/lib/hamster/set/none_spec.rb +5 -5
- data/spec/lib/hamster/set/one_spec.rb +6 -6
- data/spec/lib/hamster/set/partition_spec.rb +5 -5
- data/spec/lib/hamster/set/product_spec.rb +2 -2
- data/spec/lib/hamster/set/reduce_spec.rb +5 -5
- data/spec/lib/hamster/set/{remove_spec.rb → reject_spec.rb} +6 -6
- data/spec/lib/hamster/set/reverse_each_spec.rb +1 -1
- data/spec/lib/hamster/set/sample_spec.rb +1 -1
- data/spec/lib/hamster/set/{filter_spec.rb → select_spec.rb} +11 -11
- data/spec/lib/hamster/set/size_spec.rb +1 -1
- data/spec/lib/hamster/set/sorting_spec.rb +16 -5
- data/spec/lib/hamster/set/subset_spec.rb +2 -2
- data/spec/lib/hamster/set/sum_spec.rb +2 -2
- data/spec/lib/hamster/set/superset_spec.rb +2 -2
- data/spec/lib/hamster/set/to_a_spec.rb +2 -2
- data/spec/lib/hamster/set/to_list_spec.rb +2 -2
- data/spec/lib/hamster/set/to_set_spec.rb +1 -1
- data/spec/lib/hamster/set/union_spec.rb +23 -14
- data/spec/lib/hamster/sorted_set/above_spec.rb +11 -11
- data/spec/lib/hamster/sorted_set/add_spec.rb +8 -8
- data/spec/lib/hamster/sorted_set/at_spec.rb +1 -1
- data/spec/lib/hamster/sorted_set/below_spec.rb +11 -11
- data/spec/lib/hamster/sorted_set/between_spec.rb +11 -11
- data/spec/lib/hamster/sorted_set/clear_spec.rb +11 -2
- data/spec/lib/hamster/sorted_set/copying_spec.rb +21 -0
- data/spec/lib/hamster/sorted_set/delete_at_spec.rb +4 -4
- data/spec/lib/hamster/sorted_set/delete_spec.rb +21 -12
- data/spec/lib/hamster/sorted_set/difference_spec.rb +2 -2
- data/spec/lib/hamster/sorted_set/disjoint_spec.rb +1 -1
- data/spec/lib/hamster/sorted_set/drop_spec.rb +30 -3
- data/spec/lib/hamster/sorted_set/drop_while_spec.rb +4 -4
- data/spec/lib/hamster/sorted_set/each_spec.rb +16 -18
- data/spec/lib/hamster/sorted_set/empty_spec.rb +12 -14
- data/spec/lib/hamster/sorted_set/eql_spec.rb +5 -5
- data/spec/lib/hamster/sorted_set/exclusion_spec.rb +1 -1
- data/spec/lib/hamster/sorted_set/fetch_spec.rb +1 -1
- data/spec/lib/hamster/sorted_set/find_index_spec.rb +10 -2
- data/spec/lib/hamster/sorted_set/first_spec.rb +10 -12
- data/spec/lib/hamster/sorted_set/from_spec.rb +11 -11
- data/spec/lib/hamster/sorted_set/group_by_spec.rb +10 -10
- data/spec/lib/hamster/sorted_set/include_spec.rb +2 -2
- data/spec/lib/hamster/sorted_set/inspect_spec.rb +1 -1
- data/spec/lib/hamster/sorted_set/intersect_spec.rb +1 -1
- data/spec/lib/hamster/sorted_set/intersection_spec.rb +3 -3
- data/spec/lib/hamster/sorted_set/last_spec.rb +1 -1
- data/spec/lib/hamster/sorted_set/map_spec.rb +13 -5
- data/spec/lib/hamster/sorted_set/marshal_spec.rb +3 -3
- data/spec/lib/hamster/sorted_set/maximum_spec.rb +37 -0
- data/spec/lib/hamster/sorted_set/minimum_spec.rb +11 -13
- data/spec/lib/hamster/sorted_set/new_spec.rb +23 -3
- data/spec/lib/hamster/sorted_set/reverse_each_spec.rb +2 -2
- data/spec/lib/hamster/sorted_set/{filter_spec.rb → select_spec.rb} +10 -10
- data/spec/lib/hamster/sorted_set/size_spec.rb +1 -1
- data/spec/lib/hamster/sorted_set/slice_spec.rb +158 -142
- data/spec/lib/hamster/sorted_set/sorting_spec.rb +3 -3
- data/spec/lib/hamster/sorted_set/subset_spec.rb +2 -2
- data/spec/lib/hamster/sorted_set/superset_spec.rb +2 -2
- data/spec/lib/hamster/sorted_set/take_spec.rb +32 -3
- data/spec/lib/hamster/sorted_set/take_while_spec.rb +4 -4
- data/spec/lib/hamster/sorted_set/to_set_spec.rb +1 -1
- data/spec/lib/hamster/sorted_set/union_spec.rb +2 -2
- data/spec/lib/hamster/sorted_set/up_to_spec.rb +12 -11
- data/spec/lib/hamster/sorted_set/values_at_spec.rb +6 -6
- data/spec/lib/hamster/vector/add_spec.rb +3 -3
- data/spec/lib/hamster/vector/any_spec.rb +1 -1
- data/spec/lib/hamster/vector/assoc_spec.rb +11 -1
- data/spec/lib/hamster/vector/bsearch_spec.rb +10 -2
- data/spec/lib/hamster/vector/clear_spec.rb +3 -3
- data/spec/lib/hamster/vector/combination_spec.rb +4 -4
- data/spec/lib/hamster/vector/compact_spec.rb +2 -2
- data/spec/lib/hamster/vector/compare_spec.rb +3 -3
- data/spec/lib/hamster/vector/concat_spec.rb +2 -2
- data/spec/lib/hamster/vector/copying_spec.rb +1 -1
- data/spec/lib/hamster/vector/delete_at_spec.rb +8 -8
- data/spec/lib/hamster/vector/delete_spec.rb +2 -2
- data/spec/lib/hamster/vector/drop_spec.rb +10 -3
- data/spec/lib/hamster/vector/drop_while_spec.rb +5 -5
- data/spec/lib/hamster/vector/each_index_spec.rb +2 -2
- data/spec/lib/hamster/vector/each_spec.rb +27 -29
- data/spec/lib/hamster/vector/each_with_index_spec.rb +2 -2
- data/spec/lib/hamster/vector/empty_spec.rb +11 -13
- data/spec/lib/hamster/vector/eql_spec.rb +6 -6
- data/spec/lib/hamster/vector/fetch_spec.rb +1 -1
- data/spec/lib/hamster/vector/fill_spec.rb +9 -9
- data/spec/lib/hamster/vector/first_spec.rb +10 -12
- data/spec/lib/hamster/vector/flat_map_spec.rb +51 -0
- data/spec/lib/hamster/vector/flatten_spec.rb +15 -0
- data/spec/lib/hamster/vector/get_spec.rb +4 -4
- data/spec/lib/hamster/vector/group_by_spec.rb +12 -12
- data/spec/lib/hamster/vector/include_spec.rb +2 -2
- data/spec/lib/hamster/vector/insert_spec.rb +2 -2
- data/spec/lib/hamster/vector/inspect_spec.rb +1 -1
- data/spec/lib/hamster/vector/join_spec.rb +5 -5
- data/spec/lib/hamster/vector/last_spec.rb +1 -1
- data/spec/lib/hamster/vector/length_spec.rb +1 -1
- data/spec/lib/hamster/vector/ltlt_spec.rb +2 -2
- data/spec/lib/hamster/vector/map_spec.rb +5 -5
- data/spec/lib/hamster/vector/marshal_spec.rb +2 -2
- data/spec/lib/hamster/vector/maximum_spec.rb +20 -22
- data/spec/lib/hamster/vector/minimum_spec.rb +20 -22
- data/spec/lib/hamster/vector/multiply_spec.rb +4 -4
- data/spec/lib/hamster/vector/partition_spec.rb +5 -5
- data/spec/lib/hamster/vector/permutation_spec.rb +4 -4
- data/spec/lib/hamster/vector/pop_spec.rb +3 -3
- data/spec/lib/hamster/vector/product_spec.rb +10 -10
- data/spec/lib/hamster/vector/put_spec.rb +175 -0
- data/spec/lib/hamster/vector/reduce_spec.rb +5 -57
- data/spec/lib/hamster/vector/{remove_spec.rb → reject_spec.rb} +4 -4
- data/spec/lib/hamster/vector/repeated_combination_spec.rb +4 -4
- data/spec/lib/hamster/vector/repeated_permutation_spec.rb +6 -6
- data/spec/lib/hamster/vector/reverse_each_spec.rb +1 -1
- data/spec/lib/hamster/vector/reverse_spec.rb +1 -1
- data/spec/lib/hamster/vector/rindex_spec.rb +1 -1
- data/spec/lib/hamster/vector/rotate_spec.rb +9 -9
- data/spec/lib/hamster/vector/sample_spec.rb +1 -1
- data/spec/lib/hamster/vector/{filter_spec.rb → select_spec.rb} +8 -8
- data/spec/lib/hamster/vector/set_spec.rb +12 -141
- data/spec/lib/hamster/vector/shift_spec.rb +3 -3
- data/spec/lib/hamster/vector/shuffle_spec.rb +2 -2
- data/spec/lib/hamster/vector/slice_spec.rb +137 -137
- data/spec/lib/hamster/vector/sorting_spec.rb +5 -5
- data/spec/lib/hamster/vector/sum_spec.rb +1 -1
- data/spec/lib/hamster/vector/take_spec.rb +17 -3
- data/spec/lib/hamster/vector/take_while_spec.rb +4 -4
- data/spec/lib/hamster/vector/to_a_spec.rb +1 -1
- data/spec/lib/hamster/vector/to_ary_spec.rb +1 -1
- data/spec/lib/hamster/vector/to_list_spec.rb +2 -1
- data/spec/lib/hamster/vector/to_set_spec.rb +1 -1
- data/spec/lib/hamster/vector/uniq_spec.rb +27 -6
- data/spec/lib/hamster/vector/unshift_spec.rb +3 -3
- data/spec/lib/hamster/vector/values_at_spec.rb +6 -6
- data/spec/lib/hamster/vector/zip_spec.rb +2 -2
- data/spec/lib/load_spec.rb +42 -0
- data/spec/spec_helper.rb +25 -0
- metadata +85 -48
- data/spec/lib/hamster/deque/head_spec.rb +0 -20
- data/spec/lib/hamster/hash/uniq_spec.rb +0 -14
- data/spec/lib/hamster/list/elem_index_spec.rb +0 -36
- data/spec/lib/hamster/list/elem_indices_spec.rb +0 -31
- data/spec/lib/hamster/list/filter_spec.rb +0 -71
- data/spec/lib/hamster/list/find_indices_spec.rb +0 -37
- data/spec/lib/hamster/set/foreach_spec.rb +0 -40
- data/spec/lib/hamster/set/head_spec.rb +0 -31
- data/spec/lib/hamster/set/uniq_spec.rb +0 -14
- data/spec/lib/hamster/sorted_set/construction_spec.rb +0 -29
- data/spec/lib/hamster/vector/exist_spec.rb +0 -70
- data/spec/lib/hamster/vector/exists_spec.rb +0 -70
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 010476a87d79b515fa2da08903f6c36ebffd550e
         | 
| 4 | 
            +
              data.tar.gz: 080ace89fb94c62d9ef29cc3a83c879e64a6b577
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 596a85aa07273c8912dc6f42a8dcec58684a3eb9ce469f6a1219fd8f3cad242b7b69e72d06b185d77f95496b86b8e197ebedd5cd77e5ce3865fa07c687ee26e2
         | 
| 7 | 
            +
              data.tar.gz: b14a0366601d364dd10a78b9c068c8849fd1471ef01cb0b0656391d2096e5408ba96ad2dcda125e9c99cd7867bf129310bc027995272d865656b1b760b89b3bd
         | 
    
        data/lib/hamster.rb
    CHANGED
    
    
| @@ -0,0 +1,49 @@ | |
| 1 | 
            +
            module Hamster
         | 
| 2 | 
            +
              # Including `Associable` in your container class gives it an `update_in`
         | 
| 3 | 
            +
              # method.
         | 
| 4 | 
            +
              #
         | 
| 5 | 
            +
              # To mix in `Associable`, your class must implement two methods:
         | 
| 6 | 
            +
              #
         | 
| 7 | 
            +
              # * `fetch(index, default = (missing_default = true))`
         | 
| 8 | 
            +
              # * `put(index, item = yield(get(index)))`
         | 
| 9 | 
            +
              #
         | 
| 10 | 
            +
              # See {Vector#fetch}, {Vector#put}, {Hash#fetch}, and {Hash#put} for examples.
         | 
| 11 | 
            +
              module Associable
         | 
| 12 | 
            +
                # Return a new container with a deeply nested value modified to the result
         | 
| 13 | 
            +
                # of the given code block.  When traversing the nested containers
         | 
| 14 | 
            +
                # non-existing keys are created with empty `Hash` values.
         | 
| 15 | 
            +
                #
         | 
| 16 | 
            +
                # The code block receives the existing value of the deeply nested key/index
         | 
| 17 | 
            +
                # (or `nil` if it doesn't exist). This is useful for "transforming" the
         | 
| 18 | 
            +
                # value associated with a certain key/index.
         | 
| 19 | 
            +
                #
         | 
| 20 | 
            +
                # Naturally, the original container and sub-containers are left unmodified;
         | 
| 21 | 
            +
                # new data structure copies are created along the path as needed.
         | 
| 22 | 
            +
                #
         | 
| 23 | 
            +
                # @example
         | 
| 24 | 
            +
                #   v = Hamster::Vector[123, 456, 789, Hamster::Hash["a" => Hamster::Vector[5, 6, 7]]]
         | 
| 25 | 
            +
                #   v.update_in(3, "a", 1) { |value| value + 9 }
         | 
| 26 | 
            +
                #   # => Hamster::Vector[123, 456, 789, Hamster::Hash["a" => Hamster::Vector[5, 15, 7]]]
         | 
| 27 | 
            +
                #   hash = Hamster::Hash["a" => Hamster::Hash["b" => Hamster::Hash["c" => 42]]]
         | 
| 28 | 
            +
                #   hash.update_in("a", "b", "c") { |value| value + 5 }
         | 
| 29 | 
            +
                #   # => Hamster::Hash["a" => Hamster::Hash["b" => Hamster::Hash["c" => 47]]]
         | 
| 30 | 
            +
                #
         | 
| 31 | 
            +
                # @param key_path [Object(s)] List of keys/indexes which form the path to the key to be modified
         | 
| 32 | 
            +
                # @yield [value] The previously stored value
         | 
| 33 | 
            +
                # @yieldreturn [Object] The new value to store
         | 
| 34 | 
            +
                # @return [Associable]
         | 
| 35 | 
            +
                def update_in(*key_path, &block)
         | 
| 36 | 
            +
                  if key_path.empty?
         | 
| 37 | 
            +
                    raise ArgumentError, "must have at least one key in path"
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                  key = key_path[0]
         | 
| 40 | 
            +
                  if key_path.size == 1
         | 
| 41 | 
            +
                    new_value = block.call(fetch(key, nil))
         | 
| 42 | 
            +
                  else
         | 
| 43 | 
            +
                    value = fetch(key, EmptyHash)
         | 
| 44 | 
            +
                    new_value = value.update_in(*key_path[1..-1], &block)
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
                  put(key, new_value)
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
            end
         | 
| @@ -1,21 +1,11 @@ | |
| 1 1 | 
             
            require "hamster/list"
         | 
| 2 2 |  | 
| 3 | 
            -
            # Ruby's built-in `Enumerable` module.
         | 
| 3 | 
            +
            # Monkey-patches to Ruby's built-in `Enumerable` module.
         | 
| 4 4 | 
             
            # @see http://www.ruby-doc.org/core/Enumerable.html
         | 
| 5 5 | 
             
            module Enumerable
         | 
| 6 6 | 
             
              # Return a new {Hamster::List} populated with the items in this `Enumerable` object.
         | 
| 7 7 | 
             
              # @return [List]
         | 
| 8 8 | 
             
              def to_list
         | 
| 9 | 
            -
                 | 
| 10 | 
            -
                # this is a very fast way to build up a linked list
         | 
| 11 | 
            -
                list = tail = Hamster::Cons.allocate
         | 
| 12 | 
            -
                each do |item|
         | 
| 13 | 
            -
                  new_node = Hamster::Cons.allocate
         | 
| 14 | 
            -
                  new_node.instance_variable_set(:@head, item)
         | 
| 15 | 
            -
                  tail.instance_variable_set(:@tail, new_node)
         | 
| 16 | 
            -
                  tail = new_node
         | 
| 17 | 
            -
                end
         | 
| 18 | 
            -
                tail.instance_variable_set(:@tail, Hamster::EmptyList)
         | 
| 19 | 
            -
                list.tail
         | 
| 9 | 
            +
                Hamster::List.from_enum(self)
         | 
| 20 10 | 
             
              end
         | 
| 21 | 
            -
            end
         | 
| 11 | 
            +
            end
         | 
    
        data/lib/hamster/core_ext/io.rb
    CHANGED
    
    
    
        data/lib/hamster/deque.rb
    CHANGED
    
    | @@ -1,25 +1,20 @@ | |
| 1 | 
            -
            require "forwardable"
         | 
| 2 1 | 
             
            require "hamster/immutable"
         | 
| 3 2 | 
             
            require "hamster/list"
         | 
| 4 3 |  | 
| 5 4 | 
             
            module Hamster
         | 
| 6 | 
            -
              def self.deque(*items)
         | 
| 7 | 
            -
                items.empty? ? EmptyDeque : Deque.new(items)
         | 
| 8 | 
            -
              end
         | 
| 9 5 |  | 
| 10 | 
            -
              # A `Deque` (or double-ended queue) is an ordered, sequential collection of | 
| 11 | 
            -
              # which allows elements to be  | 
| 12 | 
            -
              #  | 
| 13 | 
            -
              #  | 
| 6 | 
            +
              # A `Deque` (or double-ended queue) is an ordered, sequential collection of
         | 
| 7 | 
            +
              # objects, which allows elements to be retrieved, added and removed at the
         | 
| 8 | 
            +
              # front and end of the sequence in constant time. This makes `Deque` perfect
         | 
| 9 | 
            +
              # for use as an immutable queue or stack.
         | 
| 14 10 | 
             
              #
         | 
| 15 | 
            -
              # A `Deque` differs from a {Vector} in that vectors allow indexed access to | 
| 16 | 
            -
              # element in the collection. `Deque`s only allow access to the first and | 
| 17 | 
            -
              # element. But adding and removing from the ends of a `Deque` is faster | 
| 18 | 
            -
              # adding and removing from the ends of a {Vector}.
         | 
| 11 | 
            +
              # A `Deque` differs from a {Vector} in that vectors allow indexed access to
         | 
| 12 | 
            +
              # any element in the collection. `Deque`s only allow access to the first and
         | 
| 13 | 
            +
              # last element. But adding and removing from the ends of a `Deque` is faster
         | 
| 14 | 
            +
              # than adding and removing from the ends of a {Vector}.
         | 
| 19 15 | 
             
              #
         | 
| 20 16 | 
             
              # To create a new `Deque`:
         | 
| 21 17 | 
             
              #
         | 
| 22 | 
            -
              #     Hamster.deque('a', 'b', 'c')
         | 
| 23 18 | 
             
              #     Hamster::Deque.new([:first, :second, :third])
         | 
| 24 19 | 
             
              #     Hamster::Deque[1, 2, 3, 4, 5]
         | 
| 25 20 | 
             
              #
         | 
| @@ -27,9 +22,10 @@ module Hamster | |
| 27 22 | 
             
              #
         | 
| 28 23 | 
             
              #     Hamster::Deque.empty.push('b').push('c').unshift('a')
         | 
| 29 24 | 
             
              #
         | 
| 30 | 
            -
              # Like all Hamster collections, `Deque` is immutable. The  | 
| 31 | 
            -
              # "modify" deques ({#push}, {#pop}, {#shift}, and | 
| 32 | 
            -
              # collection and leave the existing one | 
| 25 | 
            +
              # Like all Hamster collections, `Deque` is immutable. The four basic
         | 
| 26 | 
            +
              # operations that "modify" deques ({#push}, {#pop}, {#shift}, and
         | 
| 27 | 
            +
              # {#unshift}) all return a new collection and leave the existing one
         | 
| 28 | 
            +
              # unchanged.
         | 
| 33 29 | 
             
              #
         | 
| 34 30 | 
             
              # @example
         | 
| 35 31 | 
             
              #   deque = Hamster::Deque.empty                 # => Hamster::Deque[]
         | 
| @@ -41,7 +37,6 @@ module Hamster | |
| 41 37 | 
             
              # @see http://en.wikipedia.org/wiki/Deque "Deque" on Wikipedia
         | 
| 42 38 | 
             
              #
         | 
| 43 39 | 
             
              class Deque
         | 
| 44 | 
            -
                extend Forwardable
         | 
| 45 40 | 
             
                include Immutable
         | 
| 46 41 |  | 
| 47 42 | 
             
                class << self
         | 
| @@ -69,12 +64,12 @@ module Hamster | |
| 69 64 | 
             
                    result = allocate
         | 
| 70 65 | 
             
                    result.instance_variable_set(:@front, front)
         | 
| 71 66 | 
             
                    result.instance_variable_set(:@rear,  rear)
         | 
| 72 | 
            -
                    result
         | 
| 67 | 
            +
                    result.freeze
         | 
| 73 68 | 
             
                  end
         | 
| 74 69 | 
             
                end
         | 
| 75 70 |  | 
| 76 71 | 
             
                def initialize(items=[])
         | 
| 77 | 
            -
                  @front = items | 
| 72 | 
            +
                  @front = Hamster::List.from_enum(items)
         | 
| 78 73 | 
             
                  @rear  = EmptyList
         | 
| 79 74 | 
             
                end
         | 
| 80 75 |  | 
| @@ -83,51 +78,65 @@ module Hamster | |
| 83 78 | 
             
                def empty?
         | 
| 84 79 | 
             
                  @front.empty? && @rear.empty?
         | 
| 85 80 | 
             
                end
         | 
| 86 | 
            -
                def_delegator :self, :empty?, :null?
         | 
| 87 81 |  | 
| 88 82 | 
             
                # Return the number of items in this `Deque`.
         | 
| 83 | 
            +
                #
         | 
| 84 | 
            +
                # @example
         | 
| 85 | 
            +
                #   Hamster::Deque["A", "B", "C"].size  #=> 3
         | 
| 86 | 
            +
                #
         | 
| 89 87 | 
             
                # @return [Integer]
         | 
| 90 88 | 
             
                def size
         | 
| 91 89 | 
             
                  @front.size + @rear.size
         | 
| 92 90 | 
             
                end
         | 
| 93 | 
            -
                 | 
| 91 | 
            +
                alias :length :size
         | 
| 94 92 |  | 
| 95 93 | 
             
                # Return the first item in the `Deque`. If the deque is empty, return `nil`.
         | 
| 94 | 
            +
                #
         | 
| 95 | 
            +
                # @example
         | 
| 96 | 
            +
                #   Hamster::Deque["A", "B", "C"].first  #=> "A"
         | 
| 97 | 
            +
                #
         | 
| 96 98 | 
             
                # @return [Object]
         | 
| 97 99 | 
             
                def first
         | 
| 98 100 | 
             
                  return @front.head unless @front.empty?
         | 
| 99 101 | 
             
                  @rear.last # memoize?
         | 
| 100 102 | 
             
                end
         | 
| 101 | 
            -
                def_delegator :self, :first, :head
         | 
| 102 | 
            -
                def_delegator :self, :first, :front
         | 
| 103 103 |  | 
| 104 104 | 
             
                # Return the last item in the `Deque`. If the deque is empty, return `nil`.
         | 
| 105 | 
            +
                #
         | 
| 106 | 
            +
                # @example
         | 
| 107 | 
            +
                #   Hamster::Deque["A", "B", "C"].last  #=> "C"
         | 
| 108 | 
            +
                #
         | 
| 105 109 | 
             
                # @return [Object]
         | 
| 106 110 | 
             
                def last
         | 
| 107 111 | 
             
                  return @rear.head unless @rear.empty?
         | 
| 108 112 | 
             
                  @front.last # memoize?
         | 
| 109 113 | 
             
                end
         | 
| 110 | 
            -
                def_delegator :self, :last, :peek
         | 
| 111 114 |  | 
| 112 115 | 
             
                # Return a new `Deque` with `item` added at the end.
         | 
| 116 | 
            +
                #
         | 
| 117 | 
            +
                # @example
         | 
| 118 | 
            +
                #   Hamster::Deque["A", "B", "C"].add("Z")
         | 
| 119 | 
            +
                #   # => Hamster::Deque["A", "B", "C", "Z"]
         | 
| 120 | 
            +
                #
         | 
| 113 121 | 
             
                # @param item [Object] The item to add
         | 
| 114 122 | 
             
                # @return [Deque]
         | 
| 115 123 | 
             
                def push(item)
         | 
| 116 124 | 
             
                  self.class.alloc(@front, @rear.cons(item))
         | 
| 117 125 | 
             
                end
         | 
| 118 | 
            -
                 | 
| 119 | 
            -
                def_delegator :self, :push, :<<
         | 
| 120 | 
            -
                def_delegator :self, :push, :add
         | 
| 121 | 
            -
                def_delegator :self, :push, :conj
         | 
| 122 | 
            -
                def_delegator :self, :push, :conjoin
         | 
| 126 | 
            +
                alias :enqueue :push
         | 
| 123 127 |  | 
| 124 128 | 
             
                # Return a new `Deque` with the last item removed.
         | 
| 129 | 
            +
                #
         | 
| 130 | 
            +
                # @example
         | 
| 131 | 
            +
                #   Hamster::Deque["A", "B", "C"].pop
         | 
| 132 | 
            +
                #   # => Hamster::Deque["A", "B"]
         | 
| 133 | 
            +
                #
         | 
| 125 134 | 
             
                # @return [Deque]
         | 
| 126 135 | 
             
                def pop
         | 
| 127 136 | 
             
                  front, rear = @front, @rear
         | 
| 128 137 |  | 
| 129 138 | 
             
                  if rear.empty?
         | 
| 130 | 
            -
                    return  | 
| 139 | 
            +
                    return self.class.empty if front.empty?
         | 
| 131 140 | 
             
                    front, rear = EmptyList, front.reverse
         | 
| 132 141 | 
             
                  end
         | 
| 133 142 |  | 
| @@ -135,6 +144,11 @@ module Hamster | |
| 135 144 | 
             
                end
         | 
| 136 145 |  | 
| 137 146 | 
             
                # Return a new `Deque` with `item` added at the front.
         | 
| 147 | 
            +
                #
         | 
| 148 | 
            +
                # @example
         | 
| 149 | 
            +
                #   Hamster::Deque["A", "B", "C"].unshift("Z")
         | 
| 150 | 
            +
                #   # => Hamster::Deque["Z", "A", "B", "C"]
         | 
| 151 | 
            +
                #
         | 
| 138 152 | 
             
                # @param item [Object] The item to add
         | 
| 139 153 | 
             
                # @return [Deque]
         | 
| 140 154 | 
             
                def unshift(item)
         | 
| @@ -142,19 +156,23 @@ module Hamster | |
| 142 156 | 
             
                end
         | 
| 143 157 |  | 
| 144 158 | 
             
                # Return a new `Deque` with the first item removed.
         | 
| 159 | 
            +
                #
         | 
| 160 | 
            +
                # @example
         | 
| 161 | 
            +
                #   Hamster::Deque["A", "B", "C"].shift
         | 
| 162 | 
            +
                #   # => Hamster::Deque["B", "C"]
         | 
| 163 | 
            +
                #
         | 
| 145 164 | 
             
                # @return [Deque]
         | 
| 146 165 | 
             
                def shift
         | 
| 147 166 | 
             
                  front, rear = @front, @rear
         | 
| 148 167 |  | 
| 149 168 | 
             
                  if front.empty?
         | 
| 150 | 
            -
                    return  | 
| 169 | 
            +
                    return self.class.empty if rear.empty?
         | 
| 151 170 | 
             
                    front, rear = rear.reverse, EmptyList
         | 
| 152 171 | 
             
                  end
         | 
| 153 172 |  | 
| 154 173 | 
             
                  self.class.alloc(front.tail, rear)
         | 
| 155 174 | 
             
                end
         | 
| 156 | 
            -
                 | 
| 157 | 
            -
                def_delegator :self, :shift, :tail
         | 
| 175 | 
            +
                alias :dequeue :shift
         | 
| 158 176 |  | 
| 159 177 | 
             
                # Return an empty `Deque` instance, of the same class as this one. Useful if you
         | 
| 160 178 | 
             
                # have multiple subclasses of `Deque` and want to treat them polymorphically.
         | 
| @@ -172,15 +190,15 @@ module Hamster | |
| 172 190 | 
             
                  return true if other.equal?(self)
         | 
| 173 191 | 
             
                  instance_of?(other.class) && to_ary.eql?(other.to_ary)
         | 
| 174 192 | 
             
                end
         | 
| 175 | 
            -
                 | 
| 193 | 
            +
                alias :== :eql?
         | 
| 176 194 |  | 
| 177 195 | 
             
                # Return an `Array` with the same elements, in the same order.
         | 
| 178 196 | 
             
                # @return [Array]
         | 
| 179 197 | 
             
                def to_a
         | 
| 180 198 | 
             
                  @front.to_a.concat(@rear.to_a.tap { |a| a.reverse! })
         | 
| 181 199 | 
             
                end
         | 
| 182 | 
            -
                 | 
| 183 | 
            -
                 | 
| 200 | 
            +
                alias :entries :to_a
         | 
| 201 | 
            +
                alias :to_ary  :to_a
         | 
| 184 202 |  | 
| 185 203 | 
             
                # Return a {List} with the same elements, in the same order.
         | 
| 186 204 | 
             
                # @return [Hamster::List]
         | 
| @@ -221,9 +239,10 @@ module Hamster | |
| 221 239 | 
             
                end
         | 
| 222 240 | 
             
              end
         | 
| 223 241 |  | 
| 224 | 
            -
              # The canonical empty `Deque`. Returned by ` | 
| 242 | 
            +
              # The canonical empty `Deque`. Returned by `Deque[]` when
         | 
| 225 243 | 
             
              # invoked with no arguments; also returned by `Deque.empty`. Prefer using this
         | 
| 226 244 | 
             
              # one rather than creating many empty deques using `Deque.new`.
         | 
| 227 245 | 
             
              #
         | 
| 246 | 
            +
              # @private
         | 
| 228 247 | 
             
              EmptyDeque = Hamster::Deque.empty
         | 
| 229 | 
            -
            end
         | 
| 248 | 
            +
            end
         | 
    
        data/lib/hamster/enumerable.rb
    CHANGED
    
    | @@ -1,35 +1,30 @@ | |
| 1 | 
            -
            require "forwardable"
         | 
| 2 | 
            -
             | 
| 3 1 | 
             
            module Hamster
         | 
| 4 2 | 
             
              # Helper module for Hamster's sequential collections
         | 
| 5 3 | 
             
              #
         | 
| 6 | 
            -
              # Classes including `Hamster::Enumerable` must implement | 
| 7 | 
            -
              #
         | 
| 8 | 
            -
              # They must also implement:
         | 
| 4 | 
            +
              # Classes including `Hamster::Enumerable` must implement:
         | 
| 9 5 | 
             
              #
         | 
| 10 | 
            -
              # - `# | 
| 6 | 
            +
              # - `#each` (just like `::Enumerable`).
         | 
| 7 | 
            +
              # - `#select`, which takes a block, and returns an instance of the same class
         | 
| 11 8 | 
             
              #     with only the items for which the block returns a true value
         | 
| 12 | 
            -
              # - `#reverse` (or else undef `#foldr`, or provide another definition for it)
         | 
| 13 | 
            -
              #
         | 
| 14 9 | 
             
              module Enumerable
         | 
| 15 | 
            -
                extend Forwardable
         | 
| 16 10 | 
             
                include ::Enumerable
         | 
| 17 11 |  | 
| 18 12 | 
             
                # Return a new collection with all the elements for which the block returns false.
         | 
| 19 | 
            -
                def  | 
| 20 | 
            -
                  return enum_for(: | 
| 21 | 
            -
                   | 
| 13 | 
            +
                def reject
         | 
| 14 | 
            +
                  return enum_for(:reject) if not block_given?
         | 
| 15 | 
            +
                  select { |item| !yield(item) }
         | 
| 22 16 | 
             
                end
         | 
| 17 | 
            +
                alias :delete_if :reject
         | 
| 23 18 |  | 
| 24 19 | 
             
                # Return a new collection with all `nil` elements removed.
         | 
| 25 20 | 
             
                def compact
         | 
| 26 | 
            -
                   | 
| 21 | 
            +
                  select { |item| !item.nil? }
         | 
| 27 22 | 
             
                end
         | 
| 28 23 |  | 
| 29 24 | 
             
                # Search the collection for elements which are `#===` to `item`. Yield them to
         | 
| 30 25 | 
             
                # the optional code block if provided, and return them as a new collection.
         | 
| 31 26 | 
             
                def grep(pattern, &block)
         | 
| 32 | 
            -
                  result =  | 
| 27 | 
            +
                  result = select { |item| pattern === item }
         | 
| 33 28 | 
             
                  result = result.map(&block) if block_given?
         | 
| 34 29 | 
             
                  result
         | 
| 35 30 | 
             
                end
         | 
| @@ -61,24 +56,17 @@ module Hamster | |
| 61 56 | 
             
                  [self.class.new(a), self.class.new(b)].freeze
         | 
| 62 57 | 
             
                end
         | 
| 63 58 |  | 
| 64 | 
            -
                # Combines all elements by applying a binary operation, like `#reduce`, but unlike
         | 
| 65 | 
            -
                # `#reduce`, do so from starting from the last element to the first. In other words,
         | 
| 66 | 
            -
                # the order in which elements are yielded is the opposite of `#reduce`.
         | 
| 67 | 
            -
                def foldr(*args, &block)
         | 
| 68 | 
            -
                  reverse.reduce(*args, &block)
         | 
| 69 | 
            -
                end
         | 
| 70 | 
            -
             | 
| 71 59 | 
             
                # Groups the collection into sub-collections by the result of yielding them to
         | 
| 72 60 | 
             
                # the block. Returns a {Hash} where the keys are return values from the block,
         | 
| 73 61 | 
             
                # and the values are sub-collections. All the sub-collections are built up from
         | 
| 74 | 
            -
                # `empty_group`, which should respond to `# | 
| 62 | 
            +
                # `empty_group`, which should respond to `#add` by returning a new collection
         | 
| 75 63 | 
             
                # with an added element.
         | 
| 76 64 | 
             
                def group_by_with(empty_group, &block)
         | 
| 77 65 | 
             
                  block ||= lambda { |item| item }
         | 
| 78 66 | 
             
                  reduce(EmptyHash) do |hash, item|
         | 
| 79 67 | 
             
                    key = block.call(item)
         | 
| 80 68 | 
             
                    group = hash.get(key) || empty_group
         | 
| 81 | 
            -
                    hash.put(key, group. | 
| 69 | 
            +
                    hash.put(key, group.add(item))
         | 
| 82 70 | 
             
                  end
         | 
| 83 71 | 
             
                end
         | 
| 84 72 | 
             
                protected :group_by_with
         | 
| @@ -145,23 +133,8 @@ module Hamster | |
| 145 133 | 
             
                  end
         | 
| 146 134 | 
             
                end
         | 
| 147 135 |  | 
| 148 | 
            -
                 | 
| 149 | 
            -
                 | 
| 150 | 
            -
                def_delegator :self, :any?, :exist?
         | 
| 151 | 
            -
                def_delegator :self, :any?, :exists?
         | 
| 152 | 
            -
                def_delegator :self, :to_a, :to_ary
         | 
| 153 | 
            -
                def_delegator :self, :filter, :find_all
         | 
| 154 | 
            -
                def_delegator :self, :filter, :select # make it return a Hamster collection (and possibly make it lazy)
         | 
| 155 | 
            -
                def_delegator :self, :filter, :keep_if
         | 
| 156 | 
            -
                def_delegator :self, :include?, :contains?
         | 
| 157 | 
            -
                def_delegator :self, :include?, :elem?
         | 
| 158 | 
            -
                def_delegator :self, :max, :maximum
         | 
| 159 | 
            -
                def_delegator :self, :min, :minimum
         | 
| 160 | 
            -
                def_delegator :self, :remove, :reject # make it return a Hamster collection (and possibly make it lazy)
         | 
| 161 | 
            -
                def_delegator :self, :remove, :delete_if
         | 
| 162 | 
            -
                def_delegator :self, :reduce, :fold
         | 
| 163 | 
            -
                def_delegator :self, :find_index, :index
         | 
| 164 | 
            -
                def_delegator :self, :find_index, :elem_index
         | 
| 136 | 
            +
                alias :to_ary :to_a
         | 
| 137 | 
            +
                alias :index :find_index
         | 
| 165 138 |  | 
| 166 139 | 
             
                ## Compatibility fixes
         | 
| 167 140 |  | 
| @@ -175,4 +148,4 @@ module Hamster | |
| 175 148 | 
             
                  end
         | 
| 176 149 | 
             
                end
         | 
| 177 150 | 
             
              end
         | 
| 178 | 
            -
            end
         | 
| 151 | 
            +
            end
         | 
| @@ -1,21 +1,18 @@ | |
| 1 | 
            -
            require "forwardable"
         | 
| 2 1 | 
             
            require "hamster/deque"
         | 
| 3 2 | 
             
            require "hamster/read_copy_update"
         | 
| 4 3 |  | 
| 5 4 | 
             
            module Hamster
         | 
| 6 | 
            -
               | 
| 7 | 
            -
                MutableQueue.new(deque(*items))
         | 
| 8 | 
            -
              end
         | 
| 9 | 
            -
             | 
| 5 | 
            +
              # @api private
         | 
| 10 6 | 
             
              class MutableQueue
         | 
| 11 | 
            -
                extend Forwardable
         | 
| 12 7 | 
             
                include ReadCopyUpdate
         | 
| 13 8 |  | 
| 9 | 
            +
                def self.[](*items)
         | 
| 10 | 
            +
                  MutableQueue.new(Deque[*items])
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 14 13 | 
             
                def enqueue(item)
         | 
| 15 14 | 
             
                  transform { |queue| queue.enqueue(item) }
         | 
| 16 15 | 
             
                end
         | 
| 17 | 
            -
                def_delegate :self, :enqueue, :<<
         | 
| 18 | 
            -
                def_delegate :self, :enqueue, :add
         | 
| 19 16 |  | 
| 20 17 | 
             
                def dequeue
         | 
| 21 18 | 
             
                  head = nil
         |