immutable-ruby 0.0.1 → 0.1.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.
Files changed (345) hide show
  1. checksums.yaml +5 -5
  2. data/lib/immutable/core_ext/enumerable.rb +1 -1
  3. data/lib/immutable/core_ext/io.rb +1 -1
  4. data/lib/immutable/core_ext.rb +2 -2
  5. data/lib/immutable/deque.rb +50 -15
  6. data/lib/immutable/enumerable.rb +19 -10
  7. data/lib/immutable/hash.rb +128 -28
  8. data/lib/immutable/list.rb +48 -48
  9. data/lib/immutable/nested.rb +10 -7
  10. data/lib/immutable/set.rb +30 -30
  11. data/lib/immutable/sorted_set.rb +77 -37
  12. data/lib/immutable/trie.rb +21 -29
  13. data/lib/immutable/vector.rb +61 -46
  14. data/lib/immutable/version.rb +1 -1
  15. data/lib/immutable.rb +9 -9
  16. metadata +44 -687
  17. data/spec/fixtures/io_spec.txt +0 -3
  18. data/spec/lib/immutable/core_ext/array_spec.rb +0 -13
  19. data/spec/lib/immutable/core_ext/enumerable_spec.rb +0 -29
  20. data/spec/lib/immutable/core_ext/io_spec.rb +0 -28
  21. data/spec/lib/immutable/deque/clear_spec.rb +0 -33
  22. data/spec/lib/immutable/deque/construction_spec.rb +0 -29
  23. data/spec/lib/immutable/deque/copying_spec.rb +0 -19
  24. data/spec/lib/immutable/deque/dequeue_spec.rb +0 -34
  25. data/spec/lib/immutable/deque/empty_spec.rb +0 -39
  26. data/spec/lib/immutable/deque/enqueue_spec.rb +0 -27
  27. data/spec/lib/immutable/deque/first_spec.rb +0 -17
  28. data/spec/lib/immutable/deque/inspect_spec.rb +0 -23
  29. data/spec/lib/immutable/deque/last_spec.rb +0 -17
  30. data/spec/lib/immutable/deque/marshal_spec.rb +0 -33
  31. data/spec/lib/immutable/deque/new_spec.rb +0 -43
  32. data/spec/lib/immutable/deque/pop_spec.rb +0 -36
  33. data/spec/lib/immutable/deque/pretty_print_spec.rb +0 -23
  34. data/spec/lib/immutable/deque/push_spec.rb +0 -36
  35. data/spec/lib/immutable/deque/random_modification_spec.rb +0 -33
  36. data/spec/lib/immutable/deque/shift_spec.rb +0 -29
  37. data/spec/lib/immutable/deque/size_spec.rb +0 -19
  38. data/spec/lib/immutable/deque/to_a_spec.rb +0 -26
  39. data/spec/lib/immutable/deque/to_ary_spec.rb +0 -35
  40. data/spec/lib/immutable/deque/to_list_spec.rb +0 -24
  41. data/spec/lib/immutable/deque/unshift_spec.rb +0 -30
  42. data/spec/lib/immutable/hash/all_spec.rb +0 -53
  43. data/spec/lib/immutable/hash/any_spec.rb +0 -53
  44. data/spec/lib/immutable/hash/assoc_spec.rb +0 -51
  45. data/spec/lib/immutable/hash/clear_spec.rb +0 -42
  46. data/spec/lib/immutable/hash/construction_spec.rb +0 -38
  47. data/spec/lib/immutable/hash/copying_spec.rb +0 -13
  48. data/spec/lib/immutable/hash/default_proc_spec.rb +0 -72
  49. data/spec/lib/immutable/hash/delete_spec.rb +0 -39
  50. data/spec/lib/immutable/hash/each_spec.rb +0 -77
  51. data/spec/lib/immutable/hash/each_with_index_spec.rb +0 -29
  52. data/spec/lib/immutable/hash/empty_spec.rb +0 -43
  53. data/spec/lib/immutable/hash/eql_spec.rb +0 -69
  54. data/spec/lib/immutable/hash/except_spec.rb +0 -42
  55. data/spec/lib/immutable/hash/fetch_spec.rb +0 -57
  56. data/spec/lib/immutable/hash/find_spec.rb +0 -43
  57. data/spec/lib/immutable/hash/flat_map_spec.rb +0 -35
  58. data/spec/lib/immutable/hash/flatten_spec.rb +0 -98
  59. data/spec/lib/immutable/hash/get_spec.rb +0 -79
  60. data/spec/lib/immutable/hash/has_key_spec.rb +0 -31
  61. data/spec/lib/immutable/hash/has_value_spec.rb +0 -27
  62. data/spec/lib/immutable/hash/hash_spec.rb +0 -29
  63. data/spec/lib/immutable/hash/inspect_spec.rb +0 -30
  64. data/spec/lib/immutable/hash/invert_spec.rb +0 -30
  65. data/spec/lib/immutable/hash/key_spec.rb +0 -27
  66. data/spec/lib/immutable/hash/keys_spec.rb +0 -15
  67. data/spec/lib/immutable/hash/map_spec.rb +0 -45
  68. data/spec/lib/immutable/hash/marshal_spec.rb +0 -28
  69. data/spec/lib/immutable/hash/merge_spec.rb +0 -82
  70. data/spec/lib/immutable/hash/min_max_spec.rb +0 -45
  71. data/spec/lib/immutable/hash/new_spec.rb +0 -70
  72. data/spec/lib/immutable/hash/none_spec.rb +0 -48
  73. data/spec/lib/immutable/hash/partition_spec.rb +0 -35
  74. data/spec/lib/immutable/hash/pretty_print_spec.rb +0 -34
  75. data/spec/lib/immutable/hash/put_spec.rb +0 -102
  76. data/spec/lib/immutable/hash/reduce_spec.rb +0 -35
  77. data/spec/lib/immutable/hash/reject_spec.rb +0 -61
  78. data/spec/lib/immutable/hash/reverse_each_spec.rb +0 -27
  79. data/spec/lib/immutable/hash/sample_spec.rb +0 -13
  80. data/spec/lib/immutable/hash/select_spec.rb +0 -57
  81. data/spec/lib/immutable/hash/size_spec.rb +0 -51
  82. data/spec/lib/immutable/hash/slice_spec.rb +0 -44
  83. data/spec/lib/immutable/hash/sort_spec.rb +0 -26
  84. data/spec/lib/immutable/hash/store_spec.rb +0 -75
  85. data/spec/lib/immutable/hash/take_spec.rb +0 -35
  86. data/spec/lib/immutable/hash/to_a_spec.rb +0 -13
  87. data/spec/lib/immutable/hash/to_hash_spec.rb +0 -21
  88. data/spec/lib/immutable/hash/update_in_spec.rb +0 -79
  89. data/spec/lib/immutable/hash/values_at_spec.rb +0 -13
  90. data/spec/lib/immutable/hash/values_spec.rb +0 -23
  91. data/spec/lib/immutable/list/add_spec.rb +0 -25
  92. data/spec/lib/immutable/list/all_spec.rb +0 -57
  93. data/spec/lib/immutable/list/any_spec.rb +0 -49
  94. data/spec/lib/immutable/list/append_spec.rb +0 -38
  95. data/spec/lib/immutable/list/at_spec.rb +0 -29
  96. data/spec/lib/immutable/list/break_spec.rb +0 -69
  97. data/spec/lib/immutable/list/cadr_spec.rb +0 -38
  98. data/spec/lib/immutable/list/chunk_spec.rb +0 -28
  99. data/spec/lib/immutable/list/clear_spec.rb +0 -24
  100. data/spec/lib/immutable/list/combination_spec.rb +0 -33
  101. data/spec/lib/immutable/list/compact_spec.rb +0 -34
  102. data/spec/lib/immutable/list/compare_spec.rb +0 -30
  103. data/spec/lib/immutable/list/cons_spec.rb +0 -25
  104. data/spec/lib/immutable/list/construction_spec.rb +0 -110
  105. data/spec/lib/immutable/list/copying_spec.rb +0 -19
  106. data/spec/lib/immutable/list/count_spec.rb +0 -36
  107. data/spec/lib/immutable/list/cycle_spec.rb +0 -28
  108. data/spec/lib/immutable/list/delete_at_spec.rb +0 -18
  109. data/spec/lib/immutable/list/delete_spec.rb +0 -16
  110. data/spec/lib/immutable/list/drop_spec.rb +0 -30
  111. data/spec/lib/immutable/list/drop_while_spec.rb +0 -38
  112. data/spec/lib/immutable/list/each_slice_spec.rb +0 -51
  113. data/spec/lib/immutable/list/each_spec.rb +0 -40
  114. data/spec/lib/immutable/list/each_with_index_spec.rb +0 -28
  115. data/spec/lib/immutable/list/empty_spec.rb +0 -23
  116. data/spec/lib/immutable/list/eql_spec.rb +0 -61
  117. data/spec/lib/immutable/list/fill_spec.rb +0 -49
  118. data/spec/lib/immutable/list/find_all_spec.rb +0 -70
  119. data/spec/lib/immutable/list/find_index_spec.rb +0 -35
  120. data/spec/lib/immutable/list/find_spec.rb +0 -42
  121. data/spec/lib/immutable/list/flat_map_spec.rb +0 -51
  122. data/spec/lib/immutable/list/flatten_spec.rb +0 -30
  123. data/spec/lib/immutable/list/grep_spec.rb +0 -46
  124. data/spec/lib/immutable/list/group_by_spec.rb +0 -41
  125. data/spec/lib/immutable/list/hash_spec.rb +0 -21
  126. data/spec/lib/immutable/list/head_spec.rb +0 -19
  127. data/spec/lib/immutable/list/include_spec.rb +0 -35
  128. data/spec/lib/immutable/list/index_spec.rb +0 -33
  129. data/spec/lib/immutable/list/indices_spec.rb +0 -61
  130. data/spec/lib/immutable/list/init_spec.rb +0 -28
  131. data/spec/lib/immutable/list/inits_spec.rb +0 -28
  132. data/spec/lib/immutable/list/insert_spec.rb +0 -46
  133. data/spec/lib/immutable/list/inspect_spec.rb +0 -29
  134. data/spec/lib/immutable/list/intersperse_spec.rb +0 -28
  135. data/spec/lib/immutable/list/join_spec.rb +0 -63
  136. data/spec/lib/immutable/list/last_spec.rb +0 -23
  137. data/spec/lib/immutable/list/ltlt_spec.rb +0 -19
  138. data/spec/lib/immutable/list/map_spec.rb +0 -45
  139. data/spec/lib/immutable/list/maximum_spec.rb +0 -39
  140. data/spec/lib/immutable/list/merge_by_spec.rb +0 -51
  141. data/spec/lib/immutable/list/merge_spec.rb +0 -59
  142. data/spec/lib/immutable/list/minimum_spec.rb +0 -39
  143. data/spec/lib/immutable/list/multithreading_spec.rb +0 -47
  144. data/spec/lib/immutable/list/none_spec.rb +0 -47
  145. data/spec/lib/immutable/list/one_spec.rb +0 -49
  146. data/spec/lib/immutable/list/partition_spec.rb +0 -115
  147. data/spec/lib/immutable/list/permutation_spec.rb +0 -55
  148. data/spec/lib/immutable/list/pop_spec.rb +0 -25
  149. data/spec/lib/immutable/list/product_spec.rb +0 -23
  150. data/spec/lib/immutable/list/reduce_spec.rb +0 -53
  151. data/spec/lib/immutable/list/reject_spec.rb +0 -45
  152. data/spec/lib/immutable/list/reverse_spec.rb +0 -34
  153. data/spec/lib/immutable/list/rotate_spec.rb +0 -36
  154. data/spec/lib/immutable/list/sample_spec.rb +0 -13
  155. data/spec/lib/immutable/list/select_spec.rb +0 -70
  156. data/spec/lib/immutable/list/size_spec.rb +0 -25
  157. data/spec/lib/immutable/list/slice_spec.rb +0 -229
  158. data/spec/lib/immutable/list/sorting_spec.rb +0 -46
  159. data/spec/lib/immutable/list/span_spec.rb +0 -76
  160. data/spec/lib/immutable/list/split_at_spec.rb +0 -43
  161. data/spec/lib/immutable/list/subsequences_spec.rb +0 -23
  162. data/spec/lib/immutable/list/sum_spec.rb +0 -23
  163. data/spec/lib/immutable/list/tail_spec.rb +0 -30
  164. data/spec/lib/immutable/list/tails_spec.rb +0 -28
  165. data/spec/lib/immutable/list/take_spec.rb +0 -30
  166. data/spec/lib/immutable/list/take_while_spec.rb +0 -46
  167. data/spec/lib/immutable/list/to_a_spec.rb +0 -39
  168. data/spec/lib/immutable/list/to_ary_spec.rb +0 -41
  169. data/spec/lib/immutable/list/to_list_spec.rb +0 -19
  170. data/spec/lib/immutable/list/to_set_spec.rb +0 -17
  171. data/spec/lib/immutable/list/transpose_spec.rb +0 -19
  172. data/spec/lib/immutable/list/union_spec.rb +0 -31
  173. data/spec/lib/immutable/list/uniq_spec.rb +0 -35
  174. data/spec/lib/immutable/list/zip_spec.rb +0 -23
  175. data/spec/lib/immutable/nested/construction_spec.rb +0 -95
  176. data/spec/lib/immutable/set/add_spec.rb +0 -75
  177. data/spec/lib/immutable/set/all_spec.rb +0 -51
  178. data/spec/lib/immutable/set/any_spec.rb +0 -51
  179. data/spec/lib/immutable/set/clear_spec.rb +0 -33
  180. data/spec/lib/immutable/set/compact_spec.rb +0 -30
  181. data/spec/lib/immutable/set/construction_spec.rb +0 -18
  182. data/spec/lib/immutable/set/copying_spec.rb +0 -13
  183. data/spec/lib/immutable/set/count_spec.rb +0 -36
  184. data/spec/lib/immutable/set/delete_spec.rb +0 -71
  185. data/spec/lib/immutable/set/difference_spec.rb +0 -49
  186. data/spec/lib/immutable/set/disjoint_spec.rb +0 -25
  187. data/spec/lib/immutable/set/each_spec.rb +0 -45
  188. data/spec/lib/immutable/set/empty_spec.rb +0 -44
  189. data/spec/lib/immutable/set/eqeq_spec.rb +0 -103
  190. data/spec/lib/immutable/set/eql_spec.rb +0 -109
  191. data/spec/lib/immutable/set/exclusion_spec.rb +0 -47
  192. data/spec/lib/immutable/set/find_spec.rb +0 -35
  193. data/spec/lib/immutable/set/first_spec.rb +0 -28
  194. data/spec/lib/immutable/set/flatten_spec.rb +0 -46
  195. data/spec/lib/immutable/set/grep_spec.rb +0 -57
  196. data/spec/lib/immutable/set/group_by_spec.rb +0 -59
  197. data/spec/lib/immutable/set/hash_spec.rb +0 -22
  198. data/spec/lib/immutable/set/include_spec.rb +0 -60
  199. data/spec/lib/immutable/set/inspect_spec.rb +0 -47
  200. data/spec/lib/immutable/set/intersect_spec.rb +0 -25
  201. data/spec/lib/immutable/set/intersection_spec.rb +0 -52
  202. data/spec/lib/immutable/set/join_spec.rb +0 -64
  203. data/spec/lib/immutable/set/map_spec.rb +0 -59
  204. data/spec/lib/immutable/set/marshal_spec.rb +0 -28
  205. data/spec/lib/immutable/set/maximum_spec.rb +0 -36
  206. data/spec/lib/immutable/set/minimum_spec.rb +0 -36
  207. data/spec/lib/immutable/set/new_spec.rb +0 -53
  208. data/spec/lib/immutable/set/none_spec.rb +0 -47
  209. data/spec/lib/immutable/set/one_spec.rb +0 -47
  210. data/spec/lib/immutable/set/partition_spec.rb +0 -52
  211. data/spec/lib/immutable/set/product_spec.rb +0 -23
  212. data/spec/lib/immutable/set/reduce_spec.rb +0 -55
  213. data/spec/lib/immutable/set/reject_spec.rb +0 -50
  214. data/spec/lib/immutable/set/reverse_each_spec.rb +0 -38
  215. data/spec/lib/immutable/set/sample_spec.rb +0 -13
  216. data/spec/lib/immutable/set/select_spec.rb +0 -73
  217. data/spec/lib/immutable/set/size_spec.rb +0 -17
  218. data/spec/lib/immutable/set/sorting_spec.rb +0 -59
  219. data/spec/lib/immutable/set/subset_spec.rb +0 -51
  220. data/spec/lib/immutable/set/sum_spec.rb +0 -23
  221. data/spec/lib/immutable/set/superset_spec.rb +0 -51
  222. data/spec/lib/immutable/set/to_a_spec.rb +0 -30
  223. data/spec/lib/immutable/set/to_list_spec.rb +0 -35
  224. data/spec/lib/immutable/set/to_set_spec.rb +0 -19
  225. data/spec/lib/immutable/set/union_spec.rb +0 -63
  226. data/spec/lib/immutable/sorted_set/above_spec.rb +0 -51
  227. data/spec/lib/immutable/sorted_set/add_spec.rb +0 -62
  228. data/spec/lib/immutable/sorted_set/at_spec.rb +0 -24
  229. data/spec/lib/immutable/sorted_set/below_spec.rb +0 -51
  230. data/spec/lib/immutable/sorted_set/between_spec.rb +0 -51
  231. data/spec/lib/immutable/sorted_set/clear_spec.rb +0 -43
  232. data/spec/lib/immutable/sorted_set/copying_spec.rb +0 -20
  233. data/spec/lib/immutable/sorted_set/delete_at_spec.rb +0 -18
  234. data/spec/lib/immutable/sorted_set/delete_spec.rb +0 -89
  235. data/spec/lib/immutable/sorted_set/difference_spec.rb +0 -22
  236. data/spec/lib/immutable/sorted_set/disjoint_spec.rb +0 -25
  237. data/spec/lib/immutable/sorted_set/drop_spec.rb +0 -55
  238. data/spec/lib/immutable/sorted_set/drop_while_spec.rb +0 -34
  239. data/spec/lib/immutable/sorted_set/each_spec.rb +0 -28
  240. data/spec/lib/immutable/sorted_set/empty_spec.rb +0 -34
  241. data/spec/lib/immutable/sorted_set/eql_spec.rb +0 -120
  242. data/spec/lib/immutable/sorted_set/exclusion_spec.rb +0 -22
  243. data/spec/lib/immutable/sorted_set/fetch_spec.rb +0 -64
  244. data/spec/lib/immutable/sorted_set/find_index_spec.rb +0 -40
  245. data/spec/lib/immutable/sorted_set/first_spec.rb +0 -18
  246. data/spec/lib/immutable/sorted_set/from_spec.rb +0 -51
  247. data/spec/lib/immutable/sorted_set/group_by_spec.rb +0 -57
  248. data/spec/lib/immutable/sorted_set/include_spec.rb +0 -23
  249. data/spec/lib/immutable/sorted_set/inspect_spec.rb +0 -37
  250. data/spec/lib/immutable/sorted_set/intersect_spec.rb +0 -25
  251. data/spec/lib/immutable/sorted_set/intersection_spec.rb +0 -28
  252. data/spec/lib/immutable/sorted_set/last_spec.rb +0 -36
  253. data/spec/lib/immutable/sorted_set/map_spec.rb +0 -43
  254. data/spec/lib/immutable/sorted_set/marshal_spec.rb +0 -36
  255. data/spec/lib/immutable/sorted_set/maximum_spec.rb +0 -36
  256. data/spec/lib/immutable/sorted_set/minimum_spec.rb +0 -19
  257. data/spec/lib/immutable/sorted_set/new_spec.rb +0 -71
  258. data/spec/lib/immutable/sorted_set/reverse_each_spec.rb +0 -28
  259. data/spec/lib/immutable/sorted_set/sample_spec.rb +0 -13
  260. data/spec/lib/immutable/sorted_set/select_spec.rb +0 -61
  261. data/spec/lib/immutable/sorted_set/size_spec.rb +0 -17
  262. data/spec/lib/immutable/sorted_set/slice_spec.rb +0 -256
  263. data/spec/lib/immutable/sorted_set/sorting_spec.rb +0 -44
  264. data/spec/lib/immutable/sorted_set/subset_spec.rb +0 -47
  265. data/spec/lib/immutable/sorted_set/superset_spec.rb +0 -47
  266. data/spec/lib/immutable/sorted_set/take_spec.rb +0 -54
  267. data/spec/lib/immutable/sorted_set/take_while_spec.rb +0 -33
  268. data/spec/lib/immutable/sorted_set/to_set_spec.rb +0 -17
  269. data/spec/lib/immutable/sorted_set/union_spec.rb +0 -27
  270. data/spec/lib/immutable/sorted_set/up_to_spec.rb +0 -52
  271. data/spec/lib/immutable/sorted_set/values_at_spec.rb +0 -33
  272. data/spec/lib/immutable/vector/add_spec.rb +0 -67
  273. data/spec/lib/immutable/vector/any_spec.rb +0 -69
  274. data/spec/lib/immutable/vector/assoc_spec.rb +0 -45
  275. data/spec/lib/immutable/vector/bsearch_spec.rb +0 -65
  276. data/spec/lib/immutable/vector/clear_spec.rb +0 -33
  277. data/spec/lib/immutable/vector/combination_spec.rb +0 -81
  278. data/spec/lib/immutable/vector/compact_spec.rb +0 -29
  279. data/spec/lib/immutable/vector/compare_spec.rb +0 -31
  280. data/spec/lib/immutable/vector/concat_spec.rb +0 -34
  281. data/spec/lib/immutable/vector/copying_spec.rb +0 -20
  282. data/spec/lib/immutable/vector/count_spec.rb +0 -17
  283. data/spec/lib/immutable/vector/delete_at_spec.rb +0 -53
  284. data/spec/lib/immutable/vector/delete_spec.rb +0 -30
  285. data/spec/lib/immutable/vector/drop_spec.rb +0 -41
  286. data/spec/lib/immutable/vector/drop_while_spec.rb +0 -54
  287. data/spec/lib/immutable/vector/each_index_spec.rb +0 -40
  288. data/spec/lib/immutable/vector/each_spec.rb +0 -44
  289. data/spec/lib/immutable/vector/each_with_index_spec.rb +0 -39
  290. data/spec/lib/immutable/vector/empty_spec.rb +0 -41
  291. data/spec/lib/immutable/vector/eql_spec.rb +0 -76
  292. data/spec/lib/immutable/vector/fetch_spec.rb +0 -64
  293. data/spec/lib/immutable/vector/fill_spec.rb +0 -88
  294. data/spec/lib/immutable/vector/first_spec.rb +0 -18
  295. data/spec/lib/immutable/vector/flat_map_spec.rb +0 -50
  296. data/spec/lib/immutable/vector/flatten_spec.rb +0 -58
  297. data/spec/lib/immutable/vector/get_spec.rb +0 -74
  298. data/spec/lib/immutable/vector/group_by_spec.rb +0 -57
  299. data/spec/lib/immutable/vector/include_spec.rb +0 -30
  300. data/spec/lib/immutable/vector/insert_spec.rb +0 -68
  301. data/spec/lib/immutable/vector/inspect_spec.rb +0 -49
  302. data/spec/lib/immutable/vector/join_spec.rb +0 -58
  303. data/spec/lib/immutable/vector/last_spec.rb +0 -45
  304. data/spec/lib/immutable/vector/length_spec.rb +0 -45
  305. data/spec/lib/immutable/vector/ltlt_spec.rb +0 -65
  306. data/spec/lib/immutable/vector/map_spec.rb +0 -51
  307. data/spec/lib/immutable/vector/marshal_spec.rb +0 -31
  308. data/spec/lib/immutable/vector/maximum_spec.rb +0 -33
  309. data/spec/lib/immutable/vector/minimum_spec.rb +0 -33
  310. data/spec/lib/immutable/vector/multiply_spec.rb +0 -47
  311. data/spec/lib/immutable/vector/new_spec.rb +0 -50
  312. data/spec/lib/immutable/vector/partition_spec.rb +0 -52
  313. data/spec/lib/immutable/vector/permutation_spec.rb +0 -91
  314. data/spec/lib/immutable/vector/pop_spec.rb +0 -26
  315. data/spec/lib/immutable/vector/product_spec.rb +0 -70
  316. data/spec/lib/immutable/vector/reduce_spec.rb +0 -55
  317. data/spec/lib/immutable/vector/reject_spec.rb +0 -43
  318. data/spec/lib/immutable/vector/repeated_combination_spec.rb +0 -77
  319. data/spec/lib/immutable/vector/repeated_permutation_spec.rb +0 -93
  320. data/spec/lib/immutable/vector/reverse_each_spec.rb +0 -31
  321. data/spec/lib/immutable/vector/reverse_spec.rb +0 -21
  322. data/spec/lib/immutable/vector/rindex_spec.rb +0 -36
  323. data/spec/lib/immutable/vector/rotate_spec.rb +0 -73
  324. data/spec/lib/immutable/vector/sample_spec.rb +0 -13
  325. data/spec/lib/immutable/vector/select_spec.rb +0 -63
  326. data/spec/lib/immutable/vector/set_spec.rb +0 -174
  327. data/spec/lib/immutable/vector/shift_spec.rb +0 -27
  328. data/spec/lib/immutable/vector/shuffle_spec.rb +0 -43
  329. data/spec/lib/immutable/vector/slice_spec.rb +0 -240
  330. data/spec/lib/immutable/vector/sorting_spec.rb +0 -56
  331. data/spec/lib/immutable/vector/sum_spec.rb +0 -17
  332. data/spec/lib/immutable/vector/take_spec.rb +0 -42
  333. data/spec/lib/immutable/vector/take_while_spec.rb +0 -34
  334. data/spec/lib/immutable/vector/to_a_spec.rb +0 -41
  335. data/spec/lib/immutable/vector/to_ary_spec.rb +0 -34
  336. data/spec/lib/immutable/vector/to_list_spec.rb +0 -30
  337. data/spec/lib/immutable/vector/to_set_spec.rb +0 -21
  338. data/spec/lib/immutable/vector/transpose_spec.rb +0 -48
  339. data/spec/lib/immutable/vector/uniq_spec.rb +0 -76
  340. data/spec/lib/immutable/vector/unshift_spec.rb +0 -28
  341. data/spec/lib/immutable/vector/update_in_spec.rb +0 -82
  342. data/spec/lib/immutable/vector/values_at_spec.rb +0 -33
  343. data/spec/lib/immutable/vector/zip_spec.rb +0 -57
  344. data/spec/lib/load_spec.rb +0 -42
  345. data/spec/spec_helper.rb +0 -92
@@ -1,4 +1,4 @@
1
- require "immutable/enumerable"
1
+ require 'immutable/enumerable'
2
2
 
3
3
  module Immutable
4
4
 
@@ -65,7 +65,7 @@ module Immutable
65
65
  #
66
66
  # @return [SortedSet]
67
67
  def empty
68
- @empty ||= self.alloc(PlainAVLNode::EmptyNode)
68
+ @empty ||= alloc(PlainAVLNode::EmptyNode)
69
69
  end
70
70
 
71
71
  # "Raw" allocation of a new `SortedSet`. Used internally to create a new
@@ -76,21 +76,46 @@ module Immutable
76
76
  def alloc(node)
77
77
  allocate.tap { |s| s.instance_variable_set(:@node, node) }.freeze
78
78
  end
79
+
80
+ # @private
81
+ # Unfortunately, Ruby's stdlib doesn't do this for us
82
+ # array must be sorted
83
+ def uniq_by_comparator!(array, comparator)
84
+ to_check, shift, sz, prev_obj = 1, 0, array.size, array[0]
85
+ while to_check < sz
86
+ next_obj = array[to_check]
87
+ if comparator.call(prev_obj, next_obj) == 0
88
+ shift += 1
89
+ else
90
+ if shift > 0
91
+ array[to_check - shift] = next_obj
92
+ end
93
+ prev_obj = next_obj
94
+ end
95
+ to_check += 1
96
+ end
97
+ array.pop(shift) if shift > 0
98
+ end
79
99
  end
80
100
 
81
101
  def initialize(items=[], &block)
82
102
  items = items.to_a
83
103
  if block
84
- if block.arity == 1 || block.arity == -1
104
+ # In Ruby 2, &:method blocks have arity -1; in Ruby 3, it's -2
105
+ if block.arity == 1 || block.arity == -1 || block.arity == -2
106
+ items = items.uniq(&block)
107
+ items.sort_by!(&block)
85
108
  comparator = lambda { |a,b| block.call(a) <=> block.call(b) }
86
- items = items.sort_by(&block)
87
- else
88
- comparator = block
109
+ elsif block.arity == 2 || block.arity == -3
89
110
  items = items.sort(&block)
111
+ SortedSet.uniq_by_comparator!(items, block)
112
+ comparator = block
113
+ else
114
+ raise "Comparator block for Immutable::SortedSet must accept 1 or 2 arguments"
90
115
  end
91
116
  @node = AVLNode.from_items(items, comparator)
92
117
  else
93
- @node = PlainAVLNode.from_items(items.sort)
118
+ @node = PlainAVLNode.from_items(items.uniq.sort!)
94
119
  end
95
120
  freeze
96
121
  end
@@ -111,7 +136,7 @@ module Immutable
111
136
  def size
112
137
  @node.size
113
138
  end
114
- alias :length :size
139
+ alias length size
115
140
 
116
141
  # Return a new `SortedSet` with `item` added. If `item` is already in the set,
117
142
  # return `self`.
@@ -129,7 +154,7 @@ module Immutable
129
154
  end
130
155
  self
131
156
  end
132
- alias :<< :add
157
+ alias << add
133
158
 
134
159
  # If `item` is not a member of this `SortedSet`, return a new `SortedSet` with
135
160
  # `item` added. Otherwise, return `false`.
@@ -321,7 +346,7 @@ module Immutable
321
346
  subsequence(arg, length)
322
347
  end
323
348
  end
324
- alias :[] :slice
349
+ alias [] slice
325
350
 
326
351
  # Return a new `SortedSet` with only the elements at the given `indices`.
327
352
  # If any of the `indices` do not exist, they will be skipped.
@@ -429,8 +454,8 @@ module Immutable
429
454
  each { |item| items_to_delete << item unless yield(item) }
430
455
  derive_new_sorted_set(@node.bulk_delete(items_to_delete))
431
456
  end
432
- alias :find_all :select
433
- alias :keep_if :select
457
+ alias find_all select
458
+ alias keep_if select
434
459
 
435
460
  # Invoke the given block once for each item in the set, and return a new
436
461
  # `SortedSet` containing the values returned by the block. If no block is
@@ -447,7 +472,7 @@ module Immutable
447
472
  return self if empty?
448
473
  self.class.alloc(@node.from_items(super))
449
474
  end
450
- alias :collect :map
475
+ alias collect map
451
476
 
452
477
  # Return `true` if the given item is present in this `SortedSet`. More precisely,
453
478
  # return `true` if an object which compares as "equal" using this set's
@@ -461,7 +486,7 @@ module Immutable
461
486
  def include?(item)
462
487
  @node.include?(item)
463
488
  end
464
- alias :member? :include?
489
+ alias member? include?
465
490
 
466
491
  # Return a new `SortedSet` with the same items, but a sort order determined
467
492
  # by the given block.
@@ -475,12 +500,14 @@ module Immutable
475
500
  # @return [SortedSet]
476
501
  def sort(&block)
477
502
  if block
478
- self.class.new(self.to_a, &block)
503
+ self.class.new(to_a, &block)
504
+ elsif @node.natural_order?
505
+ self
479
506
  else
480
- self.class.new(self.to_a.sort)
481
- end
507
+ self.class.new(self)
508
+ end
482
509
  end
483
- alias :sort_by :sort
510
+ alias sort_by sort
484
511
 
485
512
  # Find the index of a given object or an element that satisfies the given
486
513
  # block.
@@ -526,7 +553,7 @@ module Immutable
526
553
  super(&block)
527
554
  end
528
555
  end
529
- alias :index :find_index
556
+ alias index find_index
530
557
 
531
558
  # Drop the first `n` elements and return the rest in a new `SortedSet`.
532
559
  #
@@ -604,9 +631,9 @@ module Immutable
604
631
  def union(other)
605
632
  self.class.alloc(@node.bulk_insert(other))
606
633
  end
607
- alias :| :union
608
- alias :+ :union
609
- alias :merge :union
634
+ alias | union
635
+ alias + union
636
+ alias merge union
610
637
 
611
638
  # Return a new `SortedSet` which contains all the items which are members of both
612
639
  # this set and `other`. `other` can be any `Enumerable` object.
@@ -620,7 +647,7 @@ module Immutable
620
647
  def intersection(other)
621
648
  self.class.alloc(@node.keep_only(other))
622
649
  end
623
- alias :& :intersection
650
+ alias & intersection
624
651
 
625
652
  # Return a new `SortedSet` with all the items in `other` removed. `other` can be
626
653
  # any `Enumerable` object.
@@ -634,8 +661,8 @@ module Immutable
634
661
  def difference(other)
635
662
  self.class.alloc(@node.bulk_delete(other))
636
663
  end
637
- alias :subtract :difference
638
- alias :- :difference
664
+ alias subtract difference
665
+ alias - difference
639
666
 
640
667
  # Return a new `SortedSet` with all the items which are members of this
641
668
  # set or of `other`, but not both. `other` can be any `Enumerable` object.
@@ -649,7 +676,7 @@ module Immutable
649
676
  def exclusion(other)
650
677
  ((self | other) - (self & other))
651
678
  end
652
- alias :^ :exclusion
679
+ alias ^ exclusion
653
680
 
654
681
  # Return `true` if all items in this set are also in `other`.
655
682
  #
@@ -728,8 +755,8 @@ module Immutable
728
755
  !disjoint?(other)
729
756
  end
730
757
 
731
- alias :group :group_by
732
- alias :classify :group_by
758
+ alias group group_by
759
+ alias classify group_by
733
760
 
734
761
  # Select elements greater than a value.
735
762
  #
@@ -923,10 +950,11 @@ module Immutable
923
950
  return true if other.equal?(self)
924
951
  return false if not instance_of?(other.class)
925
952
  return false if size != other.size
926
- a, b = self.to_enum, other.to_enum
927
- while true
953
+ a, b = to_enum, other.to_enum
954
+ loop do
928
955
  return false if !a.next.eql?(b.next)
929
956
  end
957
+ true
930
958
  rescue StopIteration
931
959
  true
932
960
  end
@@ -943,7 +971,7 @@ module Immutable
943
971
  def dup
944
972
  self
945
973
  end
946
- alias :clone :dup
974
+ alias clone dup
947
975
 
948
976
  # @return [::Array]
949
977
  # @private
@@ -990,7 +1018,8 @@ module Immutable
990
1018
 
991
1019
  # @private
992
1020
  class AVLNode
993
- def self.from_items(items, comparator, from = 0, to = items.size-1) # items must be sorted
1021
+ def self.from_items(items, comparator, from = 0, to = items.size-1)
1022
+ # items must be sorted, without duplicates (as determined by comparator)
994
1023
  size = to - from + 1
995
1024
  if size >= 3
996
1025
  middle = (to + from) / 2
@@ -1013,8 +1042,12 @@ module Immutable
1013
1042
  end
1014
1043
  attr_reader :item, :left, :right, :height, :size
1015
1044
 
1045
+ # Used to implement #map
1046
+ # Takes advantage of the fact that Enumerable#map allocates a new Array
1016
1047
  def from_items(items)
1017
- AVLNode.from_items(items.sort(&@comparator), @comparator)
1048
+ items.sort!(&@comparator)
1049
+ SortedSet.uniq_by_comparator!(items, @comparator)
1050
+ AVLNode.from_items(items, @comparator)
1018
1051
  end
1019
1052
 
1020
1053
  def natural_order?
@@ -1374,7 +1407,9 @@ module Immutable
1374
1407
  end
1375
1408
  def bulk_insert(items)
1376
1409
  items = items.to_a if !items.is_a?(Array)
1377
- AVLNode.from_items(items.sort(&@comparator), @comparator)
1410
+ items = items.sort(&@comparator)
1411
+ SortedSet.uniq_by_comparator!(items, @comparator)
1412
+ AVLNode.from_items(items, @comparator)
1378
1413
  end
1379
1414
  def bulk_delete(items); self; end
1380
1415
  def keep_only(items); self; end
@@ -1397,7 +1432,8 @@ module Immutable
1397
1432
  # AVL node which does not use a comparator function; it keeps items sorted
1398
1433
  # in their natural order
1399
1434
  class PlainAVLNode < AVLNode
1400
- def self.from_items(items, from = 0, to = items.size-1) # items must be sorted
1435
+ def self.from_items(items, from = 0, to = items.size-1)
1436
+ # items must be sorted, with no duplicates
1401
1437
  size = to - from + 1
1402
1438
  if size >= 3
1403
1439
  middle = (to + from) / 2
@@ -1418,8 +1454,12 @@ module Immutable
1418
1454
  end
1419
1455
  attr_reader :item, :left, :right, :height, :size
1420
1456
 
1457
+ # Used to implement #map
1458
+ # Takes advantage of the fact that Enumerable#map allocates a new Array
1421
1459
  def from_items(items)
1422
- PlainAVLNode.from_items(items.sort)
1460
+ items.uniq!
1461
+ items.sort!
1462
+ PlainAVLNode.from_items(items)
1423
1463
  end
1424
1464
 
1425
1465
  def natural_order?
@@ -1447,7 +1487,7 @@ module Immutable
1447
1487
  end
1448
1488
  def bulk_insert(items)
1449
1489
  items = items.to_a if !items.is_a?(Array)
1450
- PlainAVLNode.from_items(items.sort)
1490
+ PlainAVLNode.from_items(items.uniq.sort!)
1451
1491
  end
1452
1492
  end
1453
1493
 
@@ -2,7 +2,7 @@ module Immutable
2
2
  # @private
3
3
  class Trie
4
4
  def self.[](pairs)
5
- result = self.new(0)
5
+ result = new(0)
6
6
  pairs.each { |key, val| result.put!(key, val) }
7
7
  result
8
8
  end
@@ -10,8 +10,8 @@ module Immutable
10
10
  # Returns the number of key-value pairs in the trie.
11
11
  attr_reader :size
12
12
 
13
- def initialize(significant_bits, size = 0, entries = [], children = [])
14
- @significant_bits = significant_bits
13
+ def initialize(bitshift, size = 0, entries = [], children = [])
14
+ @bitshift = bitshift
15
15
  @entries = entries
16
16
  @children = children
17
17
  @size = size
@@ -19,7 +19,7 @@ module Immutable
19
19
 
20
20
  # Returns <tt>true</tt> if the trie contains no key-value pairs.
21
21
  def empty?
22
- size == 0
22
+ @size == 0
23
23
  end
24
24
 
25
25
  # Returns <tt>true</tt> if the given key is present in the trie.
@@ -29,15 +29,7 @@ module Immutable
29
29
 
30
30
  # Calls <tt>block</tt> once for each entry in the trie, passing the key-value pair as parameters.
31
31
  def each(&block)
32
- # TODO: Using block.call here is slower than using yield by 5-10%, but
33
- # the latter segfaults on ruby 2.2 and above. Once that is fixed and
34
- # broken versions are sufficiently old, we should revert back to yield
35
- # with a warning that the broken versions are unsupported.
36
- #
37
- # For more context:
38
- # * https://bugs.ruby-lang.org/issues/11451
39
- # * https://github.com/hamstergem/hamster/issues/189
40
- @entries.each { |entry| block.call(entry) if entry }
32
+ @entries.each { |entry| yield entry if entry }
41
33
  @children.each do |child|
42
34
  child.each(&block) if child
43
35
  end
@@ -65,7 +57,7 @@ module Immutable
65
57
 
66
58
  # @return [Trie] A copy of `self` with the given value associated with the
67
59
  # key (or `self` if no modification was needed because an identical
68
- # key-value pair wes already stored
60
+ # key-value pair was already stored
69
61
  def put(key, value)
70
62
  index = index_for(key)
71
63
  entry = @entries[index]
@@ -74,7 +66,7 @@ module Immutable
74
66
  entries = @entries.dup
75
67
  key = key.dup.freeze if key.is_a?(String) && !key.frozen?
76
68
  entries[index] = [key, value].freeze
77
- Trie.new(@significant_bits, @size + 1, entries, @children)
69
+ Trie.new(@bitshift, @size + 1, entries, @children)
78
70
  elsif entry[0].eql?(key)
79
71
  if entry[1].equal?(value)
80
72
  self
@@ -82,7 +74,7 @@ module Immutable
82
74
  entries = @entries.dup
83
75
  key = key.dup.freeze if key.is_a?(String) && !key.frozen?
84
76
  entries[index] = [key, value].freeze
85
- Trie.new(@significant_bits, @size, entries, @children)
77
+ Trie.new(@bitshift, @size, entries, @children)
86
78
  end
87
79
  else
88
80
  child = @children[index]
@@ -94,12 +86,12 @@ module Immutable
94
86
  children = @children.dup
95
87
  children[index] = new_child
96
88
  new_self_size = @size + (new_child.size - child.size)
97
- Trie.new(@significant_bits, new_self_size, @entries, children)
89
+ Trie.new(@bitshift, new_self_size, @entries, children)
98
90
  end
99
91
  else
100
92
  children = @children.dup
101
- children[index] = Trie.new(@significant_bits + 5).put!(key, value)
102
- Trie.new(@significant_bits, @size + 1, @entries, children)
93
+ children[index] = Trie.new(@bitshift + 5).put!(key, value)
94
+ Trie.new(@bitshift, @size + 1, @entries, children)
103
95
  end
104
96
  end
105
97
  end
@@ -141,14 +133,14 @@ module Immutable
141
133
  end
142
134
  else
143
135
  new_children ||= @children.dup
144
- new_children[index] = Trie.new(@significant_bits + 5).put!(key, value)
136
+ new_children[index] = Trie.new(@bitshift + 5).put!(key, value)
145
137
  new_size += 1
146
138
  end
147
139
  end
148
140
  end
149
141
 
150
142
  if new_entries || new_children
151
- Trie.new(@significant_bits, new_size, new_entries || @entries, new_children || @children)
143
+ Trie.new(@bitshift, new_size, new_entries || @entries, new_children || @children)
152
144
  else
153
145
  self
154
146
  end
@@ -172,7 +164,7 @@ module Immutable
172
164
  @children[index] = child.put!(key, value)
173
165
  @size += child.size - old_child_size
174
166
  else
175
- @children[index] = Trie.new(@significant_bits + 5).put!(key, value)
167
+ @children[index] = Trie.new(@bitshift + 5).put!(key, value)
176
168
  @size += 1
177
169
  end
178
170
  end
@@ -193,7 +185,7 @@ module Immutable
193
185
 
194
186
  # Returns a copy of <tt>self</tt> with the given key (and associated value) deleted. If not found, returns <tt>self</tt>.
195
187
  def delete(key)
196
- find_and_delete(key) || Trie.new(@significant_bits)
188
+ find_and_delete(key) || Trie.new(@bitshift)
197
189
  end
198
190
 
199
191
  # Delete multiple elements from a Trie. This is more efficient than
@@ -238,7 +230,7 @@ module Immutable
238
230
  end
239
231
 
240
232
  if new_entries || new_children
241
- Trie.new(@significant_bits, new_size, new_entries || @entries, new_children || @children)
233
+ Trie.new(@bitshift, new_size, new_entries || @entries, new_children || @children)
242
234
  else
243
235
  self
244
236
  end
@@ -277,7 +269,7 @@ module Immutable
277
269
  end
278
270
  true
279
271
  end
280
- alias :== :eql?
272
+ alias == eql?
281
273
 
282
274
  protected
283
275
 
@@ -297,7 +289,7 @@ module Immutable
297
289
  children = @children.dup
298
290
  children[index] = copy
299
291
  new_size = @size - (child.size - copy_size(copy))
300
- return Trie.new(@significant_bits, new_size, @entries, children)
292
+ return Trie.new(@bitshift, new_size, @entries, children)
301
293
  end
302
294
  end
303
295
  end
@@ -318,14 +310,14 @@ module Immutable
318
310
  else
319
311
  entries[index] = nil
320
312
  end
321
- Trie.new(@significant_bits, @size - 1, entries, children || @children)
313
+ Trie.new(@bitshift, @size - 1, entries, children || @children)
322
314
  end
323
315
  end
324
316
 
325
317
  private
326
318
 
327
319
  def index_for(key)
328
- (key.hash.abs >> @significant_bits) & 31
320
+ (key.hash.abs >> @bitshift) & 31
329
321
  end
330
322
 
331
323
  def copy_size(copy)
@@ -334,5 +326,5 @@ module Immutable
334
326
  end
335
327
 
336
328
  # @private
337
- EmptyTrie = Trie.new(0)
329
+ EmptyTrie = Trie.new(0).freeze
338
330
  end