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.
Files changed (358) hide show
  1. checksums.yaml +4 -4
  2. data/lib/hamster.rb +2 -0
  3. data/lib/hamster/associable.rb +49 -0
  4. data/lib/hamster/core_ext/enumerable.rb +3 -13
  5. data/lib/hamster/core_ext/io.rb +1 -1
  6. data/lib/hamster/core_ext/struct.rb +9 -0
  7. data/lib/hamster/deque.rb +57 -38
  8. data/lib/hamster/enumerable.rb +14 -41
  9. data/lib/hamster/experimental/mutable_queue.rb +5 -8
  10. data/lib/hamster/experimental/mutable_set.rb +6 -7
  11. data/lib/hamster/hash.rb +301 -110
  12. data/lib/hamster/immutable.rb +1 -1
  13. data/lib/hamster/list.rb +479 -194
  14. data/lib/hamster/mutable_hash.rb +6 -7
  15. data/lib/hamster/nested.rb +78 -0
  16. data/lib/hamster/read_copy_update.rb +1 -1
  17. data/lib/hamster/set.rb +198 -88
  18. data/lib/hamster/sorted_set.rb +706 -261
  19. data/lib/hamster/trie.rb +134 -15
  20. data/lib/hamster/vector.rb +571 -140
  21. data/lib/hamster/version.rb +3 -1
  22. data/spec/lib/hamster/associable/associable_spec.rb +150 -0
  23. data/spec/lib/hamster/core_ext/array_spec.rb +1 -1
  24. data/spec/lib/hamster/core_ext/enumerable_spec.rb +2 -2
  25. data/spec/lib/hamster/core_ext/io_spec.rb +1 -1
  26. data/spec/lib/hamster/deque/clear_spec.rb +3 -3
  27. data/spec/lib/hamster/deque/construction_spec.rb +8 -8
  28. data/spec/lib/hamster/deque/copying_spec.rb +1 -1
  29. data/spec/lib/hamster/deque/dequeue_spec.rb +12 -4
  30. data/spec/lib/hamster/deque/empty_spec.rb +14 -16
  31. data/spec/lib/hamster/deque/enqueue_spec.rb +4 -4
  32. data/spec/lib/hamster/deque/first_spec.rb +18 -0
  33. data/spec/lib/hamster/deque/inspect_spec.rb +1 -1
  34. data/spec/lib/hamster/deque/last_spec.rb +9 -11
  35. data/spec/lib/hamster/deque/marshal_spec.rb +6 -6
  36. data/spec/lib/hamster/deque/new_spec.rb +5 -5
  37. data/spec/lib/hamster/deque/pop_spec.rb +15 -3
  38. data/spec/lib/hamster/deque/pretty_print_spec.rb +24 -0
  39. data/spec/lib/hamster/deque/push_spec.rb +37 -0
  40. data/spec/lib/hamster/deque/shift_spec.rb +30 -0
  41. data/spec/lib/hamster/deque/size_spec.rb +1 -1
  42. data/spec/lib/hamster/deque/to_a_spec.rb +2 -2
  43. data/spec/lib/hamster/deque/to_ary_spec.rb +1 -1
  44. data/spec/lib/hamster/deque/to_list_spec.rb +3 -3
  45. data/spec/lib/hamster/deque/unshift_spec.rb +8 -3
  46. data/spec/lib/hamster/experimental/mutable_set/add_qm_spec.rb +3 -3
  47. data/spec/lib/hamster/experimental/mutable_set/add_spec.rb +3 -3
  48. data/spec/lib/hamster/experimental/mutable_set/delete_qm_spec.rb +3 -3
  49. data/spec/lib/hamster/experimental/mutable_set/delete_spec.rb +3 -3
  50. data/spec/lib/hamster/hash/all_spec.rb +32 -34
  51. data/spec/lib/hamster/hash/any_spec.rb +34 -36
  52. data/spec/lib/hamster/hash/assoc_spec.rb +3 -3
  53. data/spec/lib/hamster/hash/clear_spec.rb +4 -4
  54. data/spec/lib/hamster/hash/construction_spec.rb +8 -8
  55. data/spec/lib/hamster/hash/copying_spec.rb +1 -1
  56. data/spec/lib/hamster/hash/default_proc_spec.rb +3 -3
  57. data/spec/lib/hamster/hash/delete_spec.rb +4 -4
  58. data/spec/lib/hamster/hash/each_spec.rb +3 -3
  59. data/spec/lib/hamster/hash/each_with_index_spec.rb +1 -1
  60. data/spec/lib/hamster/hash/empty_spec.rb +13 -15
  61. data/spec/lib/hamster/hash/eql_spec.rb +4 -4
  62. data/spec/lib/hamster/hash/except_spec.rb +7 -7
  63. data/spec/lib/hamster/hash/fetch_spec.rb +10 -10
  64. data/spec/lib/hamster/hash/find_spec.rb +2 -2
  65. data/spec/lib/hamster/hash/flat_map_spec.rb +4 -4
  66. data/spec/lib/hamster/hash/flatten_spec.rb +13 -13
  67. data/spec/lib/hamster/hash/get_spec.rb +7 -7
  68. data/spec/lib/hamster/hash/has_key_spec.rb +3 -3
  69. data/spec/lib/hamster/hash/has_value_spec.rb +4 -4
  70. data/spec/lib/hamster/hash/hash_spec.rb +5 -5
  71. data/spec/lib/hamster/hash/inspect_spec.rb +2 -2
  72. data/spec/lib/hamster/hash/invert_spec.rb +6 -6
  73. data/spec/lib/hamster/hash/key_spec.rb +2 -2
  74. data/spec/lib/hamster/hash/keys_spec.rb +2 -2
  75. data/spec/lib/hamster/hash/map_spec.rb +4 -4
  76. data/spec/lib/hamster/hash/marshal_spec.rb +2 -2
  77. data/spec/lib/hamster/hash/merge_spec.rb +62 -56
  78. data/spec/lib/hamster/hash/min_max_spec.rb +9 -13
  79. data/spec/lib/hamster/hash/new_spec.rb +6 -6
  80. data/spec/lib/hamster/hash/none_spec.rb +3 -3
  81. data/spec/lib/hamster/hash/partition_spec.rb +2 -2
  82. data/spec/lib/hamster/hash/put_spec.rb +29 -7
  83. data/spec/lib/hamster/hash/reduce_spec.rb +4 -4
  84. data/spec/lib/hamster/hash/{remove_spec.rb → reject_spec.rb} +7 -7
  85. data/spec/lib/hamster/hash/reverse_each_spec.rb +1 -1
  86. data/spec/lib/hamster/hash/{filter_spec.rb → select_spec.rb} +6 -6
  87. data/spec/lib/hamster/hash/size_spec.rb +3 -3
  88. data/spec/lib/hamster/hash/slice_spec.rb +4 -4
  89. data/spec/lib/hamster/hash/sort_spec.rb +2 -2
  90. data/spec/lib/hamster/hash/store_spec.rb +29 -7
  91. data/spec/lib/hamster/hash/take_spec.rb +2 -2
  92. data/spec/lib/hamster/hash/to_a_spec.rb +1 -1
  93. data/spec/lib/hamster/hash/to_hash_spec.rb +4 -4
  94. data/spec/lib/hamster/hash/values_at_spec.rb +3 -3
  95. data/spec/lib/hamster/hash/values_spec.rb +2 -2
  96. data/spec/lib/hamster/immutable/new_spec.rb +14 -0
  97. data/spec/lib/hamster/list/add_spec.rb +16 -10
  98. data/spec/lib/hamster/list/all_spec.rb +33 -35
  99. data/spec/lib/hamster/list/any_spec.rb +29 -31
  100. data/spec/lib/hamster/list/append_spec.rb +6 -6
  101. data/spec/lib/hamster/list/at_spec.rb +1 -1
  102. data/spec/lib/hamster/list/break_spec.rb +4 -4
  103. data/spec/lib/hamster/list/cadr_spec.rb +9 -9
  104. data/spec/lib/hamster/list/chunk_spec.rb +5 -5
  105. data/spec/lib/hamster/list/clear_spec.rb +3 -3
  106. data/spec/lib/hamster/list/combination_spec.rb +3 -3
  107. data/spec/lib/hamster/list/compact_spec.rb +3 -3
  108. data/spec/lib/hamster/list/compare_spec.rb +3 -3
  109. data/spec/lib/hamster/list/cons_spec.rb +15 -17
  110. data/spec/lib/hamster/list/construction_spec.rb +20 -27
  111. data/spec/lib/hamster/list/copying_spec.rb +1 -1
  112. data/spec/lib/hamster/list/count_spec.rb +1 -1
  113. data/spec/lib/hamster/list/cycle_spec.rb +4 -4
  114. data/spec/lib/hamster/list/delete_at_spec.rb +4 -4
  115. data/spec/lib/hamster/list/drop_spec.rb +3 -3
  116. data/spec/lib/hamster/list/drop_while_spec.rb +3 -3
  117. data/spec/lib/hamster/list/each_slice_spec.rb +5 -5
  118. data/spec/lib/hamster/list/each_spec.rb +26 -28
  119. data/spec/lib/hamster/list/each_with_index_spec.rb +1 -1
  120. data/spec/lib/hamster/list/empty_spec.rb +13 -15
  121. data/spec/lib/hamster/list/eql_spec.rb +21 -21
  122. data/spec/lib/hamster/list/fill_spec.rb +8 -8
  123. data/spec/lib/hamster/list/find_all_spec.rb +3 -3
  124. data/spec/lib/hamster/list/find_index_spec.rb +1 -1
  125. data/spec/lib/hamster/list/find_spec.rb +1 -1
  126. data/spec/lib/hamster/list/flat_map_spec.rb +2 -2
  127. data/spec/lib/hamster/list/flatten_spec.rb +5 -5
  128. data/spec/lib/hamster/list/grep_spec.rb +4 -4
  129. data/spec/lib/hamster/list/group_by_spec.rb +6 -6
  130. data/spec/lib/hamster/list/hash_spec.rb +2 -2
  131. data/spec/lib/hamster/list/head_spec.rb +1 -1
  132. data/spec/lib/hamster/list/include_spec.rb +2 -2
  133. data/spec/lib/hamster/list/index_spec.rb +38 -0
  134. data/spec/lib/hamster/list/indices_spec.rb +62 -0
  135. data/spec/lib/hamster/list/init_spec.rb +3 -3
  136. data/spec/lib/hamster/list/inits_spec.rb +3 -3
  137. data/spec/lib/hamster/list/insert_spec.rb +1 -1
  138. data/spec/lib/hamster/list/inspect_spec.rb +1 -1
  139. data/spec/lib/hamster/list/intersperse_spec.rb +3 -3
  140. data/spec/lib/hamster/list/join_spec.rb +5 -5
  141. data/spec/lib/hamster/list/last_spec.rb +1 -1
  142. data/spec/lib/hamster/list/ltlt_spec.rb +20 -0
  143. data/spec/lib/hamster/list/map_spec.rb +4 -4
  144. data/spec/lib/hamster/list/maximum_spec.rb +24 -26
  145. data/spec/lib/hamster/list/merge_by_spec.rb +10 -10
  146. data/spec/lib/hamster/list/merge_spec.rb +10 -10
  147. data/spec/lib/hamster/list/minimum_spec.rb +24 -26
  148. data/spec/lib/hamster/list/multithreading_spec.rb +6 -6
  149. data/spec/lib/hamster/list/none_spec.rb +5 -5
  150. data/spec/lib/hamster/list/one_spec.rb +5 -5
  151. data/spec/lib/hamster/list/partition_spec.rb +8 -8
  152. data/spec/lib/hamster/list/permutation_spec.rb +8 -8
  153. data/spec/lib/hamster/list/pop_spec.rb +3 -3
  154. data/spec/lib/hamster/list/product_spec.rb +1 -1
  155. data/spec/lib/hamster/list/reduce_spec.rb +5 -48
  156. data/spec/lib/hamster/list/{remove_spec.rb → reject_spec.rb} +4 -4
  157. data/spec/lib/hamster/list/reverse_spec.rb +3 -3
  158. data/spec/lib/hamster/list/rotate_spec.rb +7 -7
  159. data/spec/lib/hamster/list/sample_spec.rb +1 -1
  160. data/spec/lib/hamster/list/select_spec.rb +3 -3
  161. data/spec/lib/hamster/list/size_spec.rb +1 -1
  162. data/spec/lib/hamster/list/slice_spec.rb +123 -123
  163. data/spec/lib/hamster/list/sorting_spec.rb +5 -5
  164. data/spec/lib/hamster/list/span_spec.rb +5 -5
  165. data/spec/lib/hamster/list/split_at_spec.rb +4 -4
  166. data/spec/lib/hamster/list/subsequences_spec.rb +1 -1
  167. data/spec/lib/hamster/list/sum_spec.rb +1 -1
  168. data/spec/lib/hamster/list/tail_spec.rb +4 -4
  169. data/spec/lib/hamster/list/tails_spec.rb +3 -3
  170. data/spec/lib/hamster/list/take_spec.rb +3 -3
  171. data/spec/lib/hamster/list/take_while_spec.rb +4 -4
  172. data/spec/lib/hamster/list/to_a_spec.rb +2 -2
  173. data/spec/lib/hamster/list/to_ary_spec.rb +1 -1
  174. data/spec/lib/hamster/list/to_list_spec.rb +1 -1
  175. data/spec/lib/hamster/list/to_set_spec.rb +1 -1
  176. data/spec/lib/hamster/list/union_spec.rb +4 -4
  177. data/spec/lib/hamster/list/uniq_spec.rb +23 -19
  178. data/spec/lib/hamster/list/zip_spec.rb +5 -5
  179. data/spec/lib/hamster/nested/construction_spec.rb +103 -0
  180. data/spec/lib/hamster/set/add_spec.rb +13 -11
  181. data/spec/lib/hamster/set/all_spec.rb +32 -34
  182. data/spec/lib/hamster/set/any_spec.rb +32 -34
  183. data/spec/lib/hamster/set/clear_spec.rb +3 -3
  184. data/spec/lib/hamster/set/compact_spec.rb +3 -3
  185. data/spec/lib/hamster/set/construction_spec.rb +3 -3
  186. data/spec/lib/hamster/set/copying_spec.rb +1 -1
  187. data/spec/lib/hamster/set/count_spec.rb +1 -1
  188. data/spec/lib/hamster/set/delete_spec.rb +8 -8
  189. data/spec/lib/hamster/set/difference_spec.rb +8 -8
  190. data/spec/lib/hamster/set/disjoint_spec.rb +1 -1
  191. data/spec/lib/hamster/set/each_spec.rb +2 -2
  192. data/spec/lib/hamster/set/empty_spec.rb +15 -17
  193. data/spec/lib/hamster/set/eqeq_spec.rb +3 -3
  194. data/spec/lib/hamster/set/eql_spec.rb +3 -3
  195. data/spec/lib/hamster/set/exclusion_spec.rb +7 -7
  196. data/spec/lib/hamster/set/find_spec.rb +2 -2
  197. data/spec/lib/hamster/set/first_spec.rb +29 -0
  198. data/spec/lib/hamster/set/flatten_spec.rb +9 -9
  199. data/spec/lib/hamster/set/grep_spec.rb +1 -1
  200. data/spec/lib/hamster/set/group_by_spec.rb +12 -12
  201. data/spec/lib/hamster/set/hash_spec.rb +3 -3
  202. data/spec/lib/hamster/set/include_spec.rb +8 -8
  203. data/spec/lib/hamster/set/inspect_spec.rb +2 -2
  204. data/spec/lib/hamster/set/intersect_spec.rb +1 -1
  205. data/spec/lib/hamster/set/intersection_spec.rb +13 -13
  206. data/spec/lib/hamster/set/join_spec.rb +6 -6
  207. data/spec/lib/hamster/set/map_spec.rb +7 -7
  208. data/spec/lib/hamster/set/marshal_spec.rb +2 -2
  209. data/spec/lib/hamster/set/maximum_spec.rb +22 -24
  210. data/spec/lib/hamster/set/minimum_spec.rb +22 -24
  211. data/spec/lib/hamster/set/new_spec.rb +5 -5
  212. data/spec/lib/hamster/set/none_spec.rb +5 -5
  213. data/spec/lib/hamster/set/one_spec.rb +6 -6
  214. data/spec/lib/hamster/set/partition_spec.rb +5 -5
  215. data/spec/lib/hamster/set/product_spec.rb +2 -2
  216. data/spec/lib/hamster/set/reduce_spec.rb +5 -5
  217. data/spec/lib/hamster/set/{remove_spec.rb → reject_spec.rb} +6 -6
  218. data/spec/lib/hamster/set/reverse_each_spec.rb +1 -1
  219. data/spec/lib/hamster/set/sample_spec.rb +1 -1
  220. data/spec/lib/hamster/set/{filter_spec.rb → select_spec.rb} +11 -11
  221. data/spec/lib/hamster/set/size_spec.rb +1 -1
  222. data/spec/lib/hamster/set/sorting_spec.rb +16 -5
  223. data/spec/lib/hamster/set/subset_spec.rb +2 -2
  224. data/spec/lib/hamster/set/sum_spec.rb +2 -2
  225. data/spec/lib/hamster/set/superset_spec.rb +2 -2
  226. data/spec/lib/hamster/set/to_a_spec.rb +2 -2
  227. data/spec/lib/hamster/set/to_list_spec.rb +2 -2
  228. data/spec/lib/hamster/set/to_set_spec.rb +1 -1
  229. data/spec/lib/hamster/set/union_spec.rb +23 -14
  230. data/spec/lib/hamster/sorted_set/above_spec.rb +11 -11
  231. data/spec/lib/hamster/sorted_set/add_spec.rb +8 -8
  232. data/spec/lib/hamster/sorted_set/at_spec.rb +1 -1
  233. data/spec/lib/hamster/sorted_set/below_spec.rb +11 -11
  234. data/spec/lib/hamster/sorted_set/between_spec.rb +11 -11
  235. data/spec/lib/hamster/sorted_set/clear_spec.rb +11 -2
  236. data/spec/lib/hamster/sorted_set/copying_spec.rb +21 -0
  237. data/spec/lib/hamster/sorted_set/delete_at_spec.rb +4 -4
  238. data/spec/lib/hamster/sorted_set/delete_spec.rb +21 -12
  239. data/spec/lib/hamster/sorted_set/difference_spec.rb +2 -2
  240. data/spec/lib/hamster/sorted_set/disjoint_spec.rb +1 -1
  241. data/spec/lib/hamster/sorted_set/drop_spec.rb +30 -3
  242. data/spec/lib/hamster/sorted_set/drop_while_spec.rb +4 -4
  243. data/spec/lib/hamster/sorted_set/each_spec.rb +16 -18
  244. data/spec/lib/hamster/sorted_set/empty_spec.rb +12 -14
  245. data/spec/lib/hamster/sorted_set/eql_spec.rb +5 -5
  246. data/spec/lib/hamster/sorted_set/exclusion_spec.rb +1 -1
  247. data/spec/lib/hamster/sorted_set/fetch_spec.rb +1 -1
  248. data/spec/lib/hamster/sorted_set/find_index_spec.rb +10 -2
  249. data/spec/lib/hamster/sorted_set/first_spec.rb +10 -12
  250. data/spec/lib/hamster/sorted_set/from_spec.rb +11 -11
  251. data/spec/lib/hamster/sorted_set/group_by_spec.rb +10 -10
  252. data/spec/lib/hamster/sorted_set/include_spec.rb +2 -2
  253. data/spec/lib/hamster/sorted_set/inspect_spec.rb +1 -1
  254. data/spec/lib/hamster/sorted_set/intersect_spec.rb +1 -1
  255. data/spec/lib/hamster/sorted_set/intersection_spec.rb +3 -3
  256. data/spec/lib/hamster/sorted_set/last_spec.rb +1 -1
  257. data/spec/lib/hamster/sorted_set/map_spec.rb +13 -5
  258. data/spec/lib/hamster/sorted_set/marshal_spec.rb +3 -3
  259. data/spec/lib/hamster/sorted_set/maximum_spec.rb +37 -0
  260. data/spec/lib/hamster/sorted_set/minimum_spec.rb +11 -13
  261. data/spec/lib/hamster/sorted_set/new_spec.rb +23 -3
  262. data/spec/lib/hamster/sorted_set/reverse_each_spec.rb +2 -2
  263. data/spec/lib/hamster/sorted_set/{filter_spec.rb → select_spec.rb} +10 -10
  264. data/spec/lib/hamster/sorted_set/size_spec.rb +1 -1
  265. data/spec/lib/hamster/sorted_set/slice_spec.rb +158 -142
  266. data/spec/lib/hamster/sorted_set/sorting_spec.rb +3 -3
  267. data/spec/lib/hamster/sorted_set/subset_spec.rb +2 -2
  268. data/spec/lib/hamster/sorted_set/superset_spec.rb +2 -2
  269. data/spec/lib/hamster/sorted_set/take_spec.rb +32 -3
  270. data/spec/lib/hamster/sorted_set/take_while_spec.rb +4 -4
  271. data/spec/lib/hamster/sorted_set/to_set_spec.rb +1 -1
  272. data/spec/lib/hamster/sorted_set/union_spec.rb +2 -2
  273. data/spec/lib/hamster/sorted_set/up_to_spec.rb +12 -11
  274. data/spec/lib/hamster/sorted_set/values_at_spec.rb +6 -6
  275. data/spec/lib/hamster/vector/add_spec.rb +3 -3
  276. data/spec/lib/hamster/vector/any_spec.rb +1 -1
  277. data/spec/lib/hamster/vector/assoc_spec.rb +11 -1
  278. data/spec/lib/hamster/vector/bsearch_spec.rb +10 -2
  279. data/spec/lib/hamster/vector/clear_spec.rb +3 -3
  280. data/spec/lib/hamster/vector/combination_spec.rb +4 -4
  281. data/spec/lib/hamster/vector/compact_spec.rb +2 -2
  282. data/spec/lib/hamster/vector/compare_spec.rb +3 -3
  283. data/spec/lib/hamster/vector/concat_spec.rb +2 -2
  284. data/spec/lib/hamster/vector/copying_spec.rb +1 -1
  285. data/spec/lib/hamster/vector/delete_at_spec.rb +8 -8
  286. data/spec/lib/hamster/vector/delete_spec.rb +2 -2
  287. data/spec/lib/hamster/vector/drop_spec.rb +10 -3
  288. data/spec/lib/hamster/vector/drop_while_spec.rb +5 -5
  289. data/spec/lib/hamster/vector/each_index_spec.rb +2 -2
  290. data/spec/lib/hamster/vector/each_spec.rb +27 -29
  291. data/spec/lib/hamster/vector/each_with_index_spec.rb +2 -2
  292. data/spec/lib/hamster/vector/empty_spec.rb +11 -13
  293. data/spec/lib/hamster/vector/eql_spec.rb +6 -6
  294. data/spec/lib/hamster/vector/fetch_spec.rb +1 -1
  295. data/spec/lib/hamster/vector/fill_spec.rb +9 -9
  296. data/spec/lib/hamster/vector/first_spec.rb +10 -12
  297. data/spec/lib/hamster/vector/flat_map_spec.rb +51 -0
  298. data/spec/lib/hamster/vector/flatten_spec.rb +15 -0
  299. data/spec/lib/hamster/vector/get_spec.rb +4 -4
  300. data/spec/lib/hamster/vector/group_by_spec.rb +12 -12
  301. data/spec/lib/hamster/vector/include_spec.rb +2 -2
  302. data/spec/lib/hamster/vector/insert_spec.rb +2 -2
  303. data/spec/lib/hamster/vector/inspect_spec.rb +1 -1
  304. data/spec/lib/hamster/vector/join_spec.rb +5 -5
  305. data/spec/lib/hamster/vector/last_spec.rb +1 -1
  306. data/spec/lib/hamster/vector/length_spec.rb +1 -1
  307. data/spec/lib/hamster/vector/ltlt_spec.rb +2 -2
  308. data/spec/lib/hamster/vector/map_spec.rb +5 -5
  309. data/spec/lib/hamster/vector/marshal_spec.rb +2 -2
  310. data/spec/lib/hamster/vector/maximum_spec.rb +20 -22
  311. data/spec/lib/hamster/vector/minimum_spec.rb +20 -22
  312. data/spec/lib/hamster/vector/multiply_spec.rb +4 -4
  313. data/spec/lib/hamster/vector/partition_spec.rb +5 -5
  314. data/spec/lib/hamster/vector/permutation_spec.rb +4 -4
  315. data/spec/lib/hamster/vector/pop_spec.rb +3 -3
  316. data/spec/lib/hamster/vector/product_spec.rb +10 -10
  317. data/spec/lib/hamster/vector/put_spec.rb +175 -0
  318. data/spec/lib/hamster/vector/reduce_spec.rb +5 -57
  319. data/spec/lib/hamster/vector/{remove_spec.rb → reject_spec.rb} +4 -4
  320. data/spec/lib/hamster/vector/repeated_combination_spec.rb +4 -4
  321. data/spec/lib/hamster/vector/repeated_permutation_spec.rb +6 -6
  322. data/spec/lib/hamster/vector/reverse_each_spec.rb +1 -1
  323. data/spec/lib/hamster/vector/reverse_spec.rb +1 -1
  324. data/spec/lib/hamster/vector/rindex_spec.rb +1 -1
  325. data/spec/lib/hamster/vector/rotate_spec.rb +9 -9
  326. data/spec/lib/hamster/vector/sample_spec.rb +1 -1
  327. data/spec/lib/hamster/vector/{filter_spec.rb → select_spec.rb} +8 -8
  328. data/spec/lib/hamster/vector/set_spec.rb +12 -141
  329. data/spec/lib/hamster/vector/shift_spec.rb +3 -3
  330. data/spec/lib/hamster/vector/shuffle_spec.rb +2 -2
  331. data/spec/lib/hamster/vector/slice_spec.rb +137 -137
  332. data/spec/lib/hamster/vector/sorting_spec.rb +5 -5
  333. data/spec/lib/hamster/vector/sum_spec.rb +1 -1
  334. data/spec/lib/hamster/vector/take_spec.rb +17 -3
  335. data/spec/lib/hamster/vector/take_while_spec.rb +4 -4
  336. data/spec/lib/hamster/vector/to_a_spec.rb +1 -1
  337. data/spec/lib/hamster/vector/to_ary_spec.rb +1 -1
  338. data/spec/lib/hamster/vector/to_list_spec.rb +2 -1
  339. data/spec/lib/hamster/vector/to_set_spec.rb +1 -1
  340. data/spec/lib/hamster/vector/uniq_spec.rb +27 -6
  341. data/spec/lib/hamster/vector/unshift_spec.rb +3 -3
  342. data/spec/lib/hamster/vector/values_at_spec.rb +6 -6
  343. data/spec/lib/hamster/vector/zip_spec.rb +2 -2
  344. data/spec/lib/load_spec.rb +42 -0
  345. data/spec/spec_helper.rb +25 -0
  346. metadata +85 -48
  347. data/spec/lib/hamster/deque/head_spec.rb +0 -20
  348. data/spec/lib/hamster/hash/uniq_spec.rb +0 -14
  349. data/spec/lib/hamster/list/elem_index_spec.rb +0 -36
  350. data/spec/lib/hamster/list/elem_indices_spec.rb +0 -31
  351. data/spec/lib/hamster/list/filter_spec.rb +0 -71
  352. data/spec/lib/hamster/list/find_indices_spec.rb +0 -37
  353. data/spec/lib/hamster/set/foreach_spec.rb +0 -40
  354. data/spec/lib/hamster/set/head_spec.rb +0 -31
  355. data/spec/lib/hamster/set/uniq_spec.rb +0 -14
  356. data/spec/lib/hamster/sorted_set/construction_spec.rb +0 -29
  357. data/spec/lib/hamster/vector/exist_spec.rb +0 -70
  358. 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: f3c8822d3a3758de0e490808c2012795a7a0de79
4
- data.tar.gz: 1295b432e023a4c840d17fb9ca8a1500b97db0f0
3
+ metadata.gz: 010476a87d79b515fa2da08903f6c36ebffd550e
4
+ data.tar.gz: 080ace89fb94c62d9ef29cc3a83c879e64a6b577
5
5
  SHA512:
6
- metadata.gz: 91e4df28a78d5aea2d423e03f8c6be123abae2f17ef67c7b6481ccaa20dc309d61b3d2ee864901cf9446fcb5d637ed5330f7622457de8ba0c74346089d06fec7
7
- data.tar.gz: e379456f35778c21b8e37ea1525d20f520c5323acade1568a74deff7b950765d70acd4ad8e6889acf22421615bb75953e6631bc8372918460b6bbf991d511487
6
+ metadata.gz: 596a85aa07273c8912dc6f42a8dcec58684a3eb9ce469f6a1219fd8f3cad242b7b69e72d06b185d77f95496b86b8e197ebedd5cd77e5ce3865fa07c687ee26e2
7
+ data.tar.gz: b14a0366601d364dd10a78b9c068c8849fd1471ef01cb0b0656391d2096e5408ba96ad2dcda125e9c99cd7867bf129310bc027995272d865656b1b760b89b3bd
@@ -7,4 +7,6 @@ require "hamster/set"
7
7
  require "hamster/vector"
8
8
  require "hamster/sorted_set"
9
9
  require "hamster/mutable_hash"
10
+ require "hamster/nested"
10
11
  require "hamster/version"
12
+ require "hamster/associable"
@@ -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
- # use destructive operations to build up a new list, like Common Lisp's NCONC
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
@@ -1,6 +1,6 @@
1
1
  require "hamster/list"
2
2
 
3
- # Ruby's built-in `IO` class.
3
+ # Monkey-patches to Ruby's built-in `IO` class.
4
4
  # @see http://www.ruby-doc.org/core/IO.html
5
5
  class IO
6
6
  # Return a lazy list of "records" read from this IO stream.
@@ -0,0 +1,9 @@
1
+ class Struct
2
+ # Implement Struct#to_h for Ruby interpreters which don't have it
3
+ # (such as MRI 1.9.3 and lower)
4
+ unless method_defined?(:to_h)
5
+ def to_h
6
+ Hash[each_pair.to_a]
7
+ end
8
+ end
9
+ end
@@ -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 objects,
11
- # which allows elements to be efficiently added and removed at the front and end of
12
- # the sequence. Retrieving the elements at the front and end is also efficient. This
13
- # makes `Deque` perfect for use as an immutable queue *or* stack.
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 any
16
- # element in the collection. `Deque`s only allow access to the first and last
17
- # element. But adding and removing from the ends of a `Deque` is faster than
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 4 basic operations which
31
- # "modify" deques ({#push}, {#pop}, {#shift}, and {#unshift}) all return a new
32
- # collection and leave the existing one unchanged.
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.to_list
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
- def_delegator :self, :size, :length
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
- def_delegator :self, :push, :enqueue
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 EmptyDeque if front.empty?
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 EmptyDeque if rear.empty?
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
- def_delegator :self, :shift, :dequeue
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
- def_delegator :self, :eql?, :==
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
- def_delegator :self, :to_a, :entries
183
- def_delegator :self, :to_a, :to_ary
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 `Hamster.deque` and `Deque[]` when
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
@@ -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 `#each` (just like `::Enumerable`).
7
- #
8
- # They must also implement:
4
+ # Classes including `Hamster::Enumerable` must implement:
9
5
  #
10
- # - `#filter`, which takes a block, and returns an instance of the same class
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 remove
20
- return enum_for(:remove) if not block_given?
21
- filter { |item| !yield(item) }
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
- filter { |item| !item.nil? }
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 = filter { |item| pattern === item }
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 `#conj` by returning a new collection
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.conj(item))
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
- def_delegator :self, :each, :foreach
149
- def_delegator :self, :all?, :forall?
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
- def self.mutable_queue(*items)
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