immutable-ruby 0.0.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 +7 -0
- data/lib/immutable.rb +9 -0
- data/lib/immutable/core_ext.rb +2 -0
- data/lib/immutable/core_ext/enumerable.rb +11 -0
- data/lib/immutable/core_ext/io.rb +21 -0
- data/lib/immutable/deque.rb +254 -0
- data/lib/immutable/enumerable.rb +152 -0
- data/lib/immutable/hash.rb +841 -0
- data/lib/immutable/list.rb +1595 -0
- data/lib/immutable/nested.rb +75 -0
- data/lib/immutable/set.rb +583 -0
- data/lib/immutable/sorted_set.rb +1464 -0
- data/lib/immutable/trie.rb +338 -0
- data/lib/immutable/undefined.rb +5 -0
- data/lib/immutable/vector.rb +1539 -0
- data/lib/immutable/version.rb +5 -0
- data/spec/fixtures/io_spec.txt +3 -0
- data/spec/lib/immutable/core_ext/array_spec.rb +13 -0
- data/spec/lib/immutable/core_ext/enumerable_spec.rb +29 -0
- data/spec/lib/immutable/core_ext/io_spec.rb +28 -0
- data/spec/lib/immutable/deque/clear_spec.rb +33 -0
- data/spec/lib/immutable/deque/construction_spec.rb +29 -0
- data/spec/lib/immutable/deque/copying_spec.rb +19 -0
- data/spec/lib/immutable/deque/dequeue_spec.rb +34 -0
- data/spec/lib/immutable/deque/empty_spec.rb +39 -0
- data/spec/lib/immutable/deque/enqueue_spec.rb +27 -0
- data/spec/lib/immutable/deque/first_spec.rb +17 -0
- data/spec/lib/immutable/deque/inspect_spec.rb +23 -0
- data/spec/lib/immutable/deque/last_spec.rb +17 -0
- data/spec/lib/immutable/deque/marshal_spec.rb +33 -0
- data/spec/lib/immutable/deque/new_spec.rb +43 -0
- data/spec/lib/immutable/deque/pop_spec.rb +36 -0
- data/spec/lib/immutable/deque/pretty_print_spec.rb +23 -0
- data/spec/lib/immutable/deque/push_spec.rb +36 -0
- data/spec/lib/immutable/deque/random_modification_spec.rb +33 -0
- data/spec/lib/immutable/deque/shift_spec.rb +29 -0
- data/spec/lib/immutable/deque/size_spec.rb +19 -0
- data/spec/lib/immutable/deque/to_a_spec.rb +26 -0
- data/spec/lib/immutable/deque/to_ary_spec.rb +35 -0
- data/spec/lib/immutable/deque/to_list_spec.rb +24 -0
- data/spec/lib/immutable/deque/unshift_spec.rb +30 -0
- data/spec/lib/immutable/hash/all_spec.rb +53 -0
- data/spec/lib/immutable/hash/any_spec.rb +53 -0
- data/spec/lib/immutable/hash/assoc_spec.rb +51 -0
- data/spec/lib/immutable/hash/clear_spec.rb +42 -0
- data/spec/lib/immutable/hash/construction_spec.rb +38 -0
- data/spec/lib/immutable/hash/copying_spec.rb +13 -0
- data/spec/lib/immutable/hash/default_proc_spec.rb +72 -0
- data/spec/lib/immutable/hash/delete_spec.rb +39 -0
- data/spec/lib/immutable/hash/each_spec.rb +77 -0
- data/spec/lib/immutable/hash/each_with_index_spec.rb +29 -0
- data/spec/lib/immutable/hash/empty_spec.rb +43 -0
- data/spec/lib/immutable/hash/eql_spec.rb +69 -0
- data/spec/lib/immutable/hash/except_spec.rb +42 -0
- data/spec/lib/immutable/hash/fetch_spec.rb +57 -0
- data/spec/lib/immutable/hash/find_spec.rb +43 -0
- data/spec/lib/immutable/hash/flat_map_spec.rb +35 -0
- data/spec/lib/immutable/hash/flatten_spec.rb +98 -0
- data/spec/lib/immutable/hash/get_spec.rb +79 -0
- data/spec/lib/immutable/hash/has_key_spec.rb +31 -0
- data/spec/lib/immutable/hash/has_value_spec.rb +27 -0
- data/spec/lib/immutable/hash/hash_spec.rb +29 -0
- data/spec/lib/immutable/hash/inspect_spec.rb +30 -0
- data/spec/lib/immutable/hash/invert_spec.rb +30 -0
- data/spec/lib/immutable/hash/key_spec.rb +27 -0
- data/spec/lib/immutable/hash/keys_spec.rb +15 -0
- data/spec/lib/immutable/hash/map_spec.rb +45 -0
- data/spec/lib/immutable/hash/marshal_spec.rb +28 -0
- data/spec/lib/immutable/hash/merge_spec.rb +82 -0
- data/spec/lib/immutable/hash/min_max_spec.rb +45 -0
- data/spec/lib/immutable/hash/new_spec.rb +70 -0
- data/spec/lib/immutable/hash/none_spec.rb +48 -0
- data/spec/lib/immutable/hash/partition_spec.rb +35 -0
- data/spec/lib/immutable/hash/pretty_print_spec.rb +34 -0
- data/spec/lib/immutable/hash/put_spec.rb +102 -0
- data/spec/lib/immutable/hash/reduce_spec.rb +35 -0
- data/spec/lib/immutable/hash/reject_spec.rb +61 -0
- data/spec/lib/immutable/hash/reverse_each_spec.rb +27 -0
- data/spec/lib/immutable/hash/sample_spec.rb +13 -0
- data/spec/lib/immutable/hash/select_spec.rb +57 -0
- data/spec/lib/immutable/hash/size_spec.rb +51 -0
- data/spec/lib/immutable/hash/slice_spec.rb +44 -0
- data/spec/lib/immutable/hash/sort_spec.rb +26 -0
- data/spec/lib/immutable/hash/store_spec.rb +75 -0
- data/spec/lib/immutable/hash/take_spec.rb +35 -0
- data/spec/lib/immutable/hash/to_a_spec.rb +13 -0
- data/spec/lib/immutable/hash/to_hash_spec.rb +21 -0
- data/spec/lib/immutable/hash/update_in_spec.rb +79 -0
- data/spec/lib/immutable/hash/values_at_spec.rb +13 -0
- data/spec/lib/immutable/hash/values_spec.rb +23 -0
- data/spec/lib/immutable/list/add_spec.rb +25 -0
- data/spec/lib/immutable/list/all_spec.rb +57 -0
- data/spec/lib/immutable/list/any_spec.rb +49 -0
- data/spec/lib/immutable/list/append_spec.rb +38 -0
- data/spec/lib/immutable/list/at_spec.rb +29 -0
- data/spec/lib/immutable/list/break_spec.rb +69 -0
- data/spec/lib/immutable/list/cadr_spec.rb +38 -0
- data/spec/lib/immutable/list/chunk_spec.rb +28 -0
- data/spec/lib/immutable/list/clear_spec.rb +24 -0
- data/spec/lib/immutable/list/combination_spec.rb +33 -0
- data/spec/lib/immutable/list/compact_spec.rb +34 -0
- data/spec/lib/immutable/list/compare_spec.rb +30 -0
- data/spec/lib/immutable/list/cons_spec.rb +25 -0
- data/spec/lib/immutable/list/construction_spec.rb +110 -0
- data/spec/lib/immutable/list/copying_spec.rb +19 -0
- data/spec/lib/immutable/list/count_spec.rb +36 -0
- data/spec/lib/immutable/list/cycle_spec.rb +28 -0
- data/spec/lib/immutable/list/delete_at_spec.rb +18 -0
- data/spec/lib/immutable/list/delete_spec.rb +16 -0
- data/spec/lib/immutable/list/drop_spec.rb +30 -0
- data/spec/lib/immutable/list/drop_while_spec.rb +38 -0
- data/spec/lib/immutable/list/each_slice_spec.rb +51 -0
- data/spec/lib/immutable/list/each_spec.rb +40 -0
- data/spec/lib/immutable/list/each_with_index_spec.rb +28 -0
- data/spec/lib/immutable/list/empty_spec.rb +23 -0
- data/spec/lib/immutable/list/eql_spec.rb +61 -0
- data/spec/lib/immutable/list/fill_spec.rb +49 -0
- data/spec/lib/immutable/list/find_all_spec.rb +70 -0
- data/spec/lib/immutable/list/find_index_spec.rb +35 -0
- data/spec/lib/immutable/list/find_spec.rb +42 -0
- data/spec/lib/immutable/list/flat_map_spec.rb +51 -0
- data/spec/lib/immutable/list/flatten_spec.rb +30 -0
- data/spec/lib/immutable/list/grep_spec.rb +46 -0
- data/spec/lib/immutable/list/group_by_spec.rb +41 -0
- data/spec/lib/immutable/list/hash_spec.rb +21 -0
- data/spec/lib/immutable/list/head_spec.rb +19 -0
- data/spec/lib/immutable/list/include_spec.rb +35 -0
- data/spec/lib/immutable/list/index_spec.rb +33 -0
- data/spec/lib/immutable/list/indices_spec.rb +61 -0
- data/spec/lib/immutable/list/init_spec.rb +28 -0
- data/spec/lib/immutable/list/inits_spec.rb +28 -0
- data/spec/lib/immutable/list/insert_spec.rb +46 -0
- data/spec/lib/immutable/list/inspect_spec.rb +29 -0
- data/spec/lib/immutable/list/intersperse_spec.rb +28 -0
- data/spec/lib/immutable/list/join_spec.rb +63 -0
- data/spec/lib/immutable/list/last_spec.rb +23 -0
- data/spec/lib/immutable/list/ltlt_spec.rb +19 -0
- data/spec/lib/immutable/list/map_spec.rb +45 -0
- data/spec/lib/immutable/list/maximum_spec.rb +39 -0
- data/spec/lib/immutable/list/merge_by_spec.rb +51 -0
- data/spec/lib/immutable/list/merge_spec.rb +59 -0
- data/spec/lib/immutable/list/minimum_spec.rb +39 -0
- data/spec/lib/immutable/list/multithreading_spec.rb +47 -0
- data/spec/lib/immutable/list/none_spec.rb +47 -0
- data/spec/lib/immutable/list/one_spec.rb +49 -0
- data/spec/lib/immutable/list/partition_spec.rb +115 -0
- data/spec/lib/immutable/list/permutation_spec.rb +55 -0
- data/spec/lib/immutable/list/pop_spec.rb +25 -0
- data/spec/lib/immutable/list/product_spec.rb +23 -0
- data/spec/lib/immutable/list/reduce_spec.rb +53 -0
- data/spec/lib/immutable/list/reject_spec.rb +45 -0
- data/spec/lib/immutable/list/reverse_spec.rb +34 -0
- data/spec/lib/immutable/list/rotate_spec.rb +36 -0
- data/spec/lib/immutable/list/sample_spec.rb +13 -0
- data/spec/lib/immutable/list/select_spec.rb +70 -0
- data/spec/lib/immutable/list/size_spec.rb +25 -0
- data/spec/lib/immutable/list/slice_spec.rb +229 -0
- data/spec/lib/immutable/list/sorting_spec.rb +46 -0
- data/spec/lib/immutable/list/span_spec.rb +76 -0
- data/spec/lib/immutable/list/split_at_spec.rb +43 -0
- data/spec/lib/immutable/list/subsequences_spec.rb +23 -0
- data/spec/lib/immutable/list/sum_spec.rb +23 -0
- data/spec/lib/immutable/list/tail_spec.rb +30 -0
- data/spec/lib/immutable/list/tails_spec.rb +28 -0
- data/spec/lib/immutable/list/take_spec.rb +30 -0
- data/spec/lib/immutable/list/take_while_spec.rb +46 -0
- data/spec/lib/immutable/list/to_a_spec.rb +39 -0
- data/spec/lib/immutable/list/to_ary_spec.rb +41 -0
- data/spec/lib/immutable/list/to_list_spec.rb +19 -0
- data/spec/lib/immutable/list/to_set_spec.rb +17 -0
- data/spec/lib/immutable/list/transpose_spec.rb +19 -0
- data/spec/lib/immutable/list/union_spec.rb +31 -0
- data/spec/lib/immutable/list/uniq_spec.rb +35 -0
- data/spec/lib/immutable/list/zip_spec.rb +23 -0
- data/spec/lib/immutable/nested/construction_spec.rb +95 -0
- data/spec/lib/immutable/set/add_spec.rb +75 -0
- data/spec/lib/immutable/set/all_spec.rb +51 -0
- data/spec/lib/immutable/set/any_spec.rb +51 -0
- data/spec/lib/immutable/set/clear_spec.rb +33 -0
- data/spec/lib/immutable/set/compact_spec.rb +30 -0
- data/spec/lib/immutable/set/construction_spec.rb +18 -0
- data/spec/lib/immutable/set/copying_spec.rb +13 -0
- data/spec/lib/immutable/set/count_spec.rb +36 -0
- data/spec/lib/immutable/set/delete_spec.rb +71 -0
- data/spec/lib/immutable/set/difference_spec.rb +49 -0
- data/spec/lib/immutable/set/disjoint_spec.rb +25 -0
- data/spec/lib/immutable/set/each_spec.rb +45 -0
- data/spec/lib/immutable/set/empty_spec.rb +44 -0
- data/spec/lib/immutable/set/eqeq_spec.rb +103 -0
- data/spec/lib/immutable/set/eql_spec.rb +109 -0
- data/spec/lib/immutable/set/exclusion_spec.rb +47 -0
- data/spec/lib/immutable/set/find_spec.rb +35 -0
- data/spec/lib/immutable/set/first_spec.rb +28 -0
- data/spec/lib/immutable/set/flatten_spec.rb +46 -0
- data/spec/lib/immutable/set/grep_spec.rb +57 -0
- data/spec/lib/immutable/set/group_by_spec.rb +59 -0
- data/spec/lib/immutable/set/hash_spec.rb +22 -0
- data/spec/lib/immutable/set/include_spec.rb +60 -0
- data/spec/lib/immutable/set/inspect_spec.rb +47 -0
- data/spec/lib/immutable/set/intersect_spec.rb +25 -0
- data/spec/lib/immutable/set/intersection_spec.rb +52 -0
- data/spec/lib/immutable/set/join_spec.rb +64 -0
- data/spec/lib/immutable/set/map_spec.rb +59 -0
- data/spec/lib/immutable/set/marshal_spec.rb +28 -0
- data/spec/lib/immutable/set/maximum_spec.rb +36 -0
- data/spec/lib/immutable/set/minimum_spec.rb +36 -0
- data/spec/lib/immutable/set/new_spec.rb +53 -0
- data/spec/lib/immutable/set/none_spec.rb +47 -0
- data/spec/lib/immutable/set/one_spec.rb +47 -0
- data/spec/lib/immutable/set/partition_spec.rb +52 -0
- data/spec/lib/immutable/set/product_spec.rb +23 -0
- data/spec/lib/immutable/set/reduce_spec.rb +55 -0
- data/spec/lib/immutable/set/reject_spec.rb +50 -0
- data/spec/lib/immutable/set/reverse_each_spec.rb +38 -0
- data/spec/lib/immutable/set/sample_spec.rb +13 -0
- data/spec/lib/immutable/set/select_spec.rb +73 -0
- data/spec/lib/immutable/set/size_spec.rb +17 -0
- data/spec/lib/immutable/set/sorting_spec.rb +59 -0
- data/spec/lib/immutable/set/subset_spec.rb +51 -0
- data/spec/lib/immutable/set/sum_spec.rb +23 -0
- data/spec/lib/immutable/set/superset_spec.rb +51 -0
- data/spec/lib/immutable/set/to_a_spec.rb +30 -0
- data/spec/lib/immutable/set/to_list_spec.rb +35 -0
- data/spec/lib/immutable/set/to_set_spec.rb +19 -0
- data/spec/lib/immutable/set/union_spec.rb +63 -0
- data/spec/lib/immutable/sorted_set/above_spec.rb +51 -0
- data/spec/lib/immutable/sorted_set/add_spec.rb +62 -0
- data/spec/lib/immutable/sorted_set/at_spec.rb +24 -0
- data/spec/lib/immutable/sorted_set/below_spec.rb +51 -0
- data/spec/lib/immutable/sorted_set/between_spec.rb +51 -0
- data/spec/lib/immutable/sorted_set/clear_spec.rb +43 -0
- data/spec/lib/immutable/sorted_set/copying_spec.rb +20 -0
- data/spec/lib/immutable/sorted_set/delete_at_spec.rb +18 -0
- data/spec/lib/immutable/sorted_set/delete_spec.rb +89 -0
- data/spec/lib/immutable/sorted_set/difference_spec.rb +22 -0
- data/spec/lib/immutable/sorted_set/disjoint_spec.rb +25 -0
- data/spec/lib/immutable/sorted_set/drop_spec.rb +55 -0
- data/spec/lib/immutable/sorted_set/drop_while_spec.rb +34 -0
- data/spec/lib/immutable/sorted_set/each_spec.rb +28 -0
- data/spec/lib/immutable/sorted_set/empty_spec.rb +34 -0
- data/spec/lib/immutable/sorted_set/eql_spec.rb +120 -0
- data/spec/lib/immutable/sorted_set/exclusion_spec.rb +22 -0
- data/spec/lib/immutable/sorted_set/fetch_spec.rb +64 -0
- data/spec/lib/immutable/sorted_set/find_index_spec.rb +40 -0
- data/spec/lib/immutable/sorted_set/first_spec.rb +18 -0
- data/spec/lib/immutable/sorted_set/from_spec.rb +51 -0
- data/spec/lib/immutable/sorted_set/group_by_spec.rb +57 -0
- data/spec/lib/immutable/sorted_set/include_spec.rb +23 -0
- data/spec/lib/immutable/sorted_set/inspect_spec.rb +37 -0
- data/spec/lib/immutable/sorted_set/intersect_spec.rb +25 -0
- data/spec/lib/immutable/sorted_set/intersection_spec.rb +28 -0
- data/spec/lib/immutable/sorted_set/last_spec.rb +36 -0
- data/spec/lib/immutable/sorted_set/map_spec.rb +43 -0
- data/spec/lib/immutable/sorted_set/marshal_spec.rb +36 -0
- data/spec/lib/immutable/sorted_set/maximum_spec.rb +36 -0
- data/spec/lib/immutable/sorted_set/minimum_spec.rb +19 -0
- data/spec/lib/immutable/sorted_set/new_spec.rb +71 -0
- data/spec/lib/immutable/sorted_set/reverse_each_spec.rb +28 -0
- data/spec/lib/immutable/sorted_set/sample_spec.rb +13 -0
- data/spec/lib/immutable/sorted_set/select_spec.rb +61 -0
- data/spec/lib/immutable/sorted_set/size_spec.rb +17 -0
- data/spec/lib/immutable/sorted_set/slice_spec.rb +256 -0
- data/spec/lib/immutable/sorted_set/sorting_spec.rb +44 -0
- data/spec/lib/immutable/sorted_set/subset_spec.rb +47 -0
- data/spec/lib/immutable/sorted_set/superset_spec.rb +47 -0
- data/spec/lib/immutable/sorted_set/take_spec.rb +54 -0
- data/spec/lib/immutable/sorted_set/take_while_spec.rb +33 -0
- data/spec/lib/immutable/sorted_set/to_set_spec.rb +17 -0
- data/spec/lib/immutable/sorted_set/union_spec.rb +27 -0
- data/spec/lib/immutable/sorted_set/up_to_spec.rb +52 -0
- data/spec/lib/immutable/sorted_set/values_at_spec.rb +33 -0
- data/spec/lib/immutable/vector/add_spec.rb +67 -0
- data/spec/lib/immutable/vector/any_spec.rb +69 -0
- data/spec/lib/immutable/vector/assoc_spec.rb +45 -0
- data/spec/lib/immutable/vector/bsearch_spec.rb +65 -0
- data/spec/lib/immutable/vector/clear_spec.rb +33 -0
- data/spec/lib/immutable/vector/combination_spec.rb +81 -0
- data/spec/lib/immutable/vector/compact_spec.rb +29 -0
- data/spec/lib/immutable/vector/compare_spec.rb +31 -0
- data/spec/lib/immutable/vector/concat_spec.rb +34 -0
- data/spec/lib/immutable/vector/copying_spec.rb +20 -0
- data/spec/lib/immutable/vector/count_spec.rb +17 -0
- data/spec/lib/immutable/vector/delete_at_spec.rb +53 -0
- data/spec/lib/immutable/vector/delete_spec.rb +30 -0
- data/spec/lib/immutable/vector/drop_spec.rb +41 -0
- data/spec/lib/immutable/vector/drop_while_spec.rb +54 -0
- data/spec/lib/immutable/vector/each_index_spec.rb +40 -0
- data/spec/lib/immutable/vector/each_spec.rb +44 -0
- data/spec/lib/immutable/vector/each_with_index_spec.rb +39 -0
- data/spec/lib/immutable/vector/empty_spec.rb +41 -0
- data/spec/lib/immutable/vector/eql_spec.rb +76 -0
- data/spec/lib/immutable/vector/fetch_spec.rb +64 -0
- data/spec/lib/immutable/vector/fill_spec.rb +88 -0
- data/spec/lib/immutable/vector/first_spec.rb +18 -0
- data/spec/lib/immutable/vector/flat_map_spec.rb +50 -0
- data/spec/lib/immutable/vector/flatten_spec.rb +58 -0
- data/spec/lib/immutable/vector/get_spec.rb +74 -0
- data/spec/lib/immutable/vector/group_by_spec.rb +57 -0
- data/spec/lib/immutable/vector/include_spec.rb +30 -0
- data/spec/lib/immutable/vector/insert_spec.rb +68 -0
- data/spec/lib/immutable/vector/inspect_spec.rb +49 -0
- data/spec/lib/immutable/vector/join_spec.rb +58 -0
- data/spec/lib/immutable/vector/last_spec.rb +45 -0
- data/spec/lib/immutable/vector/length_spec.rb +45 -0
- data/spec/lib/immutable/vector/ltlt_spec.rb +65 -0
- data/spec/lib/immutable/vector/map_spec.rb +51 -0
- data/spec/lib/immutable/vector/marshal_spec.rb +31 -0
- data/spec/lib/immutable/vector/maximum_spec.rb +33 -0
- data/spec/lib/immutable/vector/minimum_spec.rb +33 -0
- data/spec/lib/immutable/vector/multiply_spec.rb +47 -0
- data/spec/lib/immutable/vector/new_spec.rb +50 -0
- data/spec/lib/immutable/vector/partition_spec.rb +52 -0
- data/spec/lib/immutable/vector/permutation_spec.rb +91 -0
- data/spec/lib/immutable/vector/pop_spec.rb +26 -0
- data/spec/lib/immutable/vector/product_spec.rb +70 -0
- data/spec/lib/immutable/vector/reduce_spec.rb +55 -0
- data/spec/lib/immutable/vector/reject_spec.rb +43 -0
- data/spec/lib/immutable/vector/repeated_combination_spec.rb +77 -0
- data/spec/lib/immutable/vector/repeated_permutation_spec.rb +93 -0
- data/spec/lib/immutable/vector/reverse_each_spec.rb +31 -0
- data/spec/lib/immutable/vector/reverse_spec.rb +21 -0
- data/spec/lib/immutable/vector/rindex_spec.rb +36 -0
- data/spec/lib/immutable/vector/rotate_spec.rb +73 -0
- data/spec/lib/immutable/vector/sample_spec.rb +13 -0
- data/spec/lib/immutable/vector/select_spec.rb +63 -0
- data/spec/lib/immutable/vector/set_spec.rb +174 -0
- data/spec/lib/immutable/vector/shift_spec.rb +27 -0
- data/spec/lib/immutable/vector/shuffle_spec.rb +43 -0
- data/spec/lib/immutable/vector/slice_spec.rb +240 -0
- data/spec/lib/immutable/vector/sorting_spec.rb +56 -0
- data/spec/lib/immutable/vector/sum_spec.rb +17 -0
- data/spec/lib/immutable/vector/take_spec.rb +42 -0
- data/spec/lib/immutable/vector/take_while_spec.rb +34 -0
- data/spec/lib/immutable/vector/to_a_spec.rb +41 -0
- data/spec/lib/immutable/vector/to_ary_spec.rb +34 -0
- data/spec/lib/immutable/vector/to_list_spec.rb +30 -0
- data/spec/lib/immutable/vector/to_set_spec.rb +21 -0
- data/spec/lib/immutable/vector/transpose_spec.rb +48 -0
- data/spec/lib/immutable/vector/uniq_spec.rb +76 -0
- data/spec/lib/immutable/vector/unshift_spec.rb +28 -0
- data/spec/lib/immutable/vector/update_in_spec.rb +82 -0
- data/spec/lib/immutable/vector/values_at_spec.rb +33 -0
- data/spec/lib/immutable/vector/zip_spec.rb +57 -0
- data/spec/lib/load_spec.rb +42 -0
- data/spec/spec_helper.rb +92 -0
- metadata +830 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Immutable::List do
|
4
|
+
describe "#none?" do
|
5
|
+
context "on a really big list" do
|
6
|
+
it "doesn't run out of stack" do
|
7
|
+
-> { Immutable.interval(0, STACK_OVERFLOW_DEPTH).none? { false } }.should_not raise_error
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
context "when empty" do
|
12
|
+
it "with a block returns true" do
|
13
|
+
L.empty.none? {}.should == true
|
14
|
+
end
|
15
|
+
|
16
|
+
it "with no block returns true" do
|
17
|
+
L.empty.none?.should == true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "when not empty" do
|
22
|
+
context "with a block" do
|
23
|
+
let(:list) { L["A", "B", "C", nil] }
|
24
|
+
|
25
|
+
["A", "B", "C", nil].each do |value|
|
26
|
+
it "returns false if the block ever returns true (#{value.inspect})" do
|
27
|
+
list.none? { |item| item == value }.should == false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it "returns true if the block always returns false" do
|
32
|
+
list.none? { |item| item == "D" }.should == true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "with no block" do
|
37
|
+
it "returns false if any value is truthy" do
|
38
|
+
L[nil, false, true, "A"].none?.should == false
|
39
|
+
end
|
40
|
+
|
41
|
+
it "returns true if all values are falsey" do
|
42
|
+
L[nil, false].none?.should == true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Immutable::List do
|
4
|
+
describe "#one?" do
|
5
|
+
context "on a really big list" do
|
6
|
+
it "doesn't run out of stack" do
|
7
|
+
-> { Immutable.interval(0, STACK_OVERFLOW_DEPTH).one? { false } }.should_not raise_error
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
context "when empty" do
|
12
|
+
it "with a block returns false" do
|
13
|
+
L.empty.one? {}.should == false
|
14
|
+
end
|
15
|
+
|
16
|
+
it "with no block returns false" do
|
17
|
+
L.empty.one?.should == false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "when not empty" do
|
22
|
+
context "with a block" do
|
23
|
+
let(:list) { L["A", "B", "C"] }
|
24
|
+
|
25
|
+
it "returns false if the block returns true more than once" do
|
26
|
+
list.one? { |item| true }.should == false
|
27
|
+
end
|
28
|
+
|
29
|
+
it "returns false if the block never returns true" do
|
30
|
+
list.one? { |item| false }.should == false
|
31
|
+
end
|
32
|
+
|
33
|
+
it "returns true if the block only returns true once" do
|
34
|
+
list.one? { |item| item == "A" }.should == true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "with no block" do
|
39
|
+
it "returns false if more than one value is truthy" do
|
40
|
+
L[nil, true, "A"].one?.should == false
|
41
|
+
end
|
42
|
+
|
43
|
+
it "returns true if only one value is truthy" do
|
44
|
+
L[nil, true, false].one?.should == true
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "thread"
|
3
|
+
|
4
|
+
describe Immutable::List do
|
5
|
+
describe "#partition" do
|
6
|
+
it "is lazy" do
|
7
|
+
-> { Immutable.stream { fail }.partition }.should_not raise_error
|
8
|
+
end
|
9
|
+
|
10
|
+
it "calls the passed block only once for each item" do
|
11
|
+
count = 0
|
12
|
+
a,b = L[1, 2, 3].partition { |item| count += 1; item.odd? }
|
13
|
+
(a.size + b.size).should be(3) # force realization of lazy lists
|
14
|
+
count.should be(3)
|
15
|
+
end
|
16
|
+
|
17
|
+
# note: Lists are not as lazy as they could be!
|
18
|
+
# they always realize elements a bit ahead of the current one
|
19
|
+
|
20
|
+
it "returns a lazy list of items for which predicate is true" do
|
21
|
+
count = 0
|
22
|
+
a,b = L[1, 2, 3, 4].partition { |item| count += 1; item.odd? }
|
23
|
+
a.take(1).should == [1]
|
24
|
+
count.should be(3) # would be 1 if lists were lazier
|
25
|
+
a.take(2).should == [1, 3]
|
26
|
+
count.should be(4) # would be 3 if lists were lazier
|
27
|
+
end
|
28
|
+
|
29
|
+
it "returns a lazy list of items for which predicate is false" do
|
30
|
+
count = 0
|
31
|
+
a,b = L[1, 2, 3, 4].partition { |item| count += 1; item.odd? }
|
32
|
+
b.take(1).should == [2]
|
33
|
+
count.should be(4) # would be 2 if lists were lazier
|
34
|
+
b.take(2).should == [2, 4]
|
35
|
+
count.should be(4)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "calls the passed block only once for each item, even with multiple threads" do
|
39
|
+
mutex = Mutex.new
|
40
|
+
yielded = [] # record all the numbers yielded to the block, to make sure each is yielded only once
|
41
|
+
list = Immutable.iterate(0) do |n|
|
42
|
+
sleep(rand / 500) # give another thread a chance to get in
|
43
|
+
mutex.synchronize { yielded << n }
|
44
|
+
sleep(rand / 500)
|
45
|
+
n + 1
|
46
|
+
end
|
47
|
+
left, right = list.partition(&:odd?)
|
48
|
+
|
49
|
+
10.times.collect do |i|
|
50
|
+
Thread.new do
|
51
|
+
# half of the threads will consume the "left" lazy list, while half consume
|
52
|
+
# the "right" lazy list
|
53
|
+
# make sure that only one thread will run the above "iterate" block at a
|
54
|
+
# time, regardless
|
55
|
+
if i % 2 == 0
|
56
|
+
left.take(100).sum.should == 10000
|
57
|
+
else
|
58
|
+
right.take(100).sum.should == 9900
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end.each(&:join)
|
62
|
+
|
63
|
+
# if no threads "stepped on" each other, the following should be true
|
64
|
+
# make some allowance for "lazy" lists which actually realize a little bit ahead:
|
65
|
+
(200..203).include?(yielded.size).should == true
|
66
|
+
yielded.should == (0..(yielded.size-1)).to_a
|
67
|
+
end
|
68
|
+
|
69
|
+
[
|
70
|
+
[[], [], []],
|
71
|
+
[[1], [1], []],
|
72
|
+
[[1, 2], [1], [2]],
|
73
|
+
[[1, 2, 3], [1, 3], [2]],
|
74
|
+
[[1, 2, 3, 4], [1, 3], [2, 4]],
|
75
|
+
[[2, 3, 4], [3], [2, 4]],
|
76
|
+
[[3, 4], [3], [4]],
|
77
|
+
[[4], [], [4]],
|
78
|
+
].each do |values, expected_matches, expected_remainder|
|
79
|
+
context "on #{values.inspect}" do
|
80
|
+
let(:list) { L[*values] }
|
81
|
+
|
82
|
+
context "with a block" do
|
83
|
+
let(:result) { list.partition(&:odd?) }
|
84
|
+
let(:matches) { result.first }
|
85
|
+
let(:remainder) { result.last }
|
86
|
+
|
87
|
+
it "preserves the original" do
|
88
|
+
list.should eql(L[*values])
|
89
|
+
end
|
90
|
+
|
91
|
+
it "returns a frozen array with two items" do
|
92
|
+
result.class.should be(Array)
|
93
|
+
result.should be_frozen
|
94
|
+
result.size.should be(2)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "correctly identifies the matches" do
|
98
|
+
matches.should eql(L[*expected_matches])
|
99
|
+
end
|
100
|
+
|
101
|
+
it "correctly identifies the remainder" do
|
102
|
+
remainder.should eql(L[*expected_remainder])
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context "without a block" do
|
107
|
+
it "returns an Enumerator" do
|
108
|
+
list.partition.class.should be(Enumerator)
|
109
|
+
list.partition.each(&:odd?).should eql([L[*expected_matches], L[*expected_remainder]])
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Immutable::List do
|
4
|
+
describe "#permutation" do
|
5
|
+
let(:list) { L[1,2,3,4] }
|
6
|
+
|
7
|
+
context "with no block" do
|
8
|
+
it "returns an Enumerator" do
|
9
|
+
list.permutation.class.should be(Enumerator)
|
10
|
+
list.permutation.to_a.sort.should == [1,2,3,4].permutation.to_a.sort
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context "with no argument" do
|
15
|
+
it "yields all permutations of the list" do
|
16
|
+
perms = list.permutation.to_a
|
17
|
+
perms.size.should be(24)
|
18
|
+
perms.sort.should == [1,2,3,4].permutation.to_a.sort
|
19
|
+
perms.each { |item| item.should be_kind_of(Immutable::List) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "with a length argument" do
|
24
|
+
it "yields all N-size permutations of the list" do
|
25
|
+
perms = list.permutation(2).to_a
|
26
|
+
perms.size.should be(12)
|
27
|
+
perms.sort.should == [1,2,3,4].permutation(2).to_a.sort
|
28
|
+
perms.each { |item| item.should be_kind_of(Immutable::List) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "with a length argument greater than length of list" do
|
33
|
+
it "yields nothing" do
|
34
|
+
list.permutation(5).to_a.should be_empty
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "with a length argument of 0" do
|
39
|
+
it "yields an empty list" do
|
40
|
+
perms = list.permutation(0).to_a
|
41
|
+
perms.size.should be(1)
|
42
|
+
perms[0].should be_kind_of(Immutable::List)
|
43
|
+
perms[0].should be_empty
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "with a block" do
|
48
|
+
it "returns the original list" do
|
49
|
+
list.permutation(0) {}.should be(list)
|
50
|
+
list.permutation(1) {}.should be(list)
|
51
|
+
list.permutation {}.should be(list)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Immutable::List do
|
4
|
+
let(:list) { L[*values] }
|
5
|
+
|
6
|
+
describe "#pop" do
|
7
|
+
let(:pop) { list.pop }
|
8
|
+
|
9
|
+
context "with an empty list" do
|
10
|
+
let(:values) { [] }
|
11
|
+
|
12
|
+
it "returns an empty list" do
|
13
|
+
expect(pop).to eq(L.empty)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "with a list with a few items" do
|
18
|
+
let(:values) { %w[a b c] }
|
19
|
+
|
20
|
+
it "removes the last item" do
|
21
|
+
expect(pop).to eq(L["a", "b"])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Immutable::List do
|
4
|
+
describe "#product" do
|
5
|
+
context "on a really big list" do
|
6
|
+
it "doesn't run out of stack" do
|
7
|
+
-> { Immutable.interval(0, STACK_OVERFLOW_DEPTH).product }.should_not raise_error
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
[
|
12
|
+
[[], 1],
|
13
|
+
[[2], 2],
|
14
|
+
[[1, 3, 5, 7, 11], 1155],
|
15
|
+
].each do |values, expected|
|
16
|
+
context "on #{values.inspect}" do
|
17
|
+
it "returns #{expected.inspect}" do
|
18
|
+
L[*values].product.should == expected
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Immutable::List do
|
4
|
+
[:reduce, :inject].each do |method|
|
5
|
+
describe "##{method}" do
|
6
|
+
context "on a really big list" do
|
7
|
+
it "doesn't run out of stack" do
|
8
|
+
-> { Immutable.interval(0, STACK_OVERFLOW_DEPTH).send(method, &:+) }.should_not raise_error
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
[
|
13
|
+
[[], 10, 10],
|
14
|
+
[[1], 10, 9],
|
15
|
+
[[1, 2, 3], 10, 4],
|
16
|
+
].each do |values, initial, expected|
|
17
|
+
context "on #{values.inspect}" do
|
18
|
+
context "with an initial value of #{initial} and a block" do
|
19
|
+
it "returns #{expected.inspect}" do
|
20
|
+
L[*values].send(method, initial) { |memo, item| memo - item }.should == expected
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
[
|
27
|
+
[[], nil],
|
28
|
+
[[1], 1],
|
29
|
+
[[1, 2, 3], -4],
|
30
|
+
].each do |values, expected|
|
31
|
+
context "on #{values.inspect}" do
|
32
|
+
context "with no initial value and a block" do
|
33
|
+
it "returns #{expected.inspect}" do
|
34
|
+
L[*values].send(method) { |memo, item| memo - item }.should == expected
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "with no block and a symbol argument" do
|
41
|
+
it "uses the symbol as the name of a method to reduce with" do
|
42
|
+
L[1, 2, 3].send(method, :+).should == 6
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "with no block and a string argument" do
|
47
|
+
it "uses the string as the name of a method to reduce with" do
|
48
|
+
L[1, 2, 3].send(method, '+').should == 6
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Immutable::List do
|
4
|
+
[:reject, :delete_if].each do |method|
|
5
|
+
describe "##{method}" do
|
6
|
+
it "is lazy" do
|
7
|
+
-> { Immutable.stream { fail }.send(method) { |item| false } }.should_not raise_error
|
8
|
+
end
|
9
|
+
|
10
|
+
[
|
11
|
+
[[], []],
|
12
|
+
[["A"], ["A"]],
|
13
|
+
[%w[A B C], %w[A B C]],
|
14
|
+
[%w[A b C], %w[A C]],
|
15
|
+
[%w[a b c], []],
|
16
|
+
].each do |values, expected|
|
17
|
+
context "on #{values.inspect}" do
|
18
|
+
let(:list) { L[*values] }
|
19
|
+
|
20
|
+
context "with a block" do
|
21
|
+
it "returns #{expected.inspect}" do
|
22
|
+
list.send(method) { |item| item == item.downcase }.should eql(L[*expected])
|
23
|
+
end
|
24
|
+
|
25
|
+
it "is lazy" do
|
26
|
+
count = 0
|
27
|
+
list.send(method) do |item|
|
28
|
+
count += 1
|
29
|
+
false
|
30
|
+
end
|
31
|
+
count.should <= 1
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "without a block" do
|
36
|
+
it "returns an Enumerator" do
|
37
|
+
list.send(method).class.should be(Enumerator)
|
38
|
+
list.send(method).each { |item| item == item.downcase }.should eql(L[*expected])
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Immutable::List do
|
4
|
+
describe "#reverse" do
|
5
|
+
context "on a really big list" do
|
6
|
+
it "doesn't run out of stack" do
|
7
|
+
-> { Immutable.interval(0, STACK_OVERFLOW_DEPTH).reverse }.should_not raise_error
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
it "is lazy" do
|
12
|
+
-> { Immutable.stream { fail }.reverse }.should_not raise_error
|
13
|
+
end
|
14
|
+
|
15
|
+
[
|
16
|
+
[[], []],
|
17
|
+
[["A"], ["A"]],
|
18
|
+
[%w[A B C], %w[C B A]],
|
19
|
+
].each do |values, expected|
|
20
|
+
context "on #{values.inspect}" do
|
21
|
+
let(:list) { L[*values] }
|
22
|
+
|
23
|
+
it "preserves the original" do
|
24
|
+
list.reverse { |item| item.downcase }
|
25
|
+
list.should eql(L[*values])
|
26
|
+
end
|
27
|
+
|
28
|
+
it "returns #{expected.inspect}" do
|
29
|
+
list.reverse { |item| item.downcase }.should == L[*expected]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|