hamster 0.4.3 → 1.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 (757) hide show
  1. checksums.yaml +7 -0
  2. data/lib/hamster.rb +11 -9
  3. data/lib/hamster/core_ext.rb +2 -3
  4. data/lib/hamster/core_ext/enumerable.rb +18 -27
  5. data/lib/hamster/core_ext/io.rb +16 -25
  6. data/lib/hamster/deque.rb +252 -0
  7. data/lib/hamster/enumerable.rb +123 -112
  8. data/lib/hamster/experimental/mutable_queue.rb +5 -14
  9. data/lib/hamster/experimental/mutable_set.rb +7 -14
  10. data/lib/hamster/hash.rb +732 -102
  11. data/lib/hamster/immutable.rb +4 -10
  12. data/lib/hamster/list.rb +1155 -215
  13. data/lib/hamster/{experimental/mutable_hash.rb → mutable_hash.rb} +11 -14
  14. data/lib/hamster/nested.rb +36 -0
  15. data/lib/hamster/{experimental/read_copy_update.rb → read_copy_update.rb} +10 -8
  16. data/lib/hamster/set.rb +488 -90
  17. data/lib/hamster/sorted_set.rb +1397 -0
  18. data/lib/hamster/trie.rb +210 -65
  19. data/lib/hamster/undefined.rb +1 -7
  20. data/lib/hamster/vector.rb +1329 -83
  21. data/lib/hamster/version.rb +1 -3
  22. data/spec/{hamster/core_ext → fixtures}/io_spec.txt +0 -0
  23. data/spec/lib/hamster/core_ext/array_spec.rb +14 -0
  24. data/spec/lib/hamster/core_ext/enumerable_spec.rb +30 -0
  25. data/spec/lib/hamster/core_ext/io_spec.rb +29 -0
  26. data/spec/lib/hamster/deque/clear_spec.rb +34 -0
  27. data/spec/lib/hamster/deque/construction_spec.rb +30 -0
  28. data/spec/lib/hamster/deque/copying_spec.rb +20 -0
  29. data/spec/lib/hamster/deque/dequeue_spec.rb +35 -0
  30. data/spec/lib/hamster/deque/empty_spec.rb +40 -0
  31. data/spec/lib/hamster/deque/enqueue_spec.rb +28 -0
  32. data/spec/lib/hamster/deque/first_spec.rb +18 -0
  33. data/spec/lib/hamster/deque/inspect_spec.rb +24 -0
  34. data/spec/lib/hamster/deque/last_spec.rb +18 -0
  35. data/spec/lib/hamster/deque/marshal_spec.rb +34 -0
  36. data/spec/lib/hamster/deque/new_spec.rb +44 -0
  37. data/spec/lib/hamster/deque/pop_spec.rb +33 -0
  38. data/spec/lib/hamster/deque/pretty_print_spec.rb +24 -0
  39. data/spec/lib/hamster/deque/random_modification_spec.rb +34 -0
  40. data/spec/lib/hamster/deque/size_spec.rb +20 -0
  41. data/spec/lib/hamster/deque/to_a_spec.rb +27 -0
  42. data/spec/lib/hamster/deque/to_ary_spec.rb +36 -0
  43. data/spec/lib/hamster/deque/to_list_spec.rb +26 -0
  44. data/spec/lib/hamster/deque/unshift_spec.rb +26 -0
  45. data/spec/lib/hamster/experimental/mutable_set/add_qm_spec.rb +39 -0
  46. data/spec/lib/hamster/experimental/mutable_set/add_spec.rb +37 -0
  47. data/spec/lib/hamster/experimental/mutable_set/delete_qm_spec.rb +38 -0
  48. data/spec/lib/hamster/experimental/mutable_set/delete_spec.rb +37 -0
  49. data/spec/lib/hamster/hash/all_spec.rb +54 -0
  50. data/spec/lib/hamster/hash/any_spec.rb +54 -0
  51. data/spec/lib/hamster/hash/assoc_spec.rb +52 -0
  52. data/spec/lib/hamster/hash/clear_spec.rb +43 -0
  53. data/spec/lib/hamster/hash/construction_spec.rb +39 -0
  54. data/spec/lib/hamster/hash/copying_spec.rb +14 -0
  55. data/spec/lib/hamster/hash/default_proc_spec.rb +73 -0
  56. data/spec/lib/hamster/hash/delete_spec.rb +40 -0
  57. data/spec/lib/hamster/hash/each_spec.rb +78 -0
  58. data/spec/lib/hamster/hash/each_with_index_spec.rb +30 -0
  59. data/spec/lib/hamster/hash/empty_spec.rb +44 -0
  60. data/spec/lib/hamster/hash/eql_spec.rb +70 -0
  61. data/spec/lib/hamster/hash/except_spec.rb +43 -0
  62. data/spec/lib/hamster/hash/fetch_spec.rb +58 -0
  63. data/spec/lib/hamster/hash/find_spec.rb +44 -0
  64. data/spec/lib/hamster/hash/flat_map_spec.rb +36 -0
  65. data/spec/lib/hamster/hash/flatten_spec.rb +99 -0
  66. data/spec/lib/hamster/hash/get_spec.rb +80 -0
  67. data/spec/lib/hamster/hash/has_key_spec.rb +32 -0
  68. data/spec/lib/hamster/hash/has_value_spec.rb +28 -0
  69. data/spec/lib/hamster/hash/hash_spec.rb +30 -0
  70. data/spec/{hamster → lib/hamster}/hash/immutable_spec.rb +3 -6
  71. data/spec/lib/hamster/hash/inspect_spec.rb +31 -0
  72. data/spec/lib/hamster/hash/invert_spec.rb +31 -0
  73. data/spec/lib/hamster/hash/key_spec.rb +28 -0
  74. data/spec/lib/hamster/hash/keys_spec.rb +17 -0
  75. data/spec/lib/hamster/hash/map_spec.rb +46 -0
  76. data/spec/lib/hamster/hash/marshal_spec.rb +29 -0
  77. data/spec/lib/hamster/hash/merge_spec.rb +83 -0
  78. data/spec/lib/hamster/hash/min_max_spec.rb +46 -0
  79. data/spec/lib/hamster/hash/new_spec.rb +71 -0
  80. data/spec/lib/hamster/hash/none_spec.rb +49 -0
  81. data/spec/lib/hamster/hash/partition_spec.rb +36 -0
  82. data/spec/lib/hamster/hash/pretty_print_spec.rb +35 -0
  83. data/spec/lib/hamster/hash/put_spec.rb +103 -0
  84. data/spec/lib/hamster/hash/reduce_spec.rb +36 -0
  85. data/spec/lib/hamster/hash/reject_spec.rb +62 -0
  86. data/spec/lib/hamster/hash/reverse_each_spec.rb +28 -0
  87. data/spec/lib/hamster/hash/sample_spec.rb +14 -0
  88. data/spec/lib/hamster/hash/select_spec.rb +58 -0
  89. data/spec/{hamster → lib/hamster}/hash/size_spec.rb +9 -18
  90. data/spec/lib/hamster/hash/slice_spec.rb +45 -0
  91. data/spec/lib/hamster/hash/sort_spec.rb +27 -0
  92. data/spec/lib/hamster/hash/store_spec.rb +76 -0
  93. data/spec/lib/hamster/hash/take_spec.rb +36 -0
  94. data/spec/lib/hamster/hash/to_a_spec.rb +14 -0
  95. data/spec/lib/hamster/hash/to_hash_spec.rb +22 -0
  96. data/spec/lib/hamster/hash/update_in_spec.rb +80 -0
  97. data/spec/lib/hamster/hash/values_at_spec.rb +14 -0
  98. data/spec/lib/hamster/hash/values_spec.rb +25 -0
  99. data/spec/{hamster → lib/hamster}/immutable/copying_spec.rb +3 -10
  100. data/spec/{hamster → lib/hamster}/immutable/immutable_spec.rb +3 -16
  101. data/spec/lib/hamster/immutable/memoize_spec.rb +56 -0
  102. data/spec/lib/hamster/immutable/new_spec.rb +14 -0
  103. data/spec/lib/hamster/immutable/transform_spec.rb +26 -0
  104. data/spec/lib/hamster/immutable/transform_unless_spec.rb +44 -0
  105. data/spec/lib/hamster/list/add_spec.rb +26 -0
  106. data/spec/lib/hamster/list/all_spec.rb +58 -0
  107. data/spec/lib/hamster/list/any_spec.rb +50 -0
  108. data/spec/lib/hamster/list/append_spec.rb +39 -0
  109. data/spec/lib/hamster/list/at_spec.rb +30 -0
  110. data/spec/lib/hamster/list/break_spec.rb +70 -0
  111. data/spec/lib/hamster/list/cadr_spec.rb +39 -0
  112. data/spec/lib/hamster/list/chunk_spec.rb +29 -0
  113. data/spec/lib/hamster/list/clear_spec.rb +25 -0
  114. data/spec/lib/hamster/list/combination_spec.rb +34 -0
  115. data/spec/lib/hamster/list/compact_spec.rb +35 -0
  116. data/spec/lib/hamster/list/compare_spec.rb +31 -0
  117. data/spec/lib/hamster/list/cons_spec.rb +26 -0
  118. data/spec/lib/hamster/list/construction_spec.rb +111 -0
  119. data/spec/lib/hamster/list/copying_spec.rb +20 -0
  120. data/spec/lib/hamster/list/count_spec.rb +37 -0
  121. data/spec/lib/hamster/list/cycle_spec.rb +29 -0
  122. data/spec/lib/hamster/list/delete_at_spec.rb +19 -0
  123. data/spec/lib/hamster/list/delete_spec.rb +17 -0
  124. data/spec/lib/hamster/list/drop_spec.rb +31 -0
  125. data/spec/lib/hamster/list/drop_while_spec.rb +39 -0
  126. data/spec/lib/hamster/list/each_slice_spec.rb +52 -0
  127. data/spec/lib/hamster/list/each_spec.rb +41 -0
  128. data/spec/lib/hamster/list/each_with_index_spec.rb +29 -0
  129. data/spec/lib/hamster/list/empty_spec.rb +24 -0
  130. data/spec/lib/hamster/list/eql_spec.rb +62 -0
  131. data/spec/lib/hamster/list/fill_spec.rb +50 -0
  132. data/spec/lib/hamster/list/find_all_spec.rb +71 -0
  133. data/spec/{hamster → lib/hamster}/list/find_index_spec.rb +7 -29
  134. data/spec/{hamster → lib/hamster}/list/find_spec.rb +13 -35
  135. data/spec/lib/hamster/list/flat_map_spec.rb +52 -0
  136. data/spec/lib/hamster/list/flatten_spec.rb +31 -0
  137. data/spec/lib/hamster/list/grep_spec.rb +47 -0
  138. data/spec/lib/hamster/list/group_by_spec.rb +42 -0
  139. data/spec/lib/hamster/list/hash_spec.rb +22 -0
  140. data/spec/{hamster → lib/hamster}/list/head_spec.rb +6 -21
  141. data/spec/{hamster → lib/hamster}/list/include_spec.rb +8 -29
  142. data/spec/lib/hamster/list/index_spec.rb +34 -0
  143. data/spec/lib/hamster/list/indices_spec.rb +62 -0
  144. data/spec/lib/hamster/list/init_spec.rb +29 -0
  145. data/spec/lib/hamster/list/inits_spec.rb +29 -0
  146. data/spec/lib/hamster/list/insert_spec.rb +47 -0
  147. data/spec/lib/hamster/list/inspect_spec.rb +30 -0
  148. data/spec/lib/hamster/list/intersperse_spec.rb +29 -0
  149. data/spec/lib/hamster/list/join_spec.rb +64 -0
  150. data/spec/lib/hamster/list/last_spec.rb +24 -0
  151. data/spec/lib/hamster/list/ltlt_spec.rb +20 -0
  152. data/spec/lib/hamster/list/map_spec.rb +46 -0
  153. data/spec/lib/hamster/list/maximum_spec.rb +40 -0
  154. data/spec/{hamster → lib/hamster}/list/merge_by_spec.rb +9 -36
  155. data/spec/{hamster → lib/hamster}/list/merge_spec.rb +5 -24
  156. data/spec/lib/hamster/list/minimum_spec.rb +40 -0
  157. data/spec/lib/hamster/list/multithreading_spec.rb +48 -0
  158. data/spec/{hamster → lib/hamster}/list/none_spec.rb +14 -41
  159. data/spec/{hamster → lib/hamster}/list/one_spec.rb +15 -40
  160. data/spec/lib/hamster/list/partition_spec.rb +116 -0
  161. data/spec/lib/hamster/list/permutation_spec.rb +56 -0
  162. data/spec/lib/hamster/list/pop_spec.rb +26 -0
  163. data/spec/lib/hamster/list/product_spec.rb +24 -0
  164. data/spec/lib/hamster/list/reduce_spec.rb +54 -0
  165. data/spec/lib/hamster/list/reject_spec.rb +46 -0
  166. data/spec/lib/hamster/list/reverse_spec.rb +35 -0
  167. data/spec/lib/hamster/list/rotate_spec.rb +37 -0
  168. data/spec/lib/hamster/list/sample_spec.rb +14 -0
  169. data/spec/lib/hamster/list/select_spec.rb +71 -0
  170. data/spec/lib/hamster/list/size_spec.rb +26 -0
  171. data/spec/lib/hamster/list/slice_spec.rb +230 -0
  172. data/spec/lib/hamster/list/sorting_spec.rb +47 -0
  173. data/spec/lib/hamster/list/span_spec.rb +77 -0
  174. data/spec/lib/hamster/list/split_at_spec.rb +44 -0
  175. data/spec/lib/hamster/list/subsequences_spec.rb +24 -0
  176. data/spec/lib/hamster/list/sum_spec.rb +24 -0
  177. data/spec/lib/hamster/list/tail_spec.rb +31 -0
  178. data/spec/lib/hamster/list/tails_spec.rb +29 -0
  179. data/spec/lib/hamster/list/take_spec.rb +31 -0
  180. data/spec/lib/hamster/list/take_while_spec.rb +47 -0
  181. data/spec/lib/hamster/list/to_a_spec.rb +40 -0
  182. data/spec/lib/hamster/list/to_ary_spec.rb +42 -0
  183. data/spec/lib/hamster/list/to_list_spec.rb +20 -0
  184. data/spec/lib/hamster/list/to_set_spec.rb +19 -0
  185. data/spec/lib/hamster/list/transpose_spec.rb +20 -0
  186. data/spec/lib/hamster/list/union_spec.rb +32 -0
  187. data/spec/lib/hamster/list/uniq_spec.rb +30 -0
  188. data/spec/lib/hamster/list/zip_spec.rb +24 -0
  189. data/spec/lib/hamster/nested/construction_spec.rb +44 -0
  190. data/spec/lib/hamster/set/add_spec.rb +76 -0
  191. data/spec/lib/hamster/set/all_spec.rb +52 -0
  192. data/spec/lib/hamster/set/any_spec.rb +52 -0
  193. data/spec/lib/hamster/set/clear_spec.rb +34 -0
  194. data/spec/{hamster → lib/hamster}/set/compact_spec.rb +9 -20
  195. data/spec/lib/hamster/set/construction_spec.rb +19 -0
  196. data/spec/lib/hamster/set/copying_spec.rb +14 -0
  197. data/spec/lib/hamster/set/count_spec.rb +37 -0
  198. data/spec/lib/hamster/set/delete_spec.rb +72 -0
  199. data/spec/lib/hamster/set/difference_spec.rb +50 -0
  200. data/spec/lib/hamster/set/disjoint_spec.rb +26 -0
  201. data/spec/lib/hamster/set/each_spec.rb +46 -0
  202. data/spec/lib/hamster/set/empty_spec.rb +45 -0
  203. data/spec/lib/hamster/set/eqeq_spec.rb +104 -0
  204. data/spec/lib/hamster/set/eql_spec.rb +110 -0
  205. data/spec/lib/hamster/set/exclusion_spec.rb +48 -0
  206. data/spec/{hamster → lib/hamster}/set/find_spec.rb +10 -27
  207. data/spec/lib/hamster/set/first_spec.rb +29 -0
  208. data/spec/lib/hamster/set/flatten_spec.rb +47 -0
  209. data/spec/lib/hamster/set/grep_spec.rb +58 -0
  210. data/spec/lib/hamster/set/group_by_spec.rb +60 -0
  211. data/spec/lib/hamster/set/hash_spec.rb +23 -0
  212. data/spec/{hamster → lib/hamster}/set/immutable_spec.rb +4 -7
  213. data/spec/lib/hamster/set/include_spec.rb +61 -0
  214. data/spec/lib/hamster/set/inspect_spec.rb +48 -0
  215. data/spec/lib/hamster/set/intersect_spec.rb +26 -0
  216. data/spec/lib/hamster/set/intersection_spec.rb +53 -0
  217. data/spec/lib/hamster/set/join_spec.rb +65 -0
  218. data/spec/lib/hamster/set/map_spec.rb +60 -0
  219. data/spec/lib/hamster/set/marshal_spec.rb +29 -0
  220. data/spec/lib/hamster/set/maximum_spec.rb +37 -0
  221. data/spec/lib/hamster/set/minimum_spec.rb +37 -0
  222. data/spec/lib/hamster/set/new_spec.rb +54 -0
  223. data/spec/{hamster → lib/hamster}/set/none_spec.rb +17 -32
  224. data/spec/{hamster → lib/hamster}/set/one_spec.rb +16 -31
  225. data/spec/lib/hamster/set/partition_spec.rb +53 -0
  226. data/spec/lib/hamster/set/product_spec.rb +24 -0
  227. data/spec/lib/hamster/set/reduce_spec.rb +56 -0
  228. data/spec/lib/hamster/set/reject_spec.rb +51 -0
  229. data/spec/lib/hamster/set/reverse_each_spec.rb +39 -0
  230. data/spec/lib/hamster/set/sample_spec.rb +14 -0
  231. data/spec/lib/hamster/set/select_spec.rb +74 -0
  232. data/spec/{hamster → lib/hamster}/set/size_spec.rb +4 -13
  233. data/spec/lib/hamster/set/sorting_spec.rb +49 -0
  234. data/spec/lib/hamster/set/subset_spec.rb +52 -0
  235. data/spec/lib/hamster/set/sum_spec.rb +24 -0
  236. data/spec/lib/hamster/set/superset_spec.rb +52 -0
  237. data/spec/lib/hamster/set/to_a_spec.rb +31 -0
  238. data/spec/lib/hamster/set/to_list_spec.rb +37 -0
  239. data/spec/lib/hamster/set/to_set_spec.rb +20 -0
  240. data/spec/lib/hamster/set/union_spec.rb +64 -0
  241. data/spec/lib/hamster/sorted_set/above_spec.rb +52 -0
  242. data/spec/lib/hamster/sorted_set/add_spec.rb +63 -0
  243. data/spec/lib/hamster/sorted_set/at_spec.rb +25 -0
  244. data/spec/lib/hamster/sorted_set/below_spec.rb +52 -0
  245. data/spec/lib/hamster/sorted_set/between_spec.rb +52 -0
  246. data/spec/lib/hamster/sorted_set/clear_spec.rb +44 -0
  247. data/spec/lib/hamster/sorted_set/construction_spec.rb +29 -0
  248. data/spec/lib/hamster/sorted_set/delete_at_spec.rb +19 -0
  249. data/spec/lib/hamster/sorted_set/delete_spec.rb +90 -0
  250. data/spec/lib/hamster/sorted_set/difference_spec.rb +23 -0
  251. data/spec/lib/hamster/sorted_set/disjoint_spec.rb +26 -0
  252. data/spec/lib/hamster/sorted_set/drop_spec.rb +56 -0
  253. data/spec/lib/hamster/sorted_set/drop_while_spec.rb +35 -0
  254. data/spec/lib/hamster/sorted_set/each_spec.rb +29 -0
  255. data/spec/lib/hamster/sorted_set/empty_spec.rb +35 -0
  256. data/spec/lib/hamster/sorted_set/eql_spec.rb +121 -0
  257. data/spec/lib/hamster/sorted_set/exclusion_spec.rb +23 -0
  258. data/spec/lib/hamster/sorted_set/fetch_spec.rb +65 -0
  259. data/spec/lib/hamster/sorted_set/find_index_spec.rb +41 -0
  260. data/spec/lib/hamster/sorted_set/first_spec.rb +19 -0
  261. data/spec/lib/hamster/sorted_set/from_spec.rb +52 -0
  262. data/spec/lib/hamster/sorted_set/group_by_spec.rb +58 -0
  263. data/spec/lib/hamster/sorted_set/include_spec.rb +24 -0
  264. data/spec/lib/hamster/sorted_set/inspect_spec.rb +38 -0
  265. data/spec/lib/hamster/sorted_set/intersect_spec.rb +26 -0
  266. data/spec/lib/hamster/sorted_set/intersection_spec.rb +29 -0
  267. data/spec/lib/hamster/sorted_set/last_spec.rb +37 -0
  268. data/spec/lib/hamster/sorted_set/map_spec.rb +36 -0
  269. data/spec/lib/hamster/sorted_set/marshal_spec.rb +37 -0
  270. data/spec/lib/hamster/sorted_set/maximum_spec.rb +37 -0
  271. data/spec/lib/hamster/sorted_set/minimum_spec.rb +20 -0
  272. data/spec/lib/hamster/sorted_set/new_spec.rb +52 -0
  273. data/spec/lib/hamster/sorted_set/reverse_each_spec.rb +29 -0
  274. data/spec/lib/hamster/sorted_set/sample_spec.rb +14 -0
  275. data/spec/lib/hamster/sorted_set/select_spec.rb +62 -0
  276. data/spec/{hamster/vector → lib/hamster/sorted_set}/size_spec.rb +6 -15
  277. data/spec/lib/hamster/sorted_set/slice_spec.rb +257 -0
  278. data/spec/lib/hamster/sorted_set/sorting_spec.rb +45 -0
  279. data/spec/lib/hamster/sorted_set/subset_spec.rb +48 -0
  280. data/spec/lib/hamster/sorted_set/superset_spec.rb +48 -0
  281. data/spec/lib/hamster/sorted_set/take_spec.rb +55 -0
  282. data/spec/lib/hamster/sorted_set/take_while_spec.rb +34 -0
  283. data/spec/lib/hamster/sorted_set/to_set_spec.rb +19 -0
  284. data/spec/lib/hamster/sorted_set/union_spec.rb +28 -0
  285. data/spec/lib/hamster/sorted_set/up_to_spec.rb +52 -0
  286. data/spec/lib/hamster/sorted_set/values_at_spec.rb +34 -0
  287. data/spec/lib/hamster/vector/add_spec.rb +68 -0
  288. data/spec/lib/hamster/vector/any_spec.rb +70 -0
  289. data/spec/lib/hamster/vector/assoc_spec.rb +36 -0
  290. data/spec/lib/hamster/vector/bsearch_spec.rb +58 -0
  291. data/spec/lib/hamster/vector/clear_spec.rb +34 -0
  292. data/spec/lib/hamster/vector/combination_spec.rb +82 -0
  293. data/spec/lib/hamster/vector/compact_spec.rb +30 -0
  294. data/spec/lib/hamster/vector/compare_spec.rb +32 -0
  295. data/spec/lib/hamster/vector/concat_spec.rb +35 -0
  296. data/spec/lib/hamster/vector/copying_spec.rb +21 -0
  297. data/spec/lib/hamster/vector/count_spec.rb +18 -0
  298. data/spec/lib/hamster/vector/delete_at_spec.rb +54 -0
  299. data/spec/lib/hamster/vector/delete_spec.rb +31 -0
  300. data/spec/lib/hamster/vector/drop_spec.rb +42 -0
  301. data/spec/lib/hamster/vector/drop_while_spec.rb +55 -0
  302. data/spec/lib/hamster/vector/each_index_spec.rb +41 -0
  303. data/spec/lib/hamster/vector/each_spec.rb +45 -0
  304. data/spec/lib/hamster/vector/each_with_index_spec.rb +40 -0
  305. data/spec/lib/hamster/vector/empty_spec.rb +42 -0
  306. data/spec/lib/hamster/vector/eql_spec.rb +77 -0
  307. data/spec/lib/hamster/vector/fetch_spec.rb +65 -0
  308. data/spec/lib/hamster/vector/fill_spec.rb +89 -0
  309. data/spec/lib/hamster/vector/first_spec.rb +19 -0
  310. data/spec/lib/hamster/vector/flat_map_spec.rb +51 -0
  311. data/spec/lib/hamster/vector/flatten_spec.rb +44 -0
  312. data/spec/lib/hamster/vector/get_spec.rb +75 -0
  313. data/spec/lib/hamster/vector/group_by_spec.rb +58 -0
  314. data/spec/{hamster → lib/hamster}/vector/include_spec.rb +6 -20
  315. data/spec/lib/hamster/vector/insert_spec.rb +69 -0
  316. data/spec/lib/hamster/vector/inspect_spec.rb +50 -0
  317. data/spec/{hamster/set → lib/hamster/vector}/join_spec.rb +24 -34
  318. data/spec/lib/hamster/vector/last_spec.rb +46 -0
  319. data/spec/lib/hamster/vector/length_spec.rb +46 -0
  320. data/spec/lib/hamster/vector/ltlt_spec.rb +66 -0
  321. data/spec/lib/hamster/vector/map_spec.rb +52 -0
  322. data/spec/lib/hamster/vector/marshal_spec.rb +32 -0
  323. data/spec/lib/hamster/vector/maximum_spec.rb +34 -0
  324. data/spec/lib/hamster/vector/minimum_spec.rb +34 -0
  325. data/spec/lib/hamster/vector/multiply_spec.rb +48 -0
  326. data/spec/lib/hamster/vector/new_spec.rb +51 -0
  327. data/spec/lib/hamster/vector/partition_spec.rb +53 -0
  328. data/spec/lib/hamster/vector/permutation_spec.rb +92 -0
  329. data/spec/lib/hamster/vector/pop_spec.rb +27 -0
  330. data/spec/lib/hamster/vector/product_spec.rb +71 -0
  331. data/spec/{hamster → lib/hamster}/vector/reduce_spec.rb +18 -49
  332. data/spec/lib/hamster/vector/reject_spec.rb +44 -0
  333. data/spec/lib/hamster/vector/repeated_combination_spec.rb +78 -0
  334. data/spec/lib/hamster/vector/repeated_permutation_spec.rb +94 -0
  335. data/spec/lib/hamster/vector/reverse_each_spec.rb +32 -0
  336. data/spec/lib/hamster/vector/reverse_spec.rb +22 -0
  337. data/spec/lib/hamster/vector/rindex_spec.rb +37 -0
  338. data/spec/lib/hamster/vector/rotate_spec.rb +74 -0
  339. data/spec/lib/hamster/vector/sample_spec.rb +14 -0
  340. data/spec/lib/hamster/vector/select_spec.rb +64 -0
  341. data/spec/lib/hamster/vector/set_spec.rb +175 -0
  342. data/spec/lib/hamster/vector/shift_spec.rb +28 -0
  343. data/spec/lib/hamster/vector/shuffle_spec.rb +44 -0
  344. data/spec/lib/hamster/vector/slice_spec.rb +241 -0
  345. data/spec/lib/hamster/vector/sorting_spec.rb +57 -0
  346. data/spec/{hamster/set → lib/hamster/vector}/sum_spec.rb +5 -19
  347. data/spec/lib/hamster/vector/take_spec.rb +43 -0
  348. data/spec/lib/hamster/vector/take_while_spec.rb +35 -0
  349. data/spec/lib/hamster/vector/to_a_spec.rb +42 -0
  350. data/spec/lib/hamster/vector/to_ary_spec.rb +35 -0
  351. data/spec/lib/hamster/vector/to_list_spec.rb +32 -0
  352. data/spec/lib/hamster/vector/to_set_spec.rb +23 -0
  353. data/spec/lib/hamster/vector/transpose_spec.rb +49 -0
  354. data/spec/lib/hamster/vector/uniq_spec.rb +56 -0
  355. data/spec/lib/hamster/vector/unshift_spec.rb +29 -0
  356. data/spec/lib/hamster/vector/update_in_spec.rb +83 -0
  357. data/spec/lib/hamster/vector/values_at_spec.rb +34 -0
  358. data/spec/lib/hamster/vector/zip_spec.rb +58 -0
  359. data/spec/spec_helper.rb +45 -13
  360. metadata +807 -458
  361. data/History.rdoc +0 -419
  362. data/LICENSE +0 -20
  363. data/README.rdoc +0 -236
  364. data/Rakefile +0 -5
  365. data/lib/hamster/core_ext/enumerator.rb +0 -30
  366. data/lib/hamster/experimental/mutable_stack.rb +0 -35
  367. data/lib/hamster/queue.rb +0 -93
  368. data/lib/hamster/sorter.rb +0 -32
  369. data/lib/hamster/stack.rb +0 -82
  370. data/lib/hamster/tuple.rb +0 -45
  371. data/spec/hamster/core_ext/array_spec.rb +0 -20
  372. data/spec/hamster/core_ext/coverage/assets/0.4.4/app.js +0 -66
  373. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/blank.gif +0 -0
  374. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancy_close.png +0 -0
  375. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancy_loading.png +0 -0
  376. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancy_nav_left.png +0 -0
  377. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancy_nav_right.png +0 -0
  378. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancy_shadow_e.png +0 -0
  379. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancy_shadow_n.png +0 -0
  380. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancy_shadow_ne.png +0 -0
  381. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancy_shadow_nw.png +0 -0
  382. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancy_shadow_s.png +0 -0
  383. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancy_shadow_se.png +0 -0
  384. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancy_shadow_sw.png +0 -0
  385. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancy_shadow_w.png +0 -0
  386. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancy_title_left.png +0 -0
  387. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancy_title_main.png +0 -0
  388. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancy_title_over.png +0 -0
  389. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancy_title_right.png +0 -0
  390. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancybox-x.png +0 -0
  391. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancybox-y.png +0 -0
  392. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/fancybox.png +0 -0
  393. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/jquery.fancybox-1.3.1.css +0 -363
  394. data/spec/hamster/core_ext/coverage/assets/0.4.4/fancybox/jquery.fancybox-1.3.1.pack.js +0 -44
  395. data/spec/hamster/core_ext/coverage/assets/0.4.4/favicon.png +0 -0
  396. data/spec/hamster/core_ext/coverage/assets/0.4.4/jquery-1.4.2.min.js +0 -155
  397. data/spec/hamster/core_ext/coverage/assets/0.4.4/jquery.dataTables.min.js +0 -152
  398. data/spec/hamster/core_ext/coverage/assets/0.4.4/jquery.timeago.js +0 -141
  399. data/spec/hamster/core_ext/coverage/assets/0.4.4/jquery.url.js +0 -174
  400. data/spec/hamster/core_ext/coverage/assets/0.4.4/loading.gif +0 -0
  401. data/spec/hamster/core_ext/coverage/assets/0.4.4/magnify.png +0 -0
  402. data/spec/hamster/core_ext/coverage/assets/0.4.4/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  403. data/spec/hamster/core_ext/coverage/assets/0.4.4/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  404. data/spec/hamster/core_ext/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  405. data/spec/hamster/core_ext/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  406. data/spec/hamster/core_ext/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  407. data/spec/hamster/core_ext/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  408. data/spec/hamster/core_ext/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  409. data/spec/hamster/core_ext/coverage/assets/0.4.4/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  410. data/spec/hamster/core_ext/coverage/assets/0.4.4/smoothness/images/ui-icons_222222_256x240.png +0 -0
  411. data/spec/hamster/core_ext/coverage/assets/0.4.4/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  412. data/spec/hamster/core_ext/coverage/assets/0.4.4/smoothness/images/ui-icons_454545_256x240.png +0 -0
  413. data/spec/hamster/core_ext/coverage/assets/0.4.4/smoothness/images/ui-icons_888888_256x240.png +0 -0
  414. data/spec/hamster/core_ext/coverage/assets/0.4.4/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  415. data/spec/hamster/core_ext/coverage/assets/0.4.4/smoothness/jquery-ui-1.8.4.custom.css +0 -295
  416. data/spec/hamster/core_ext/coverage/assets/0.4.4/stylesheet.css +0 -341
  417. data/spec/hamster/core_ext/coverage/covered_percent +0 -1
  418. data/spec/hamster/core_ext/coverage/index.html +0 -71
  419. data/spec/hamster/core_ext/coverage/resultset.yml +0 -10
  420. data/spec/hamster/core_ext/enumerable_spec.rb +0 -34
  421. data/spec/hamster/core_ext/enumerator_spec.rb +0 -25
  422. data/spec/hamster/core_ext/io_spec.rb +0 -29
  423. data/spec/hamster/experimental/mutable_set/add?_spec.rb +0 -47
  424. data/spec/hamster/experimental/mutable_set/add_spec.rb +0 -51
  425. data/spec/hamster/experimental/mutable_set/delete?_spec.rb +0 -47
  426. data/spec/hamster/experimental/mutable_set/delete_spec.rb +0 -47
  427. data/spec/hamster/experimental/mutable_stack/pop_spec.rb +0 -41
  428. data/spec/hamster/experimental/mutable_stack/push_spec.rb +0 -41
  429. data/spec/hamster/hash/all_spec.rb +0 -59
  430. data/spec/hamster/hash/any_spec.rb +0 -68
  431. data/spec/hamster/hash/clear_spec.rb +0 -36
  432. data/spec/hamster/hash/construction_spec.rb +0 -35
  433. data/spec/hamster/hash/copying_spec.rb +0 -23
  434. data/spec/hamster/hash/delete_spec.rb +0 -47
  435. data/spec/hamster/hash/each_spec.rb +0 -41
  436. data/spec/hamster/hash/empty_spec.rb +0 -27
  437. data/spec/hamster/hash/eql_spec.rb +0 -62
  438. data/spec/hamster/hash/except_spec.rb +0 -31
  439. data/spec/hamster/hash/fetch_spec.rb +0 -95
  440. data/spec/hamster/hash/filter_spec.rb +0 -63
  441. data/spec/hamster/hash/find_spec.rb +0 -58
  442. data/spec/hamster/hash/get_spec.rb +0 -68
  443. data/spec/hamster/hash/has_key_spec.rb +0 -35
  444. data/spec/hamster/hash/hash_spec.rb +0 -54
  445. data/spec/hamster/hash/inspect_spec.rb +0 -32
  446. data/spec/hamster/hash/keys_spec.rb +0 -21
  447. data/spec/hamster/hash/map_spec.rb +0 -64
  448. data/spec/hamster/hash/merge_spec.rb +0 -36
  449. data/spec/hamster/hash/none_spec.rb +0 -64
  450. data/spec/hamster/hash/put_spec.rb +0 -65
  451. data/spec/hamster/hash/reduce_spec.rb +0 -60
  452. data/spec/hamster/hash/remove_spec.rb +0 -63
  453. data/spec/hamster/hash/slice_spec.rb +0 -31
  454. data/spec/hamster/hash/uniq_spec.rb +0 -23
  455. data/spec/hamster/hash/values_spec.rb +0 -34
  456. data/spec/hamster/immutable/memoize_spec.rb +0 -64
  457. data/spec/hamster/immutable/new_spec.rb +0 -28
  458. data/spec/hamster/immutable/transform_spec.rb +0 -31
  459. data/spec/hamster/immutable/transform_unless_spec.rb +0 -55
  460. data/spec/hamster/list/all_spec.rb +0 -111
  461. data/spec/hamster/list/any_spec.rb +0 -79
  462. data/spec/hamster/list/append_spec.rb +0 -50
  463. data/spec/hamster/list/at_spec.rb +0 -49
  464. data/spec/hamster/list/break_spec.rb +0 -85
  465. data/spec/hamster/list/cadr_spec.rb +0 -50
  466. data/spec/hamster/list/chunk_spec.rb +0 -40
  467. data/spec/hamster/list/clear_spec.rb +0 -36
  468. data/spec/hamster/list/combinations_spec.rb +0 -51
  469. data/spec/hamster/list/compact_spec.rb +0 -46
  470. data/spec/hamster/list/cons_spec.rb +0 -41
  471. data/spec/hamster/list/construction_spec.rb +0 -140
  472. data/spec/hamster/list/copying_spec.rb +0 -32
  473. data/spec/hamster/list/count_spec.rb +0 -66
  474. data/spec/hamster/list/coverage/assets/0.4.4/app.js +0 -66
  475. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/blank.gif +0 -0
  476. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancy_close.png +0 -0
  477. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancy_loading.png +0 -0
  478. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancy_nav_left.png +0 -0
  479. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancy_nav_right.png +0 -0
  480. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancy_shadow_e.png +0 -0
  481. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancy_shadow_n.png +0 -0
  482. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancy_shadow_ne.png +0 -0
  483. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancy_shadow_nw.png +0 -0
  484. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancy_shadow_s.png +0 -0
  485. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancy_shadow_se.png +0 -0
  486. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancy_shadow_sw.png +0 -0
  487. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancy_shadow_w.png +0 -0
  488. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancy_title_left.png +0 -0
  489. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancy_title_main.png +0 -0
  490. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancy_title_over.png +0 -0
  491. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancy_title_right.png +0 -0
  492. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancybox-x.png +0 -0
  493. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancybox-y.png +0 -0
  494. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/fancybox.png +0 -0
  495. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/jquery.fancybox-1.3.1.css +0 -363
  496. data/spec/hamster/list/coverage/assets/0.4.4/fancybox/jquery.fancybox-1.3.1.pack.js +0 -44
  497. data/spec/hamster/list/coverage/assets/0.4.4/favicon.png +0 -0
  498. data/spec/hamster/list/coverage/assets/0.4.4/jquery-1.4.2.min.js +0 -155
  499. data/spec/hamster/list/coverage/assets/0.4.4/jquery.dataTables.min.js +0 -152
  500. data/spec/hamster/list/coverage/assets/0.4.4/jquery.timeago.js +0 -141
  501. data/spec/hamster/list/coverage/assets/0.4.4/jquery.url.js +0 -174
  502. data/spec/hamster/list/coverage/assets/0.4.4/loading.gif +0 -0
  503. data/spec/hamster/list/coverage/assets/0.4.4/magnify.png +0 -0
  504. data/spec/hamster/list/coverage/assets/0.4.4/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  505. data/spec/hamster/list/coverage/assets/0.4.4/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  506. data/spec/hamster/list/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  507. data/spec/hamster/list/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  508. data/spec/hamster/list/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  509. data/spec/hamster/list/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  510. data/spec/hamster/list/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  511. data/spec/hamster/list/coverage/assets/0.4.4/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  512. data/spec/hamster/list/coverage/assets/0.4.4/smoothness/images/ui-icons_222222_256x240.png +0 -0
  513. data/spec/hamster/list/coverage/assets/0.4.4/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  514. data/spec/hamster/list/coverage/assets/0.4.4/smoothness/images/ui-icons_454545_256x240.png +0 -0
  515. data/spec/hamster/list/coverage/assets/0.4.4/smoothness/images/ui-icons_888888_256x240.png +0 -0
  516. data/spec/hamster/list/coverage/assets/0.4.4/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  517. data/spec/hamster/list/coverage/assets/0.4.4/smoothness/jquery-ui-1.8.4.custom.css +0 -295
  518. data/spec/hamster/list/coverage/assets/0.4.4/stylesheet.css +0 -341
  519. data/spec/hamster/list/coverage/covered_percent +0 -1
  520. data/spec/hamster/list/coverage/index.html +0 -71
  521. data/spec/hamster/list/coverage/resultset.yml +0 -225
  522. data/spec/hamster/list/cycle_spec.rb +0 -45
  523. data/spec/hamster/list/drop_spec.rb +0 -42
  524. data/spec/hamster/list/drop_while_spec.rb +0 -59
  525. data/spec/hamster/list/each_slice_spec.rb +0 -80
  526. data/spec/hamster/list/each_spec.rb +0 -72
  527. data/spec/hamster/list/each_with_index_spec.rb +0 -42
  528. data/spec/hamster/list/elem_index_spec.rb +0 -58
  529. data/spec/hamster/list/elem_indices_spec.rb +0 -45
  530. data/spec/hamster/list/empty_spec.rb +0 -47
  531. data/spec/hamster/list/eql_spec.rb +0 -78
  532. data/spec/hamster/list/filter_spec.rb +0 -61
  533. data/spec/hamster/list/find_indices_spec.rb +0 -45
  534. data/spec/hamster/list/flatten_spec.rb +0 -42
  535. data/spec/hamster/list/grep_spec.rb +0 -70
  536. data/spec/hamster/list/group_by_spec.rb +0 -77
  537. data/spec/hamster/list/hash_spec.rb +0 -43
  538. data/spec/hamster/list/init_spec.rb +0 -40
  539. data/spec/hamster/list/inits_spec.rb +0 -42
  540. data/spec/hamster/list/inspect_spec.rb +0 -43
  541. data/spec/hamster/list/intersperse_spec.rb +0 -40
  542. data/spec/hamster/list/join_spec.rb +0 -81
  543. data/spec/hamster/list/last_spec.rb +0 -44
  544. data/spec/hamster/list/map_spec.rb +0 -69
  545. data/spec/hamster/list/maximum_spec.rb +0 -77
  546. data/spec/hamster/list/minimum_spec.rb +0 -77
  547. data/spec/hamster/list/partition_spec.rb +0 -75
  548. data/spec/hamster/list/product_spec.rb +0 -44
  549. data/spec/hamster/list/reduce_spec.rb +0 -99
  550. data/spec/hamster/list/remove_spec.rb +0 -67
  551. data/spec/hamster/list/reverse_spec.rb +0 -52
  552. data/spec/hamster/list/size_spec.rb +0 -47
  553. data/spec/hamster/list/slice_spec.rb +0 -50
  554. data/spec/hamster/list/sorting_spec.rb +0 -70
  555. data/spec/hamster/list/span_spec.rb +0 -86
  556. data/spec/hamster/list/split_at_spec.rb +0 -53
  557. data/spec/hamster/list/sum_spec.rb +0 -44
  558. data/spec/hamster/list/tail_spec.rb +0 -48
  559. data/spec/hamster/list/tails_spec.rb +0 -42
  560. data/spec/hamster/list/take_spec.rb +0 -42
  561. data/spec/hamster/list/take_while_spec.rb +0 -62
  562. data/spec/hamster/list/to_a_spec.rb +0 -54
  563. data/spec/hamster/list/to_ary_spec.rb +0 -56
  564. data/spec/hamster/list/to_list_spec.rb +0 -32
  565. data/spec/hamster/list/to_set_spec.rb +0 -33
  566. data/spec/hamster/list/union_spec.rb +0 -49
  567. data/spec/hamster/list/uniq_spec.rb +0 -45
  568. data/spec/hamster/list/zip_spec.rb +0 -39
  569. data/spec/hamster/queue/clear_spec.rb +0 -36
  570. data/spec/hamster/queue/construction_spec.rb +0 -43
  571. data/spec/hamster/queue/dequeue_spec.rb +0 -40
  572. data/spec/hamster/queue/empty_spec.rb +0 -47
  573. data/spec/hamster/queue/enqueue_spec.rb +0 -41
  574. data/spec/hamster/queue/head_spec.rb +0 -35
  575. data/spec/hamster/queue/inspect_spec.rb +0 -31
  576. data/spec/hamster/queue/size_spec.rb +0 -35
  577. data/spec/hamster/queue/to_a_spec.rb +0 -42
  578. data/spec/hamster/queue/to_ary_spec.rb +0 -44
  579. data/spec/hamster/queue/to_list_spec.rb +0 -44
  580. data/spec/hamster/set/add_spec.rb +0 -51
  581. data/spec/hamster/set/all_spec.rb +0 -67
  582. data/spec/hamster/set/any_spec.rb +0 -67
  583. data/spec/hamster/set/clear_spec.rb +0 -36
  584. data/spec/hamster/set/construction_spec.rb +0 -31
  585. data/spec/hamster/set/copying_spec.rb +0 -23
  586. data/spec/hamster/set/count_spec.rb +0 -54
  587. data/spec/hamster/set/coverage/assets/0.4.4/app.js +0 -66
  588. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/blank.gif +0 -0
  589. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancy_close.png +0 -0
  590. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancy_loading.png +0 -0
  591. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancy_nav_left.png +0 -0
  592. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancy_nav_right.png +0 -0
  593. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancy_shadow_e.png +0 -0
  594. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancy_shadow_n.png +0 -0
  595. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancy_shadow_ne.png +0 -0
  596. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancy_shadow_nw.png +0 -0
  597. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancy_shadow_s.png +0 -0
  598. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancy_shadow_se.png +0 -0
  599. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancy_shadow_sw.png +0 -0
  600. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancy_shadow_w.png +0 -0
  601. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancy_title_left.png +0 -0
  602. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancy_title_main.png +0 -0
  603. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancy_title_over.png +0 -0
  604. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancy_title_right.png +0 -0
  605. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancybox-x.png +0 -0
  606. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancybox-y.png +0 -0
  607. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/fancybox.png +0 -0
  608. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/jquery.fancybox-1.3.1.css +0 -363
  609. data/spec/hamster/set/coverage/assets/0.4.4/fancybox/jquery.fancybox-1.3.1.pack.js +0 -44
  610. data/spec/hamster/set/coverage/assets/0.4.4/favicon.png +0 -0
  611. data/spec/hamster/set/coverage/assets/0.4.4/jquery-1.4.2.min.js +0 -155
  612. data/spec/hamster/set/coverage/assets/0.4.4/jquery.dataTables.min.js +0 -152
  613. data/spec/hamster/set/coverage/assets/0.4.4/jquery.timeago.js +0 -141
  614. data/spec/hamster/set/coverage/assets/0.4.4/jquery.url.js +0 -174
  615. data/spec/hamster/set/coverage/assets/0.4.4/loading.gif +0 -0
  616. data/spec/hamster/set/coverage/assets/0.4.4/magnify.png +0 -0
  617. data/spec/hamster/set/coverage/assets/0.4.4/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  618. data/spec/hamster/set/coverage/assets/0.4.4/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  619. data/spec/hamster/set/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  620. data/spec/hamster/set/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  621. data/spec/hamster/set/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  622. data/spec/hamster/set/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  623. data/spec/hamster/set/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  624. data/spec/hamster/set/coverage/assets/0.4.4/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  625. data/spec/hamster/set/coverage/assets/0.4.4/smoothness/images/ui-icons_222222_256x240.png +0 -0
  626. data/spec/hamster/set/coverage/assets/0.4.4/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  627. data/spec/hamster/set/coverage/assets/0.4.4/smoothness/images/ui-icons_454545_256x240.png +0 -0
  628. data/spec/hamster/set/coverage/assets/0.4.4/smoothness/images/ui-icons_888888_256x240.png +0 -0
  629. data/spec/hamster/set/coverage/assets/0.4.4/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  630. data/spec/hamster/set/coverage/assets/0.4.4/smoothness/jquery-ui-1.8.4.custom.css +0 -295
  631. data/spec/hamster/set/coverage/assets/0.4.4/stylesheet.css +0 -341
  632. data/spec/hamster/set/coverage/covered_percent +0 -1
  633. data/spec/hamster/set/coverage/index.html +0 -71
  634. data/spec/hamster/set/coverage/resultset.yml +0 -13
  635. data/spec/hamster/set/delete_spec.rb +0 -47
  636. data/spec/hamster/set/difference_spec.rb +0 -37
  637. data/spec/hamster/set/each_spec.rb +0 -42
  638. data/spec/hamster/set/empty_spec.rb +0 -35
  639. data/spec/hamster/set/eql_spec.rb +0 -62
  640. data/spec/hamster/set/exclusion_spec.rb +0 -38
  641. data/spec/hamster/set/filter_spec.rb +0 -79
  642. data/spec/hamster/set/flatten_spec.rb +0 -49
  643. data/spec/hamster/set/grep_spec.rb +0 -62
  644. data/spec/hamster/set/group_by_spec.rb +0 -65
  645. data/spec/hamster/set/hash_spec.rb +0 -31
  646. data/spec/hamster/set/head_spec.rb +0 -39
  647. data/spec/hamster/set/include_spec.rb +0 -35
  648. data/spec/hamster/set/inspect_spec.rb +0 -32
  649. data/spec/hamster/set/intersection_spec.rb +0 -46
  650. data/spec/hamster/set/map_spec.rb +0 -64
  651. data/spec/hamster/set/maximum_spec.rb +0 -65
  652. data/spec/hamster/set/minimum_spec.rb +0 -65
  653. data/spec/hamster/set/partition_spec.rb +0 -71
  654. data/spec/hamster/set/product_spec.rb +0 -32
  655. data/spec/hamster/set/reduce_spec.rb +0 -87
  656. data/spec/hamster/set/remove_spec.rb +0 -63
  657. data/spec/hamster/set/sorting_spec.rb +0 -58
  658. data/spec/hamster/set/subset_spec.rb +0 -39
  659. data/spec/hamster/set/superset_spec.rb +0 -39
  660. data/spec/hamster/set/to_a_spec.rb +0 -42
  661. data/spec/hamster/set/to_list_spec.rb +0 -47
  662. data/spec/hamster/set/to_set_spec.rb +0 -32
  663. data/spec/hamster/set/union_spec.rb +0 -45
  664. data/spec/hamster/set/uniq_spec.rb +0 -23
  665. data/spec/hamster/sorter/coverage/assets/0.4.4/app.js +0 -66
  666. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/blank.gif +0 -0
  667. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancy_close.png +0 -0
  668. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancy_loading.png +0 -0
  669. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancy_nav_left.png +0 -0
  670. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancy_nav_right.png +0 -0
  671. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancy_shadow_e.png +0 -0
  672. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancy_shadow_n.png +0 -0
  673. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancy_shadow_ne.png +0 -0
  674. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancy_shadow_nw.png +0 -0
  675. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancy_shadow_s.png +0 -0
  676. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancy_shadow_se.png +0 -0
  677. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancy_shadow_sw.png +0 -0
  678. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancy_shadow_w.png +0 -0
  679. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancy_title_left.png +0 -0
  680. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancy_title_main.png +0 -0
  681. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancy_title_over.png +0 -0
  682. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancy_title_right.png +0 -0
  683. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancybox-x.png +0 -0
  684. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancybox-y.png +0 -0
  685. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/fancybox.png +0 -0
  686. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/jquery.fancybox-1.3.1.css +0 -363
  687. data/spec/hamster/sorter/coverage/assets/0.4.4/fancybox/jquery.fancybox-1.3.1.pack.js +0 -44
  688. data/spec/hamster/sorter/coverage/assets/0.4.4/favicon.png +0 -0
  689. data/spec/hamster/sorter/coverage/assets/0.4.4/jquery-1.4.2.min.js +0 -155
  690. data/spec/hamster/sorter/coverage/assets/0.4.4/jquery.dataTables.min.js +0 -152
  691. data/spec/hamster/sorter/coverage/assets/0.4.4/jquery.timeago.js +0 -141
  692. data/spec/hamster/sorter/coverage/assets/0.4.4/jquery.url.js +0 -174
  693. data/spec/hamster/sorter/coverage/assets/0.4.4/loading.gif +0 -0
  694. data/spec/hamster/sorter/coverage/assets/0.4.4/magnify.png +0 -0
  695. data/spec/hamster/sorter/coverage/assets/0.4.4/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  696. data/spec/hamster/sorter/coverage/assets/0.4.4/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  697. data/spec/hamster/sorter/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  698. data/spec/hamster/sorter/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  699. data/spec/hamster/sorter/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  700. data/spec/hamster/sorter/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  701. data/spec/hamster/sorter/coverage/assets/0.4.4/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  702. data/spec/hamster/sorter/coverage/assets/0.4.4/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  703. data/spec/hamster/sorter/coverage/assets/0.4.4/smoothness/images/ui-icons_222222_256x240.png +0 -0
  704. data/spec/hamster/sorter/coverage/assets/0.4.4/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  705. data/spec/hamster/sorter/coverage/assets/0.4.4/smoothness/images/ui-icons_454545_256x240.png +0 -0
  706. data/spec/hamster/sorter/coverage/assets/0.4.4/smoothness/images/ui-icons_888888_256x240.png +0 -0
  707. data/spec/hamster/sorter/coverage/assets/0.4.4/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  708. data/spec/hamster/sorter/coverage/assets/0.4.4/smoothness/jquery-ui-1.8.4.custom.css +0 -295
  709. data/spec/hamster/sorter/coverage/assets/0.4.4/stylesheet.css +0 -341
  710. data/spec/hamster/sorter/coverage/covered_percent +0 -1
  711. data/spec/hamster/sorter/coverage/index.html +0 -71
  712. data/spec/hamster/sorter/coverage/resultset.yml +0 -22
  713. data/spec/hamster/sorter/immutable_spec.rb +0 -12
  714. data/spec/hamster/stack/clear_spec.rb +0 -36
  715. data/spec/hamster/stack/construction_spec.rb +0 -43
  716. data/spec/hamster/stack/copying_spec.rb +0 -31
  717. data/spec/hamster/stack/empty_spec.rb +0 -31
  718. data/spec/hamster/stack/eql_spec.rb +0 -60
  719. data/spec/hamster/stack/immutable_spec.rb +0 -12
  720. data/spec/hamster/stack/inspect_spec.rb +0 -31
  721. data/spec/hamster/stack/peek_spec.rb +0 -40
  722. data/spec/hamster/stack/pop_spec.rb +0 -41
  723. data/spec/hamster/stack/push_spec.rb +0 -41
  724. data/spec/hamster/stack/size_spec.rb +0 -35
  725. data/spec/hamster/stack/to_a_spec.rb +0 -42
  726. data/spec/hamster/stack/to_ary.rb +0 -44
  727. data/spec/hamster/stack/to_list_spec.rb +0 -33
  728. data/spec/hamster/trie/remove_spec.rb +0 -117
  729. data/spec/hamster/tuple/copying_spec.rb +0 -24
  730. data/spec/hamster/tuple/eql_spec.rb +0 -61
  731. data/spec/hamster/tuple/first_spec.rb +0 -19
  732. data/spec/hamster/tuple/immutable_spec.rb +0 -12
  733. data/spec/hamster/tuple/inspect_spec.rb +0 -19
  734. data/spec/hamster/tuple/last_spec.rb +0 -19
  735. data/spec/hamster/tuple/to_a_spec.rb +0 -38
  736. data/spec/hamster/tuple/to_ary_spec.rb +0 -44
  737. data/spec/hamster/undefined/erase_spec.rb +0 -47
  738. data/spec/hamster/vector/add_spec.rb +0 -41
  739. data/spec/hamster/vector/any_spec.rb +0 -67
  740. data/spec/hamster/vector/clear_spec.rb +0 -36
  741. data/spec/hamster/vector/copying_spec.rb +0 -32
  742. data/spec/hamster/vector/each_spec.rb +0 -46
  743. data/spec/hamster/vector/each_with_index_spec.rb +0 -42
  744. data/spec/hamster/vector/empty_spec.rb +0 -35
  745. data/spec/hamster/vector/eql_spec.rb +0 -65
  746. data/spec/hamster/vector/filter_spec.rb +0 -63
  747. data/spec/hamster/vector/first_spec.rb +0 -35
  748. data/spec/hamster/vector/get_spec.rb +0 -81
  749. data/spec/hamster/vector/inspect_spec.rb +0 -31
  750. data/spec/hamster/vector/last_spec.rb +0 -32
  751. data/spec/hamster/vector/map_spec.rb +0 -64
  752. data/spec/hamster/vector/set_spec.rb +0 -153
  753. data/spec/hamster/vector/to_a_spec.rb +0 -42
  754. data/spec/hamster/vector/to_ary_spec.rb +0 -44
  755. data/tasks/bundler.rb +0 -2
  756. data/tasks/publish.rb +0 -12
  757. data/tasks/spec.rb +0 -13
@@ -1,34 +1,31 @@
1
- require 'hamster/hash'
2
- require 'hamster/experimental/read_copy_update'
1
+ require "hamster/hash"
2
+ require "hamster/read_copy_update"
3
3
 
4
4
  module Hamster
5
-
6
5
  def self.mutable_hash(pairs = {}, &block)
7
6
  MutableHash.new(hash(pairs, &block))
8
7
  end
9
8
 
10
9
  class MutableHash
11
-
12
10
  include ReadCopyUpdate
13
11
 
14
12
  def put(key, value = Undefined, &block)
15
- old_value = nil
16
- transform { |hash|
17
- old_value = hash.get(key)
18
- hash.put(key, value, &block)
19
- }
20
- old_value
13
+ transform { |hash| hash.put(key, value, &block) }
21
14
  end
22
15
 
16
+ def store(key, value)
17
+ put(key, value)
18
+ value
19
+ end
20
+ alias :[]= :store
21
+
23
22
  def delete(key)
24
23
  old_value = nil
25
- transform { |hash|
24
+ transform do |hash|
26
25
  old_value = hash.get(key)
27
26
  hash.delete(key)
28
- }
27
+ end
29
28
  old_value
30
29
  end
31
-
32
30
  end
33
-
34
31
  end
@@ -0,0 +1,36 @@
1
+ require "set"
2
+ require "hamster/hash"
3
+ require "hamster/set"
4
+ require "hamster/vector"
5
+
6
+ module Hamster
7
+ class << self
8
+
9
+ # Create a Hamster immutable data structure with nested Hamster data
10
+ # structure from a nested Ruby object `obj`. This method recursively
11
+ # "walks" the Ruby object, converting Ruby `Hash` to `Hamster::Hash`, Ruby
12
+ # `Array` to `Hamster::Vector` and Ruby `Set` to `Hamster::Set`. Other
13
+ # Ruby objects are left as-is.
14
+ #
15
+ # @example
16
+ # h = Hamster.from({ "a" => [1, 2], "b" => "c" })
17
+ # # => Hamster::Hash["a" => Hamster::Vector[1, 2], "b" => "c"]
18
+ #
19
+ # @return [Hamster::Hash, Hamster::Vector, Hamster::Set, Object]
20
+ def from(obj)
21
+ case obj
22
+ when ::Hash
23
+ res = obj.map { |key, value| [from(key), from(value)] }
24
+ Hamster::Hash.new(res)
25
+ when ::Array
26
+ res = obj.map { |element| from(element) }
27
+ Hamster::Vector.new(res)
28
+ when ::Set
29
+ res = obj.map { |element| from(element) }
30
+ Hamster::Set.new(res)
31
+ else
32
+ obj
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,10 +1,9 @@
1
- require 'forwardable'
2
- require 'thread'
1
+ require "forwardable"
2
+ require "thread"
3
3
 
4
4
  module Hamster
5
-
5
+ # @private
6
6
  module ReadCopyUpdate
7
-
8
7
  extend Forwardable
9
8
 
10
9
  def initialize(content)
@@ -15,12 +14,17 @@ module Hamster
15
14
  def eql?(other)
16
15
  instance_of?(other.class) && @content.eql?(other.instance_variable_get(:@content))
17
16
  end
18
- def_delegator :self, :eql?, :==
17
+ alias :== :eql?
18
+
19
+ def_delegator :@content, :inspect
20
+ def_delegator :@content, :to_s
19
21
 
20
22
  protected
21
23
 
22
24
  def transform
23
- @lock.synchronize { @content = yield(@content) }
25
+ @lock.synchronize do
26
+ @content = yield(@content)
27
+ end
24
28
  self
25
29
  end
26
30
 
@@ -29,7 +33,5 @@ module Hamster
29
33
  def method_missing(name, *args, &block)
30
34
  @content.send(name, *args, &block) rescue super
31
35
  end
32
-
33
36
  end
34
-
35
37
  end
@@ -1,174 +1,572 @@
1
- require 'forwardable'
2
-
3
- require 'hamster/immutable'
4
- require 'hamster/undefined'
5
- require 'hamster/enumerable'
6
- require 'hamster/sorter'
7
- require 'hamster/trie'
8
- require 'hamster/list'
1
+ require "hamster/immutable"
2
+ require "hamster/undefined"
3
+ require "hamster/enumerable"
4
+ require "hamster/hash"
5
+ require "hamster/trie"
6
+ require "hamster/sorted_set"
7
+ require "set"
9
8
 
10
9
  module Hamster
11
-
12
10
  def self.set(*items)
13
- items.reduce(EmptySet) { |set, item| set.add(item) }
11
+ items.empty? ? EmptySet : Set.new(items)
14
12
  end
15
13
 
14
+ # `Hamster::Set` is a collection of unordered values with no duplicates. Testing whether
15
+ # an object is present in the `Set` is fast. `Set` is also `Enumerable`, so you can
16
+ # iterate over the members of the set with {#each}, transform them with {#map}, filter
17
+ # them with {#select}, and so on. Some of the `Enumerable` methods are overridden to
18
+ # return Hamster collections.
19
+ #
20
+ # Like the `Set` class in Ruby's standard library, which we will call RubySet,
21
+ # `Hamster::Set` defines equivalency of objects using `#hash` and `#eql?`. No two
22
+ # objects with the same `#hash` code, and which are also `#eql?`, can coexist in the
23
+ # same `Set`. If one is already in the `Set`, attempts to add another one will have
24
+ # no effect.
25
+ #
26
+ # `Set`s have no natural ordering and cannot be compared using `#<=>`. However, they
27
+ # define {#<}, {#>}, {#<=}, and {#>=} as shorthand for {#proper_subset?},
28
+ # {#proper_superset?}, {#subset?}, and {#superset?} (respectively).
29
+ #
30
+ # The basic set-theoretic operations {#union}, {#intersection}, {#difference}, and
31
+ # {#exclusion} work with any `Enumerable` object. They may be more efficient when used
32
+ # with another `Hamster::Set`, or a RubySet.
33
+ #
34
+ # A `Set` can be created in any of the following ways:
35
+ #
36
+ # Hamster.set('Tom', 'Dick', 'Harry')
37
+ # Hamster::Set.new([1, 2, 3]) # any Enumerable can be used to initialize
38
+ # Hamster::Set['A', 'B', 'C', 'D']
39
+ #
40
+ # The latter 2 forms of initialization can be used with your own, custom subclasses
41
+ # of `Hamster::Set`.
42
+ #
43
+ # Unlike RubySet, all methods which you might expect to "modify" a `Hamster::Set`
44
+ # actually return a new set and leave the existing one unchanged.
45
+ #
46
+ # @example
47
+ # require 'hamster/set'
48
+ # set1 = Hamster.set(1, 2) # => Hamster::Set[1, 2]
49
+ # set2 = Hamster::Set[1, 2] # => Hamster::Set[1, 2]
50
+ # set1 == set2 # => true
51
+ # set3 = set1.add("foo") # => Hamster::Set[1, 2, "foo"]
52
+ # set3 - set2 # => Hamster::Set["foo"]
53
+ # set3.subset?(set1) # => false
54
+ # set1.subset?(set3) # => true
55
+ #
16
56
  class Set
57
+ include Immutable
58
+ include Enumerable
17
59
 
18
- extend Forwardable
60
+ class << self
61
+ # Create a new `Set` populated with the given items.
62
+ # @return [Set]
63
+ def [](*items)
64
+ new(items)
65
+ end
19
66
 
20
- include Immutable
67
+ # Return an empty `Set`. If used on a subclass, returns an empty instance
68
+ # of that class.
69
+ #
70
+ # @return [Set]
71
+ def empty
72
+ @empty ||= self.new
73
+ end
21
74
 
22
- include Enumerable
75
+ # "Raw" allocation of a new `Set`. Used internally to create a new
76
+ # instance quickly after obtaining a modified {Trie}.
77
+ #
78
+ # @return [Set]
79
+ # @private
80
+ def alloc(trie = EmptyTrie)
81
+ allocate.tap { |s| s.instance_variable_set(:@trie, trie) }
82
+ end
83
+ end
23
84
 
24
- def initialize(trie = EmptyTrie)
25
- @trie = trie
85
+ def initialize(items=[])
86
+ @trie = Trie.new(0)
87
+ items.each { |item| @trie.put!(item, nil) }
26
88
  end
27
89
 
90
+ # Return `true` if this `Set` contains no items.
91
+ # @return [Boolean]
28
92
  def empty?
29
93
  @trie.empty?
30
94
  end
31
- def_delegator :self, :empty?, :null?
32
95
 
96
+ # Return the number of items in this `Set`.
97
+ # @return [Integer]
33
98
  def size
34
99
  @trie.size
35
100
  end
36
- def_delegator :self, :size, :length
37
-
101
+ alias :length :size
102
+
103
+ # Return a new `Set` with `item` added. If `item` is already in the set,
104
+ # return `self`.
105
+ #
106
+ # @example
107
+ # Hamster::Set[1, 2, 3].add(4) # => Hamster::Set[1, 2, 4, 3]
108
+ # Hamster::Set[1, 2, 3].add(2) # => Hamster::Set[1, 2, 3]
109
+ #
110
+ # @param item [Object] The object to add
111
+ # @return [Set]
38
112
  def add(item)
39
- transform_unless(include?(item)) { @trie = @trie.put(item, nil) }
113
+ include?(item) ? self : self.class.alloc(@trie.put(item, nil))
114
+ end
115
+ alias :<< :add
116
+
117
+ # If `item` is not a member of this `Set`, return a new `Set` with `item` added.
118
+ # Otherwise, return `false`.
119
+ #
120
+ # @example
121
+ # Hamster::Set[1, 2, 3].add?(4) # => Hamster::Set[1, 2, 4, 3]
122
+ # Hamster::Set[1, 2, 3].add?(2) # => false
123
+ #
124
+ # @param item [Object] The object to add
125
+ # @return [Set, false]
126
+ def add?(item)
127
+ !include?(item) && add(item)
40
128
  end
41
- def_delegator :self, :add, :<<
42
129
 
130
+ # Return a new `Set` with `item` removed. If `item` is not a member of the set,
131
+ # return `self`.
132
+ #
133
+ # @example
134
+ # Hamster::Set[1, 2, 3].delete(1) # => Hamster::Set[2, 3]
135
+ # Hamster::Set[1, 2, 3].delete(99) # => Hamster::Set[1, 2, 3]
136
+ #
137
+ # @param item [Object] The object to remove
138
+ # @return [Set]
43
139
  def delete(item)
44
140
  trie = @trie.delete(item)
45
- transform_unless(trie.equal?(@trie)) { @trie = trie }
141
+ new_trie(trie)
46
142
  end
47
143
 
48
- def each
49
- return self unless block_given?
50
- @trie.each { |entry| yield(entry.key) }
144
+ # If `item` is a member of this `Set`, return a new `Set` with `item` removed.
145
+ # Otherwise, return `false`.
146
+ #
147
+ # @example
148
+ # Hamster::Set[1, 2, 3].delete?(1) # => Hamster::Set[2, 3]
149
+ # Hamster::Set[1, 2, 3].delete?(99) # => false
150
+ #
151
+ # @param item [Object] The object to remove
152
+ # @return [Set, false]
153
+ def delete?(item)
154
+ include?(item) && delete(item)
51
155
  end
52
156
 
53
- def map
54
- return self unless block_given?
55
- return self if empty?
56
- transform { @trie = @trie.reduce(EmptyTrie) { |trie, entry| trie.put(yield(entry.key), nil) } }
157
+ # Call the block once for each item in this `Set`. No specific iteration order
158
+ # is guaranteed (but the order will be stable for any particular `Set`.)
159
+ #
160
+ # @example
161
+ # Hamster::Set["Dog", "Elephant", "Lion"].each { |e| puts e }
162
+ # Elephant
163
+ # Dog
164
+ # Lion
165
+ # # => Hamster::Set["Dog", "Elephant", "Lion"]
166
+ #
167
+ # @return [self]
168
+ def each
169
+ return to_enum if not block_given?
170
+ @trie.each { |key, _| yield(key) }
171
+ self
57
172
  end
58
- def_delegator :self, :map, :collect
59
173
 
60
- def filter
61
- return self unless block_given?
62
- trie = @trie.filter { |entry| yield(entry.key) }
63
- return EmptySet if trie.empty?
64
- transform_unless(trie.equal?(@trie)) { @trie = trie }
174
+ # Call the block once for each item in this `Set`. Iteration order will be
175
+ # the opposite of {#each}.
176
+ #
177
+ # @example
178
+ # Hamster::Set["Dog", "Elephant", "Lion"].reverse_each { |e| puts e }
179
+ # Lion
180
+ # Dog
181
+ # Elephant
182
+ # # => Hamster::Set["Dog", "Elephant", "Lion"]
183
+ #
184
+ # @return [self]
185
+ def reverse_each
186
+ return enum_for(:reverse_each) if not block_given?
187
+ @trie.reverse_each { |key, _| yield(key) }
188
+ self
65
189
  end
66
190
 
191
+ # Return a new `Set` with all the items for which the block returns true.
192
+ #
193
+ # @example
194
+ # Hamster::Set["Elephant", "Dog", "Lion"].select { |e| e.size >= 4 }
195
+ # # => Hamster::Set["Elephant", "Lion"]
196
+ #
197
+ # @return [Set]
198
+ def select
199
+ return enum_for(:select) unless block_given?
200
+ trie = @trie.select { |key, _| yield(key) }
201
+ new_trie(trie)
202
+ end
203
+ alias :find_all :select
204
+ alias :keep_if :select
205
+
206
+ # Call the block once for each item in this `Set`.
207
+ # All the values returned from the block will be gathered into a new `Set`.
208
+ #
209
+ # @example
210
+ # Hamster::Set["Cat", "Elephant", "Dog", "Lion"].map { |e| e.size }
211
+ # # => Hamster::Set[8, 4, 3]
212
+ #
213
+ # @return [Set]
214
+ def map
215
+ return enum_for(:map) if not block_given?
216
+ return self if empty?
217
+ self.class.new(super)
218
+ end
219
+ alias :collect :map
220
+
221
+ # Return `true` if the given item is present in this `Set`. More precisely,
222
+ # return `true` if an object with the same `#hash` code, and which is also `#eql?`
223
+ # to the given object is present.
224
+ #
225
+ # @example
226
+ # Hamster::Set["A", "B", "C"].include?("B") # => true
227
+ # Hamster::Set["A", "B", "C"].include?("Z") # => false
228
+ #
229
+ # @param object [Object] The object to check for
230
+ # @return [Boolean]
67
231
  def include?(object)
68
- any? { |item| item.eql?(object) }
232
+ @trie.key?(object)
69
233
  end
70
-
71
- def head
72
- find { true }
234
+ alias :member? :include?
235
+
236
+ # Return a member of this `Set`. The member chosen will be the first one which
237
+ # would be yielded by {#each}. If the set is empty, return `nil`.
238
+ #
239
+ # @example
240
+ # Hamster::Set["A", "B", "C"].first # => "C"
241
+ #
242
+ # @return [Object]
243
+ def first
244
+ (entry = @trie.at(0)) && entry[0]
73
245
  end
74
- def_delegator :self, :head, :first
75
246
 
247
+ # Return a {SortedSet} which contains the same items as this `Set`, ordered by
248
+ # the given comparator block. The comparator block should take 2 parameters and
249
+ # return 0, 1, or -1 depending on whether the first parameter is equal, greater than,
250
+ # or less than the second.
251
+ #
252
+ # @example
253
+ # Hamster::Set["Elephant", "Dog", "Lion"].sort
254
+ # # => Hamster::SortedSet["Dog", "Elephant", "Lion"]
255
+ # Hamster::Set["Elephant", "Dog", "Lion"].sort { |a,b| a.size <=> b.size }
256
+ # # => Hamster::SortedSet["Dog", "Lion", "Elephant"]
257
+ #
258
+ # @yield [a, b] A pair of items to be compared
259
+ # @yieldreturn [Integer]
260
+ # @return [SortedSet]
76
261
  def sort(&comparator)
77
- Stream.new { Sorter.new(self).sort(&comparator) }
78
- end
79
-
80
- def sort_by(&transformer)
81
- return sort unless block_given?
82
- Stream.new { Sorter.new(self).sort_by(&transformer) }
262
+ SortedSet.new(self.to_a, &comparator)
83
263
  end
84
264
 
85
- def join(sep = nil)
86
- to_a.join(sep)
265
+ # Return a {SortedSet} which contains the same items as this `Set`, ordered by
266
+ # mapping each item through the provided block to obtain sort keys, and then
267
+ # sorting the keys.
268
+ #
269
+ # @example
270
+ # Hamster::Set["Elephant", "Dog", "Lion"].sort_by { |e| e.size }
271
+ # # => Hamster::SortedSet["Dog", "Lion", "Elephant"]
272
+ #
273
+ # @yield [item] The item to obtain a sort key for
274
+ # @yieldreturn [Object]
275
+ # @return [SortedSet]
276
+ def sort_by(&mapper)
277
+ SortedSet.new(self.to_a, &mapper)
87
278
  end
88
279
 
280
+ # Return a new `Set` which contains all the members of both this `Set` and `other`.
281
+ # `other` can be any `Enumerable` object.
282
+ #
283
+ # @example
284
+ # Hamster::Set[1, 2] | Hamster::Set[2, 3] # => Hamster::Set[1, 2, 3]
285
+ #
286
+ # @param other [Enumerable] The collection to merge with
287
+ # @return [Set]
89
288
  def union(other)
90
- trie = other.reduce(@trie) do |trie, item|
91
- next trie if trie.has_key?(item)
92
- trie.put(item, nil)
289
+ if other.is_a?(Hamster::Set)
290
+ if other.size > size
291
+ small_set_pairs = @trie
292
+ large_set_trie = other.instance_variable_get(:@trie)
293
+ else
294
+ small_set_pairs = other.instance_variable_get(:@trie)
295
+ large_set_trie = @trie
296
+ end
297
+ else
298
+ if other.respond_to?(:lazy)
299
+ small_set_pairs = other.lazy.map { |e| [e, nil] }
300
+ else
301
+ small_set_pairs = other.map { |e| [e, nil] }
302
+ end
303
+ large_set_trie = @trie
93
304
  end
94
- transform_unless(trie.equal?(@trie)) { @trie = trie }
95
- end
96
- def_delegator :self, :union, :|
97
- def_delegator :self, :union, :+
98
- def_delegator :self, :union, :merge
99
305
 
306
+ trie = large_set_trie.bulk_put(small_set_pairs)
307
+ new_trie(trie)
308
+ end
309
+ alias :| :union
310
+ alias :+ :union
311
+ alias :merge :union
312
+
313
+ # Return a new `Set` which contains all the items which are members of both
314
+ # this `Set` and `other`. `other` can be any `Enumerable` object.
315
+ #
316
+ # @example
317
+ # Hamster::Set[1, 2] & Hamster::Set[2, 3] # => Hamster::Set[2]
318
+ #
319
+ # @param other [Enumerable] The collection to intersect with
320
+ # @return [Set]
100
321
  def intersection(other)
101
- trie = @trie.filter { |entry| other.include?(entry.key) }
102
- transform_unless(trie.equal?(@trie)) { @trie = trie }
322
+ if other.size < @trie.size
323
+ if other.is_a?(Hamster::Set)
324
+ trie = other.instance_variable_get(:@trie).select { |key, _| include?(key) }
325
+ else
326
+ trie = Trie.new(0)
327
+ other.each { |obj| trie.put!(obj, nil) if include?(obj) }
328
+ end
329
+ else
330
+ trie = @trie.select { |key, _| other.include?(key) }
331
+ end
332
+ new_trie(trie)
103
333
  end
104
- def_delegator :self, :intersection, :intersect
105
- def_delegator :self, :intersection, :&
106
-
334
+ alias :& :intersection
335
+
336
+ # Return a new `Set` with all the items in `other` removed. `other` can be
337
+ # any `Enumerable` object.
338
+ #
339
+ # @example
340
+ # Hamster::Set[1, 2] - Hamster::Set[2, 3] # => Hamster::Set[1]
341
+ #
342
+ # @param other [Enumerable] The collection to subtract from this set
343
+ # @return [Set]
107
344
  def difference(other)
108
- trie = @trie.filter { |entry| !other.include?(entry.key) }
109
- transform_unless(trie.equal?(@trie)) { @trie = trie }
345
+ trie = if (@trie.size <= other.size) && (other.is_a?(Hamster::Set) || (defined?(::Set) && other.is_a?(::Set)))
346
+ @trie.select { |key, _| !other.include?(key) }
347
+ else
348
+ @trie.bulk_delete(other)
349
+ end
350
+ new_trie(trie)
110
351
  end
111
- def_delegator :self, :difference, :diff
112
- def_delegator :self, :difference, :subtract
113
- def_delegator :self, :difference, :-
114
-
352
+ alias :subtract :difference
353
+ alias :- :difference
354
+
355
+ # Return a new `Set` which contains all the items which are members of this
356
+ # `Set` or of `other`, but not both. `other` can be any `Enumerable` object.
357
+ #
358
+ # @example
359
+ # Hamster::Set[1, 2] ^ Hamster::Set[2, 3] # => Hamster::Set[1, 3]
360
+ #
361
+ # @param other [Enumerable] The collection to take the exclusive disjunction of
362
+ # @return [Set]
115
363
  def exclusion(other)
116
364
  ((self | other) - (self & other))
117
365
  end
118
- def_delegator :self, :exclusion, :^
119
-
366
+ alias :^ :exclusion
367
+
368
+ # Return `true` if all items in this `Set` are also in `other`.
369
+ #
370
+ # @example
371
+ # Hamster::Set[2, 3].subset?(Hamster::Set[1, 2, 3]) # => true
372
+ #
373
+ # @param other [Set]
374
+ # @return [Boolean]
120
375
  def subset?(other)
376
+ return false if other.size < size
377
+
378
+ # This method has the potential to be very slow if 'other' is a large Array, so to avoid that,
379
+ # we convert those Arrays to Sets before checking presence of items
380
+ # Time to convert Array -> Set is linear in array.size
381
+ # Time to check for presence of all items in an Array is proportional to set.size * array.size
382
+ # Note that both sides of that equation have array.size -- hence those terms cancel out,
383
+ # and the break-even point is solely dependent on the size of this collection
384
+ # After doing some benchmarking to estimate the constants, it appears break-even is at ~190 items
385
+ # We also check other.size, to avoid the more expensive #is_a? checks in cases where it doesn't matter
386
+ #
387
+ if other.size >= 150 && @trie.size >= 190 && !(other.is_a?(Hamster::Set) || other.is_a?(::Set))
388
+ other = ::Set.new(other)
389
+ end
121
390
  all? { |item| other.include?(item) }
122
391
  end
123
-
392
+ alias :<= :subset?
393
+
394
+ # Return `true` if all items in `other` are also in this `Set`.
395
+ #
396
+ # @example
397
+ # Hamster::Set[1, 2, 3].superset?(Hamster::Set[2, 3]) # => true
398
+ #
399
+ # @param other [Set]
400
+ # @return [Boolean]
124
401
  def superset?(other)
125
402
  other.subset?(self)
126
403
  end
404
+ alias :>= :superset?
405
+
406
+ # Returns `true` if `other` contains all the items in this `Set`, plus at least
407
+ # one item which is not in this set.
408
+ #
409
+ # @example
410
+ # Hamster::Set[2, 3].proper_subset?(Hamster::Set[1, 2, 3]) # => true
411
+ # Hamster::Set[1, 2, 3].proper_subset?(Hamster::Set[1, 2, 3]) # => false
412
+ #
413
+ # @param other [Set]
414
+ # @return [Boolean]
415
+ def proper_subset?(other)
416
+ return false if other.size <= size
417
+ # See comments above
418
+ if other.size >= 150 && @trie.size >= 190 && !(other.is_a?(Hamster::Set) || other.is_a?(::Set))
419
+ other = ::Set.new(other)
420
+ end
421
+ all? { |item| other.include?(item) }
422
+ end
423
+ alias :< :proper_subset?
424
+
425
+ # Returns `true` if this `Set` contains all the items in `other`, plus at least
426
+ # one item which is not in `other`.
427
+ #
428
+ # @example
429
+ # Hamster::Set[1, 2, 3].proper_superset?(Hamster::Set[2, 3]) # => true
430
+ # Hamster::Set[1, 2, 3].proper_superset?(Hamster::Set[1, 2, 3]) # => false
431
+ #
432
+ # @param other [Set]
433
+ # @return [Boolean]
434
+ def proper_superset?(other)
435
+ other.proper_subset?(self)
436
+ end
437
+ alias :> :proper_superset?
438
+
439
+ # Return `true` if this `Set` and `other` do not share any items.
440
+ #
441
+ # @example
442
+ # Hamster::Set[1, 2].disjoint?(Hamster::Set[8, 9]) # => true
443
+ #
444
+ # @param other [Set]
445
+ # @return [Boolean]
446
+ def disjoint?(other)
447
+ if other.size <= size
448
+ other.each { |item| return false if include?(item) }
449
+ else
450
+ # See comment on #subset?
451
+ if other.size >= 150 && @trie.size >= 190 && !(other.is_a?(Hamster::Set) || other.is_a?(::Set))
452
+ other = ::Set.new(other)
453
+ end
454
+ each { |item| return false if other.include?(item) }
455
+ end
456
+ true
457
+ end
127
458
 
459
+ # Return `true` if this `Set` and `other` have at least one item in common.
460
+ #
461
+ # @example
462
+ # Hamster::Set[1, 2].intersect?(Hamster::Set[2, 3]) # => true
463
+ #
464
+ # @param other [Set]
465
+ # @return [Boolean]
466
+ def intersect?(other)
467
+ !disjoint?(other)
468
+ end
469
+
470
+ # Recursively insert the contents of any nested `Set`s into this `Set`, and
471
+ # remove them.
472
+ #
473
+ # @example
474
+ # Hamster::Set[Hamster::Set[1, 2], Hamster::Set[3, 4]].flatten
475
+ # # => Hamster::Set[1, 2, 3, 4]
476
+ #
477
+ # @return [Set]
128
478
  def flatten
129
- reduce(EmptySet) do |set, item|
479
+ reduce(self.class.empty) do |set, item|
130
480
  next set.union(item.flatten) if item.is_a?(Set)
131
481
  set.add(item)
132
482
  end
133
483
  end
134
484
 
135
- def group_by(&block)
136
- return group_by { |item| item } unless block_given?
137
- reduce(EmptyHash) do |hash, item|
138
- key = yield(item)
139
- hash.put(key, (hash.get(key) || EmptySet).add(item))
140
- end
485
+ alias :group :group_by
486
+ alias :classify :group_by
487
+
488
+ # Return a randomly chosen item from this `Set`. If the set is empty, return `nil`.
489
+ #
490
+ # @example
491
+ # Hamster::Set[1, 2, 3, 4, 5].sample # => 3
492
+ #
493
+ # @return [Object]
494
+ def sample
495
+ empty? ? nil : @trie.at(rand(size))[0]
141
496
  end
142
- def_delegator :self, :group_by, :group
143
497
 
498
+ # Return an empty `Set` instance, of the same class as this one. Useful if you
499
+ # have multiple subclasses of `Set` and want to treat them polymorphically.
500
+ #
501
+ # @return [Hash]
144
502
  def clear
145
- EmptySet
503
+ self.class.empty
146
504
  end
147
505
 
506
+ # Return true if `other` has the same type and contents as this `Set`.
507
+ #
508
+ # @param other [Object] The object to compare with
509
+ # @return [Boolean]
148
510
  def eql?(other)
149
- instance_of?(other.class) && @trie.eql?(other.instance_variable_get(:@trie))
511
+ return true if other.equal?(self)
512
+ return false if not instance_of?(other.class)
513
+ other_trie = other.instance_variable_get(:@trie)
514
+ return false if @trie.size != other_trie.size
515
+ @trie.each do |key, _|
516
+ return false if !other_trie.key?(key)
517
+ end
518
+ true
150
519
  end
151
- def_delegator :self, :eql?, :==
520
+ alias :== :eql?
152
521
 
522
+ # See `Object#hash`.
523
+ # @return [Integer]
153
524
  def hash
154
525
  reduce(0) { |hash, item| (hash << 5) - hash + item.hash }
155
526
  end
156
527
 
157
- def_delegator :self, :dup, :uniq
158
- def_delegator :self, :dup, :nub
159
- def_delegator :self, :dup, :to_set
160
- def_delegator :self, :dup, :remove_duplicates
528
+ undef :"<=>" # Sets are not ordered, so Enumerable#<=> will give a meaningless result
529
+ undef :each_index # Set members cannot be accessed by 'index', so #each_index is not meaningful
161
530
 
162
- def to_list
163
- reduce(EmptyList) { |list, item| list.cons(item) }
531
+ # Return `self`.
532
+ #
533
+ # @return [self]
534
+ def to_set
535
+ self
164
536
  end
165
537
 
166
- def inspect
167
- "{#{to_a.inspect[1..-2]}}"
538
+ # @private
539
+ def marshal_dump
540
+ output = {}
541
+ each do |key|
542
+ output[key] = nil
543
+ end
544
+ output
168
545
  end
169
546
 
170
- end
547
+ # @private
548
+ def marshal_load(dictionary)
549
+ @trie = dictionary.reduce(EmptyTrie) do |trie, key_value|
550
+ trie.put(key_value.first, nil)
551
+ end
552
+ end
553
+
554
+ private
171
555
 
172
- EmptySet = Set.new
556
+ def new_trie(trie)
557
+ if trie.empty?
558
+ self.class.empty
559
+ elsif trie.equal?(@trie)
560
+ self
561
+ else
562
+ self.class.alloc(trie)
563
+ end
564
+ end
565
+ end
173
566
 
567
+ # The canonical empty `Set`. Returned by `Hamster.set` and `Set[]` when
568
+ # invoked with no arguments; also returned by `Set.empty`. Prefer using this
569
+ # one rather than creating many empty sets using `Set.new`.
570
+ #
571
+ EmptySet = Hamster::Set.empty
174
572
  end