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
@@ -1,3 +1,5 @@
1
1
  module Hamster
2
- VERSION = "1.0.1-rc3"
2
+ # Current released gem version. Note that master will often have the same
3
+ # value as a release gem but with different code.
4
+ VERSION = "2.0.0"
3
5
  end
@@ -0,0 +1,150 @@
1
+ require "spec_helper"
2
+ require "hamster/hash"
3
+ require "hamster/vector"
4
+
5
+ describe Hamster::Associable do
6
+ describe "#update_in" do
7
+ let(:hash) {
8
+ Hamster::Hash[
9
+ "A" => "aye",
10
+ "B" => Hamster::Hash["C" => "see", "D" => Hamster::Hash["E" => "eee"]],
11
+ "F" => Hamster::Vector["G", Hamster::Hash["H" => "eitch"], "I"]
12
+ ]
13
+ }
14
+ let(:vector) {
15
+ Hamster::Vector[
16
+ 100,
17
+ 101,
18
+ 102,
19
+ Hamster::Vector[200, 201, Hamster::Vector[300, 301, 302]],
20
+ Hamster::Hash["A" => "alpha", "B" => "bravo"],
21
+ [400, 401, 402]
22
+ ]
23
+ }
24
+ context "with one level on existing key" do
25
+ it "Hash passes the value to the block" do
26
+ hash.update_in("A") { |value| value.should == "aye" }
27
+ end
28
+
29
+ it "Vector passes the value to the block" do
30
+ vector.update_in(1) { |value| value.should == 101 }
31
+ end
32
+
33
+ it "Hash replaces the value with the result of the block" do
34
+ result = hash.update_in("A") { |value| "FLIBBLE" }
35
+ result.get("A").should == "FLIBBLE"
36
+ end
37
+
38
+ it "Vector replaces the value with the result of the block" do
39
+ result = vector.update_in(1) { |value| "FLIBBLE" }
40
+ result.get(1).should == "FLIBBLE"
41
+ end
42
+
43
+ it "Hash should preserve the original" do
44
+ result = hash.update_in("A") { |value| "FLIBBLE" }
45
+ hash.get("A").should == "aye"
46
+ end
47
+
48
+ it "Vector should preserve the original" do
49
+ result = vector.update_in(1) { |value| "FLIBBLE" }
50
+ vector.get(1).should == 101
51
+ end
52
+ end
53
+
54
+ context "with multi-level on existing keys" do
55
+ it "Hash passes the value to the block" do
56
+ hash.update_in("B", "D", "E") { |value| value.should == "eee" }
57
+ end
58
+
59
+ it "Vector passes the value to the block" do
60
+ vector.update_in(3, 2, 0) { |value| value.should == 300 }
61
+ end
62
+
63
+ it "Hash replaces the value with the result of the block" do
64
+ result = hash.update_in("B", "D", "E") { |value| "FLIBBLE" }
65
+ result["B"]["D"]["E"].should == "FLIBBLE"
66
+ end
67
+
68
+ it "Vector replaces the value with the result of the block" do
69
+ result = vector.update_in(3, 2, 0) { |value| "FLIBBLE" }
70
+ result[3][2][0].should == "FLIBBLE"
71
+ end
72
+
73
+ it "Hash should preserve the original" do
74
+ result = hash.update_in("B", "D", "E") { |value| "FLIBBLE" }
75
+ hash["B"]["D"]["E"].should == "eee"
76
+ end
77
+
78
+ it "Vector should preserve the original" do
79
+ result = vector.update_in(3, 2, 0) { |value| "FLIBBLE" }
80
+ vector[3][2][0].should == 300
81
+ end
82
+
83
+ end
84
+
85
+ context "with multi-level creating sub-hashes when keys don't exist" do
86
+ it "Hash passes nil to the block" do
87
+ hash.update_in("B", "X", "Y") { |value| value.should be_nil }
88
+ end
89
+
90
+ it "Vector passes nil to the block" do
91
+ vector.update_in(3, 3, "X", "Y") { |value| value.should be_nil }
92
+ end
93
+
94
+ it "Hash creates subhashes on the way to set the value" do
95
+ result = hash.update_in("B", "X", "Y") { |value| "NEWVALUE" }
96
+ result["B"]["X"]["Y"].should == "NEWVALUE"
97
+ result["B"]["D"]["E"].should == "eee"
98
+ end
99
+
100
+ it "Vector creates subhashes on the way to set the value" do
101
+ result = vector.update_in(3, 3, "X", "Y") { |value| "NEWVALUE" }
102
+ result[3][3]["X"]["Y"].should == "NEWVALUE"
103
+ result[3][2][0].should == 300
104
+ end
105
+ end
106
+
107
+ context "Hash with multi-level including Vector with existing keys" do
108
+ it "passes the value to the block" do
109
+ hash.update_in("F", 1, "H") { |value| value.should == "eitch" }
110
+ end
111
+
112
+ it "replaces the value with the result of the block" do
113
+ result = hash.update_in("F", 1, "H") { |value| "FLIBBLE" }
114
+ result["F"][1]["H"].should == "FLIBBLE"
115
+ end
116
+
117
+ it "should preserve the original" do
118
+ result = hash.update_in("F", 1, "H") { |value| "FLIBBLE" }
119
+ hash["F"][1]["H"].should == "eitch"
120
+ end
121
+ end
122
+
123
+ context "Vector with multi-level including Hash with existing keys" do
124
+ it "passes the value to the block" do
125
+ vector.update_in(4, "B") { |value| value.should == "bravo" }
126
+ end
127
+
128
+ it "replaces the value with the result of the block" do
129
+ result = vector.update_in(4, "B") { |value| "FLIBBLE" }
130
+ result[4]["B"].should == "FLIBBLE"
131
+ end
132
+
133
+ it "should preserve the original" do
134
+ result = vector.update_in(4, "B") { |value| "FLIBBLE" }
135
+ vector[4]["B"].should == "bravo"
136
+ end
137
+ end
138
+
139
+ context "with empty key_path" do
140
+ it "Hash raises ArguemntError" do
141
+ expect { hash.update_in() { |v| 42 } }.to raise_error(ArgumentError)
142
+ end
143
+
144
+ it "Vector raises ArguemntError" do
145
+ expect { vector.update_in() { |v| 42 } }.to raise_error(ArgumentError)
146
+ end
147
+
148
+ end
149
+ end
150
+ end
@@ -8,7 +8,7 @@ describe Array do
8
8
  let(:to_list) { array.to_list }
9
9
 
10
10
  it "returns an equivalent hamster list" do
11
- expect(to_list).to eq(Hamster.list("A", "B", "C"))
11
+ expect(to_list).to eq(L["A", "B", "C"])
12
12
  end
13
13
  end
14
14
  end
@@ -20,11 +20,11 @@ describe Enumerable do
20
20
  let(:to_list) { enumerable.to_list }
21
21
 
22
22
  it "returns an equivalent list" do
23
- expect(to_list).to eq(Hamster.list("A", "B", "C"))
23
+ expect(to_list).to eq(L["A", "B", "C"])
24
24
  end
25
25
 
26
26
  it "works on Ranges" do
27
- expect((1..3).to_list).to eq(Hamster.list(1, 2, 3))
27
+ expect((1..3).to_list).to eq(L[1, 2, 3])
28
28
  end
29
29
  end
30
30
  end
@@ -3,7 +3,7 @@ require "hamster/core_ext/io"
3
3
 
4
4
  describe IO do
5
5
  describe "#to_list" do
6
- let(:list) { Hamster.list("A\n", "B\n", "C\n") }
6
+ let(:list) { L["A\n", "B\n", "C\n"] }
7
7
  let(:to_list) { io.to_list }
8
8
 
9
9
  after(:each) do
@@ -9,15 +9,15 @@ describe Hamster::Deque do
9
9
  %w[A B C],
10
10
  ].each do |values|
11
11
  context "on #{values}" do
12
- let(:deque) { Hamster.deque(*values) }
12
+ let(:deque) { D[*values] }
13
13
 
14
14
  it "preserves the original" do
15
15
  deque.clear
16
- deque.should eql(Hamster.deque(*values))
16
+ deque.should eql(D[*values])
17
17
  end
18
18
 
19
19
  it "returns an empty deque" do
20
- deque.clear.should equal(Hamster.deque)
20
+ deque.clear.should equal(D.empty)
21
21
  end
22
22
  end
23
23
  end
@@ -2,28 +2,28 @@ require "spec_helper"
2
2
  require "hamster/deque"
3
3
 
4
4
  describe Hamster::Deque do
5
- describe ".deque" do
5
+ describe ".[]" do
6
6
  context "with no arguments" do
7
7
  it "always returns the same instance" do
8
- Hamster.deque.class.should be(Hamster::Deque)
9
- Hamster.deque.should equal(Hamster.deque)
8
+ D[].class.should be(Hamster::Deque)
9
+ D[].should equal(D[])
10
10
  end
11
11
 
12
12
  it "returns an empty, frozen deque" do
13
- Hamster.deque.should be_empty
14
- Hamster.deque.should be_frozen
13
+ D[].should be_empty
14
+ D[].should be_frozen
15
15
  end
16
16
  end
17
17
 
18
18
  context "with a number of items" do
19
- let(:deque) { Hamster.deque("A", "B", "C") }
19
+ let(:deque) { D["A", "B", "C"] }
20
20
 
21
21
  it "always returns a different instance" do
22
- deque.should_not equal(Hamster.deque("A", "B", "C"))
22
+ deque.should_not equal(D["A", "B", "C"])
23
23
  end
24
24
 
25
25
  it "is the same as repeatedly using #endeque" do
26
- deque.should eql(Hamster.deque.enqueue("A").enqueue("B").enqueue("C"))
26
+ deque.should eql(D.empty.enqueue("A").enqueue("B").enqueue("C"))
27
27
  end
28
28
  end
29
29
  end
@@ -9,7 +9,7 @@ describe Hamster::Deque do
9
9
  %w[A B C],
10
10
  ].each do |values|
11
11
  context "on #{values.inspect}" do
12
- let(:deque) { Hamster.deque(*values) }
12
+ let(:deque) { D[*values] }
13
13
 
14
14
  it "returns self" do
15
15
  deque.send(method).should equal(deque)
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
  require "hamster/deque"
3
3
 
4
4
  describe Hamster::Deque do
5
- [:dequeue, :tail, :shift].each do |method|
5
+ [:dequeue, :shift].each do |method|
6
6
  describe "##{method}" do
7
7
  [
8
8
  [[], []],
@@ -10,18 +10,26 @@ describe Hamster::Deque do
10
10
  [%w[A B C], %w[B C]],
11
11
  ].each do |values, expected|
12
12
  context "on #{values.inspect}" do
13
- let(:deque) { Hamster.deque(*values) }
13
+ let(:deque) { D[*values] }
14
14
 
15
15
  it "preserves the original" do
16
16
  deque.send(method)
17
- deque.should eql(Hamster.deque(*values))
17
+ deque.should eql(D[*values])
18
18
  end
19
19
 
20
20
  it "returns #{expected.inspect}" do
21
- deque.send(method).should eql(Hamster.deque(*expected))
21
+ deque.send(method).should eql(D[*expected])
22
22
  end
23
23
  end
24
24
  end
25
25
  end
26
+
27
+ context "on empty subclass" do
28
+ let(:subclass) { Class.new(Hamster::Deque) }
29
+ let(:empty_instance) { subclass.new }
30
+ it "returns emtpy object of same class" do
31
+ empty_instance.send(method).class.should be subclass
32
+ end
33
+ end
26
34
  end
27
35
  end
@@ -2,33 +2,31 @@ require "spec_helper"
2
2
  require "hamster/deque"
3
3
 
4
4
  describe Hamster::Deque do
5
- [:empty?, :null?].each do |method|
6
- describe "##{method}" do
7
- [
8
- [[], true],
9
- [["A"], false],
10
- [%w[A B C], false],
11
- ].each do |values, expected|
12
- context "on #{values.inspect}" do
13
- it "returns #{expected.inspect}" do
14
- Hamster.deque(*values).send(method).should == expected
15
- end
5
+ describe "#empty?" do
6
+ [
7
+ [[], true],
8
+ [["A"], false],
9
+ [%w[A B C], false],
10
+ ].each do |values, expected|
11
+ context "on #{values.inspect}" do
12
+ it "returns #{expected.inspect}" do
13
+ D[*values].empty?.should == expected
16
14
  end
17
15
  end
18
16
  end
19
17
 
20
18
  context "after dedequeing an item from #{%w[A B C].inspect}" do
21
19
  it "returns false" do
22
- Hamster.deque("A", "B", "C").dequeue.should_not be_empty
20
+ D["A", "B", "C"].dequeue.should_not be_empty
23
21
  end
24
22
  end
25
23
  end
26
24
 
27
25
  describe ".empty" do
28
- it "returns the canonical empty vector" do
29
- Hamster::Deque.empty.size.should be(0)
30
- Hamster::Deque.empty.class.should be(Hamster::Deque)
31
- Hamster::Deque.empty.object_id.should be(Hamster::EmptyDeque.object_id)
26
+ it "returns the canonical empty deque" do
27
+ D.empty.size.should be(0)
28
+ D.empty.class.should be(Hamster::Deque)
29
+ D.empty.object_id.should be(Hamster::EmptyDeque.object_id)
32
30
  end
33
31
 
34
32
  context "from a subclass" do
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
  require "hamster/deque"
3
3
 
4
4
  describe Hamster::Deque do
5
- [:enqueue, :<<, :add, :conj, :conjoin, :push].each do |method|
5
+ [:enqueue, :push].each do |method|
6
6
  describe "##{method}" do
7
7
  [
8
8
  [[], "A", ["A"]],
@@ -11,15 +11,15 @@ describe Hamster::Deque do
11
11
  [%w[A B C], "D", %w[A B C D]],
12
12
  ].each do |values, new_value, expected|
13
13
  describe "on #{values.inspect} with #{new_value.inspect}" do
14
- let(:deque) { Hamster.deque(*values) }
14
+ let(:deque) { D[*values] }
15
15
 
16
16
  it "preserves the original" do
17
17
  deque.send(method, new_value)
18
- deque.should eql(Hamster.deque(*values))
18
+ deque.should eql(D[*values])
19
19
  end
20
20
 
21
21
  it "returns #{expected.inspect}" do
22
- deque.send(method, new_value).should eql(Hamster.deque(*expected))
22
+ deque.send(method, new_value).should eql(D[*expected])
23
23
  end
24
24
  end
25
25
  end
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+ require "hamster/deque"
3
+
4
+ describe Hamster::Deque do
5
+ describe "#first" do
6
+ [
7
+ [[], nil],
8
+ [["A"], "A"],
9
+ [%w[A B C], "A"],
10
+ ].each do |values, expected|
11
+ context "on #{values.inspect}" do
12
+ it "returns #{expected.inspect}" do
13
+ D[*values].first.should == expected
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -9,7 +9,7 @@ describe Hamster::Deque do
9
9
  [%w[A B C], 'Hamster::Deque["A", "B", "C"]']
10
10
  ].each do |values, expected|
11
11
  context "on #{values.inspect}" do
12
- let(:deque) { Hamster.deque(*values) }
12
+ let(:deque) { D[*values] }
13
13
 
14
14
  it "returns #{expected.inspect}" do
15
15
  deque.inspect.should == expected
@@ -2,17 +2,15 @@ require "spec_helper"
2
2
  require "hamster/deque"
3
3
 
4
4
  describe Hamster::Deque do
5
- [:last, :peek].each do |method|
6
- describe "##{method}" do
7
- [
8
- [[], nil],
9
- [["A"], "A"],
10
- [%w[A B C], "C"],
11
- ].each do |values, expected|
12
- context "on #{values.inspect}" do
13
- it "returns #{expected.inspect}" do
14
- Hamster.deque(*values).send(method).should eql(expected)
15
- end
5
+ describe "#last" do
6
+ [
7
+ [[], nil],
8
+ [["A"], "A"],
9
+ [%w[A B C], "C"],
10
+ ].each do |values, expected|
11
+ context "on #{values.inspect}" do
12
+ it "returns #{expected.inspect}" do
13
+ D[*values].last.should eql(expected)
16
14
  end
17
15
  end
18
16
  end
@@ -7,7 +7,7 @@ describe Hamster::Deque do
7
7
  File.join(RbConfig::CONFIG["bindir"], RbConfig::CONFIG["ruby_install_name"])
8
8
  end
9
9
  let(:child_cmd) do
10
- %Q|#{ruby} -I lib -r hamster -e 'deque = Hamster.deque(5, 10, 15); $stdout.write(Marshal.dump(deque))'|
10
+ %Q|#{ruby} -I lib -r hamster -e 'deque = Hamster::Deque[5, 10, 15]; $stdout.write(Marshal.dump(deque))'|
11
11
  end
12
12
 
13
13
  let(:reloaded_deque) do
@@ -19,16 +19,16 @@ describe Hamster::Deque do
19
19
  end
20
20
 
21
21
  it "can survive dumping and loading into a new process" do
22
- expect(reloaded_deque).to eql(Hamster.deque(5, 10, 15))
22
+ expect(reloaded_deque).to eql(D[5, 10, 15])
23
23
  end
24
24
 
25
25
  it "is still possible to push and pop items after loading" do
26
26
  expect(reloaded_deque.first).to eq(5)
27
27
  expect(reloaded_deque.last).to eq(15)
28
- expect(reloaded_deque.push(20)).to eql(Hamster.deque(5, 10, 15, 20))
29
- expect(reloaded_deque.pop).to eql(Hamster.deque(5, 10))
30
- expect(reloaded_deque.unshift(1)).to eql(Hamster.deque(1, 5, 10, 15))
31
- expect(reloaded_deque.shift).to eql(Hamster.deque(10, 15))
28
+ expect(reloaded_deque.push(20)).to eql(D[5, 10, 15, 20])
29
+ expect(reloaded_deque.pop).to eql(D[5, 10])
30
+ expect(reloaded_deque.unshift(1)).to eql(D[1, 5, 10, 15])
31
+ expect(reloaded_deque.shift).to eql(D[10, 15])
32
32
  end
33
33
  end
34
34
  end