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
|