hamster 1.0.1.pre.rc3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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