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
@@ -3,7 +3,7 @@ require "set"
3
3
  require "hamster/set"
4
4
 
5
5
  describe Hamster::Set do
6
- let(:set) { Hamster.set("A", "B", "C") }
6
+ let(:set) { S["A", "B", "C"] }
7
7
 
8
8
  describe "#reverse_each" do
9
9
  let(:reverse_each) { set.reverse_each(&block) }
@@ -3,7 +3,7 @@ require "hamster/set"
3
3
 
4
4
  describe Hamster::Set do
5
5
  describe "#sample" do
6
- let(:set) { Hamster::Set.new(1..10) }
6
+ let(:set) { S.new(1..10) }
7
7
 
8
8
  it "returns a randomly chosen item" do
9
9
  chosen = 100.times.map { set.sample }
@@ -2,9 +2,9 @@ require "spec_helper"
2
2
  require "hamster/set"
3
3
 
4
4
  describe Hamster::Set do
5
- [:filter, :select, :find_all].each do |method|
5
+ [:select, :find_all].each do |method|
6
6
  describe "##{method}" do
7
- let(:set) { Hamster.set("A", "B", "C") }
7
+ let(:set) { S["A", "B", "C"] }
8
8
 
9
9
  context "when everything matches" do
10
10
  it "returns self" do
@@ -18,18 +18,18 @@ describe Hamster::Set do
18
18
 
19
19
  it "preserves the original" do
20
20
  result
21
- set.should eql(Hamster.set("A", "B", "C"))
21
+ set.should eql(S["A", "B", "C"])
22
22
  end
23
23
 
24
24
  it "returns a set with the matching values" do
25
- result.should eql(Hamster.set("A"))
25
+ result.should eql(S["A"])
26
26
  end
27
27
  end
28
28
 
29
29
  context "with no block" do
30
30
  it "returns an Enumerator" do
31
31
  set.send(method).class.should be(Enumerator)
32
- set.send(method).each { |item| item == "A" }.should eql(Hamster.set("A"))
32
+ set.send(method).each { |item| item == "A" }.should eql(S["A"])
33
33
  end
34
34
  end
35
35
  end
@@ -39,7 +39,7 @@ describe Hamster::Set do
39
39
 
40
40
  it "preserves the original" do
41
41
  result
42
- set.should eql(Hamster.set("A", "B", "C"))
42
+ set.should eql(S["A", "B", "C"])
43
43
  end
44
44
 
45
45
  it "returns the canonical empty set" do
@@ -51,15 +51,15 @@ describe Hamster::Set do
51
51
  it "returns an instance of the same class" do
52
52
  subclass = Class.new(Hamster::Set)
53
53
  instance = subclass.new(['A', 'B', 'C'])
54
- instance.filter { true }.class.should be(subclass)
55
- instance.filter { false }.class.should be(subclass)
56
- instance.filter { rand(2) == 0 }.class.should be(subclass)
54
+ instance.send(method) { true }.class.should be(subclass)
55
+ instance.send(method) { false }.class.should be(subclass)
56
+ instance.send(method) { rand(2) == 0 }.class.should be(subclass)
57
57
  end
58
58
  end
59
59
 
60
60
  it "works on a large set, with many combinations of input" do
61
61
  items = (1..1000).to_a
62
- original = Hamster::Set.new(items)
62
+ original = S.new(items)
63
63
  30.times do
64
64
  threshold = rand(1000)
65
65
  result = original.send(method) { |item| item <= threshold }
@@ -67,7 +67,7 @@ describe Hamster::Set do
67
67
  result.each { |item| item.should <= threshold }
68
68
  (threshold+1).upto(1000) { |item| result.include?(item).should == false }
69
69
  end
70
- original.should eql(Hamster::Set.new(items))
70
+ original.should eql(S.new(items))
71
71
  end
72
72
  end
73
73
  end
@@ -10,7 +10,7 @@ describe Hamster::Set do
10
10
  [%w[A B C], 3],
11
11
  ].each do |values, result|
12
12
  it "returns #{result} for #{values.inspect}" do
13
- Hamster.set(*values).send(method).should == result
13
+ S[*values].send(method).should == result
14
14
  end
15
15
  end
16
16
  end
@@ -13,19 +13,19 @@ describe Hamster::Set do
13
13
  [%w[Ichi Ni San], %w[Ni San Ichi]],
14
14
  ].each do |values, expected|
15
15
  describe "on #{values.inspect}" do
16
- let(:set) { Hamster.set(*values) }
16
+ let(:set) { S[*values] }
17
17
 
18
18
  describe "with a block" do
19
19
  let(:result) { set.send(method, &comparator) }
20
20
 
21
21
  it "returns #{expected.inspect}" do
22
- result.should eql(Hamster.sorted_set(*expected, &comparator))
22
+ result.should eql(SS.new(expected, &comparator))
23
23
  result.to_a.should == expected
24
24
  end
25
25
 
26
26
  it "doesn't change the original Set" do
27
27
  result
28
- set.should eql(Hamster::Set.new(values))
28
+ set.should eql(S.new(values))
29
29
  end
30
30
  end
31
31
 
@@ -33,17 +33,28 @@ describe Hamster::Set do
33
33
  let(:result) { set.send(method) }
34
34
 
35
35
  it "returns #{expected.sort.inspect}" do
36
- result.should eql(Hamster.sorted_set(*expected))
36
+ result.should eql(SS[*expected])
37
37
  result.to_a.should == expected.sort
38
38
  end
39
39
 
40
40
  it "doesn't change the original Set" do
41
41
  result
42
- set.should eql(Hamster::Set.new(values))
42
+ set.should eql(S.new(values))
43
43
  end
44
44
  end
45
45
  end
46
46
  end
47
47
  end
48
48
  end
49
+
50
+ describe "#sort_by" do
51
+ it "only calls the passed block once for each item" do
52
+ count = 0
53
+ fn = lambda { |x| count += 1; -x }
54
+ items = 100.times.collect { rand(10000) }.uniq
55
+
56
+ S[*items].sort_by(&fn).to_a.should == items.sort.reverse
57
+ count.should == items.length
58
+ end
59
+ end
49
60
  end
@@ -19,7 +19,7 @@ describe Hamster::Set do
19
19
  ].each do |a, b, expected|
20
20
  describe "for #{a.inspect} and #{b.inspect}" do
21
21
  it "returns #{expected}" do
22
- Hamster.set(*a).send(method, Hamster.set(*b)).should == expected
22
+ S[*a].send(method, S[*b]).should == expected
23
23
  end
24
24
  end
25
25
  end
@@ -43,7 +43,7 @@ describe Hamster::Set do
43
43
  ].each do |a, b, expected|
44
44
  describe "for #{a.inspect} and #{b.inspect}" do
45
45
  it "returns #{expected}" do
46
- Hamster.set(*a).send(method, Hamster.set(*b)).should == expected
46
+ S[*a].send(method, S[*b]).should == expected
47
47
  end
48
48
  end
49
49
  end
@@ -9,14 +9,14 @@ describe Hamster::Set do
9
9
  [[1, 3, 5, 7, 11], 27],
10
10
  ].each do |values, expected|
11
11
  context "on #{values.inspect}" do
12
- let(:set) { Hamster.set(*values) }
12
+ let(:set) { S[*values] }
13
13
 
14
14
  it "returns #{expected.inspect}" do
15
15
  set.sum.should == expected
16
16
  end
17
17
 
18
18
  it "doesn't change the original Set" do
19
- set.should eql(Hamster::Set.new(values))
19
+ set.should eql(S.new(values))
20
20
  end
21
21
  end
22
22
  end
@@ -19,7 +19,7 @@ describe Hamster::Set do
19
19
  ].each do |a, b, expected|
20
20
  describe "for #{a.inspect} and #{b.inspect}" do
21
21
  it "returns #{expected}" do
22
- Hamster.set(*a).send(method, Hamster.set(*b)).should == expected
22
+ S[*a].send(method, S[*b]).should == expected
23
23
  end
24
24
  end
25
25
  end
@@ -43,7 +43,7 @@ describe Hamster::Set do
43
43
  ].each do |a, b, expected|
44
44
  describe "for #{a.inspect} and #{b.inspect}" do
45
45
  it "returns #{expected}" do
46
- Hamster.set(*a).send(method, Hamster.set(*b)).should == expected
46
+ S[*a].send(method, S[*b]).should == expected
47
47
  end
48
48
  end
49
49
  end
@@ -6,7 +6,7 @@ describe Hamster::Set do
6
6
  describe "##{method}" do
7
7
  ('a'..'z').each do |letter|
8
8
  let(:values) { ('a'..letter).to_a }
9
- let(:set) { Hamster::Set.new(values) }
9
+ let(:set) { S.new(values) }
10
10
  let(:result) { set.send(method) }
11
11
 
12
12
  context "on 'a'..'#{letter}'" do
@@ -16,7 +16,7 @@ describe Hamster::Set do
16
16
 
17
17
  it "doesn't change the original Set" do
18
18
  result
19
- set.should eql(Hamster.set(*values))
19
+ set.should eql(S[*values])
20
20
  end
21
21
 
22
22
  it "returns a mutable array" do
@@ -10,7 +10,7 @@ describe Hamster::Set do
10
10
  %w[A B C],
11
11
  ].each do |values|
12
12
  context "on #{values.inspect}" do
13
- let(:set) { Hamster.set(*values) }
13
+ let(:set) { S[*values] }
14
14
  let(:list) { set.to_list }
15
15
 
16
16
  it "returns a list" do
@@ -19,7 +19,7 @@ describe Hamster::Set do
19
19
 
20
20
  it "doesn't change the original Set" do
21
21
  list
22
- set.should eql(Hamster::Set.new(values))
22
+ set.should eql(S.new(values))
23
23
  end
24
24
 
25
25
  describe "the returned list" do
@@ -9,7 +9,7 @@ describe Hamster::Set do
9
9
  %w[A B C],
10
10
  ].each do |values|
11
11
  describe "on #{values.inspect}" do
12
- let(:set) { Hamster.set(*values) }
12
+ let(:set) { S[*values] }
13
13
 
14
14
  it "returns self" do
15
15
  set.to_set.should equal(set)
@@ -14,42 +14,51 @@ describe Hamster::Set do
14
14
  [%w[A B C], %w[X Y Z], %w[A B C X Y Z]]
15
15
  ].each do |a, b, expected|
16
16
  context "for #{a.inspect} and #{b.inspect}" do
17
- let(:set_a) { Hamster.set(*a) }
18
- let(:set_b) { Hamster.set(*b) }
17
+ let(:set_a) { S[*a] }
18
+ let(:set_b) { S[*b] }
19
19
 
20
20
  it "returns #{expected.inspect}, without changing the original Sets" do
21
- set_a.send(method, set_b).should eql(Hamster.set(*expected))
22
- set_a.should eql(Hamster::Set.new(a))
23
- set_b.should eql(Hamster::Set.new(b))
21
+ set_a.send(method, set_b).should eql(S[*expected])
22
+ set_a.should eql(S.new(a))
23
+ set_b.should eql(S.new(b))
24
24
  end
25
25
  end
26
26
 
27
27
  context "for #{b.inspect} and #{a.inspect}" do
28
- let(:set_a) { Hamster.set(*a) }
29
- let(:set_b) { Hamster.set(*b) }
28
+ let(:set_a) { S[*a] }
29
+ let(:set_b) { S[*b] }
30
30
 
31
31
  it "returns #{expected.inspect}, without changing the original Sets" do
32
- set_b.send(method, set_a).should eql(Hamster.set(*expected))
33
- set_a.should eql(Hamster::Set.new(a))
34
- set_b.should eql(Hamster::Set.new(b))
32
+ set_b.send(method, set_a).should eql(S[*expected])
33
+ set_a.should eql(S.new(a))
34
+ set_b.should eql(S.new(b))
35
35
  end
36
36
  end
37
37
 
38
38
  context "when passed a Ruby Array" do
39
39
  it "returns the expected Set" do
40
- Hamster.set(*a).send(method, b.freeze).should eql(Hamster.set(*expected))
41
- Hamster.set(*b).send(method, a.freeze).should eql(Hamster.set(*expected))
40
+ S[*a].send(method, b.freeze).should eql(S[*expected])
41
+ S[*b].send(method, a.freeze).should eql(S[*expected])
42
42
  end
43
43
  end
44
44
 
45
45
  context "from a subclass" do
46
46
  it "returns an instance of the subclass" do
47
47
  subclass = Class.new(Hamster::Set)
48
- subclass.new(a).union(Hamster::Set.new(b)).class.should be(subclass)
49
- subclass.new(b).union(Hamster::Set.new(a)).class.should be(subclass)
48
+ subclass.new(a).send(method, S.new(b)).class.should be(subclass)
49
+ subclass.new(b).send(method, S.new(a)).class.should be(subclass)
50
50
  end
51
51
  end
52
52
  end
53
+
54
+ context "when receiving a subset" do
55
+ let(:set_a) { S.new(1..300) }
56
+ let(:set_b) { S.new(1..200) }
57
+
58
+ it "returns self" do
59
+ set_a.send(method, set_b).should be(set_a)
60
+ end
61
+ end
53
62
  end
54
63
  end
55
64
  end
@@ -6,11 +6,11 @@ describe Hamster::SortedSet do
6
6
  context "when called without a block" do
7
7
  it "returns a sorted set of all items higher than the argument" do
8
8
  100.times do
9
- items = rand(100).times.collect { rand(1000) }
10
- set = Hamster::SortedSet.new(items)
9
+ items = rand(100).times.collect { rand(1000) }
10
+ set = SS.new(items)
11
11
  threshold = rand(1000)
12
- result = set.above(threshold)
13
- array = items.select { |x| x > threshold }.sort
12
+ result = set.above(threshold)
13
+ array = items.select { |x| x > threshold }.sort
14
14
  result.class.should be(Hamster::SortedSet)
15
15
  result.size.should == array.size
16
16
  result.to_a.should == array
@@ -21,10 +21,10 @@ describe Hamster::SortedSet do
21
21
  context "when called with a block" do
22
22
  it "yields all the items higher than the argument" do
23
23
  100.times do
24
- items = rand(100).times.collect { rand(1000) }
25
- set = Hamster::SortedSet.new(items)
24
+ items = rand(100).times.collect { rand(1000) }
25
+ set = SS.new(items)
26
26
  threshold = rand(1000)
27
- result = []
27
+ result = []
28
28
  set.above(threshold) { |x| result << x }
29
29
  array = items.select { |x| x > threshold }.sort
30
30
  result.size.should == array.size
@@ -35,15 +35,15 @@ describe Hamster::SortedSet do
35
35
 
36
36
  context "on an empty set" do
37
37
  it "returns an empty set" do
38
- Hamster::SortedSet.empty.above(1).should be_empty
39
- Hamster::SortedSet.empty.above('abc').should be_empty
40
- Hamster::SortedSet.empty.above(:symbol).should be_empty
38
+ SS.empty.above(1).should be_empty
39
+ SS.empty.above('abc').should be_empty
40
+ SS.empty.above(:symbol).should be_empty
41
41
  end
42
42
  end
43
43
 
44
44
  context "with an argument higher than all the values in the set" do
45
45
  it "returns an empty set" do
46
- result = Hamster.sorted_set(*(1..100)).above(100)
46
+ result = SS.new(1..100).above(100)
47
47
  result.class.should be(Hamster::SortedSet)
48
48
  result.should be_empty
49
49
  end
@@ -2,25 +2,25 @@ require "spec_helper"
2
2
  require "hamster/sorted_set"
3
3
 
4
4
  describe Hamster::SortedSet do
5
- let(:sorted_set) { Hamster.sorted_set("B", "C", "D") }
5
+ let(:sorted_set) { SS["B", "C", "D"] }
6
6
 
7
7
  [:add, :<<].each do |method|
8
8
  describe "##{method}" do
9
9
  context "with a unique value" do
10
10
  it "preserves the original" do
11
11
  sorted_set.send(method, "A")
12
- sorted_set.should eql(Hamster.sorted_set("B", "C", "D"))
12
+ sorted_set.should eql(SS["B", "C", "D"])
13
13
  end
14
14
 
15
15
  it "returns a copy with the superset of values (in order)" do
16
- sorted_set.send(method, "A").should eql(Hamster.sorted_set("A", "B", "C", "D"))
16
+ sorted_set.send(method, "A").should eql(SS["A", "B", "C", "D"])
17
17
  end
18
18
  end
19
19
 
20
20
  context "with a duplicate value" do
21
21
  it "preserves the original values" do
22
22
  sorted_set.send(method, "C")
23
- sorted_set.should eql(Hamster.sorted_set("B", "C", "D"))
23
+ sorted_set.should eql(SS["B", "C", "D"])
24
24
  end
25
25
 
26
26
  it "returns self" do
@@ -30,7 +30,7 @@ describe Hamster::SortedSet do
30
30
 
31
31
  context "on a set ordered by a comparator" do
32
32
  it "inserts the new item in the correct place" do
33
- s = Hamster.sorted_set('tick', 'pig', 'hippopotamus') { |str| str.length }
33
+ s = SS.new(['tick', 'pig', 'hippopotamus']) { |str| str.length }
34
34
  s.add('giraffe').to_a.should == ['pig', 'tick', 'giraffe', 'hippopotamus']
35
35
  end
36
36
  end
@@ -41,18 +41,18 @@ describe Hamster::SortedSet do
41
41
  context "with a unique value" do
42
42
  it "preserves the original" do
43
43
  sorted_set.add?("A")
44
- sorted_set.should eql(Hamster.sorted_set("B", "C", "D"))
44
+ sorted_set.should eql(SS["B", "C", "D"])
45
45
  end
46
46
 
47
47
  it "returns a copy with the superset of values" do
48
- sorted_set.add?("A").should eql(Hamster.sorted_set("A", "B", "C", "D"))
48
+ sorted_set.add?("A").should eql(SS["A", "B", "C", "D"])
49
49
  end
50
50
  end
51
51
 
52
52
  context "with a duplicate value" do
53
53
  it "preserves the original values" do
54
54
  sorted_set.add?("C")
55
- sorted_set.should eql(Hamster.sorted_set("B", "C", "D"))
55
+ sorted_set.should eql(SS["B", "C", "D"])
56
56
  end
57
57
 
58
58
  it "returns false" do
@@ -17,7 +17,7 @@ describe Hamster::SortedSet do
17
17
  ].each do |values, number, expected|
18
18
  describe "#{values.inspect} with #{number}" do
19
19
  it "returns #{expected.inspect}" do
20
- Hamster.sorted_set(*values).at(number).should == expected
20
+ SS[*values].at(number).should == expected
21
21
  end
22
22
  end
23
23
  end
@@ -6,11 +6,11 @@ describe Hamster::SortedSet do
6
6
  context "when called without a block" do
7
7
  it "returns a sorted set of all items lower than the argument" do
8
8
  100.times do
9
- items = rand(100).times.collect { rand(1000) }
10
- set = Hamster::SortedSet.new(items)
9
+ items = rand(100).times.collect { rand(1000) }
10
+ set = SS.new(items)
11
11
  threshold = rand(1000)
12
- result = set.below(threshold)
13
- array = items.select { |x| x < threshold }.sort
12
+ result = set.below(threshold)
13
+ array = items.select { |x| x < threshold }.sort
14
14
  result.class.should be(Hamster::SortedSet)
15
15
  result.size.should == array.size
16
16
  result.to_a.should == array
@@ -21,10 +21,10 @@ describe Hamster::SortedSet do
21
21
  context "when called with a block" do
22
22
  it "yields all the items lower than the argument" do
23
23
  100.times do
24
- items = rand(100).times.collect { rand(1000) }
25
- set = Hamster::SortedSet.new(items)
24
+ items = rand(100).times.collect { rand(1000) }
25
+ set = SS.new(items)
26
26
  threshold = rand(1000)
27
- result = []
27
+ result = []
28
28
  set.below(threshold) { |x| result << x }
29
29
  array = items.select { |x| x < threshold }.sort
30
30
  result.size.should == array.size
@@ -35,15 +35,15 @@ describe Hamster::SortedSet do
35
35
 
36
36
  context "on an empty set" do
37
37
  it "returns an empty set" do
38
- Hamster::SortedSet.empty.below(1).should be_empty
39
- Hamster::SortedSet.empty.below('abc').should be_empty
40
- Hamster::SortedSet.empty.below(:symbol).should be_empty
38
+ SS.empty.below(1).should be_empty
39
+ SS.empty.below('abc').should be_empty
40
+ SS.empty.below(:symbol).should be_empty
41
41
  end
42
42
  end
43
43
 
44
44
  context "with an argument lower than all the values in the set" do
45
45
  it "returns an empty set" do
46
- result = Hamster.sorted_set(*(1..100)).below(1)
46
+ result = SS.new(1..100).below(1)
47
47
  result.class.should be(Hamster::SortedSet)
48
48
  result.should be_empty
49
49
  end