hamster 1.0.1.pre.rc2 → 1.0.1.pre.rc3

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 (482) hide show
  1. checksums.yaml +4 -4
  2. data/lib/hamster.rb +2 -2
  3. data/lib/hamster/core_ext.rb +0 -1
  4. data/lib/hamster/core_ext/enumerable.rb +17 -17
  5. data/lib/hamster/core_ext/io.rb +15 -17
  6. data/lib/hamster/deque.rb +229 -0
  7. data/lib/hamster/enumerable.rb +147 -105
  8. data/lib/hamster/experimental/mutable_queue.rb +2 -2
  9. data/lib/hamster/hash.rb +488 -82
  10. data/lib/hamster/immutable.rb +4 -0
  11. data/lib/hamster/list.rb +839 -196
  12. data/lib/hamster/read_copy_update.rb +1 -0
  13. data/lib/hamster/set.rb +317 -54
  14. data/lib/hamster/sorted_set.rb +1014 -0
  15. data/lib/hamster/trie.rb +67 -47
  16. data/lib/hamster/undefined.rb +1 -3
  17. data/lib/hamster/vector.rb +989 -76
  18. data/lib/hamster/version.rb +1 -1
  19. data/spec/{hamster → lib/hamster}/core_ext/array_spec.rb +1 -1
  20. data/spec/{hamster → lib/hamster}/core_ext/enumerable_spec.rb +4 -0
  21. data/spec/{hamster → lib/hamster}/core_ext/io_spec.rb +0 -0
  22. data/spec/lib/hamster/deque/clear_spec.rb +34 -0
  23. data/spec/lib/hamster/deque/construction_spec.rb +30 -0
  24. data/spec/lib/hamster/deque/copying_spec.rb +20 -0
  25. data/spec/lib/hamster/deque/dequeue_spec.rb +27 -0
  26. data/spec/lib/hamster/deque/empty_spec.rb +42 -0
  27. data/spec/{hamster/queue → lib/hamster/deque}/enqueue_spec.rb +7 -10
  28. data/spec/lib/hamster/deque/head_spec.rb +20 -0
  29. data/spec/lib/hamster/deque/inspect_spec.rb +24 -0
  30. data/spec/lib/hamster/deque/last_spec.rb +20 -0
  31. data/spec/lib/hamster/deque/marshal_spec.rb +34 -0
  32. data/spec/lib/hamster/deque/new_spec.rb +44 -0
  33. data/spec/lib/hamster/deque/pop_spec.rb +25 -0
  34. data/spec/lib/hamster/deque/random_modification_spec.rb +34 -0
  35. data/spec/{hamster/queue → lib/hamster/deque}/size_spec.rb +4 -9
  36. data/spec/lib/hamster/deque/to_a_spec.rb +27 -0
  37. data/spec/{hamster/queue → lib/hamster/deque}/to_ary_spec.rb +6 -6
  38. data/spec/lib/hamster/deque/to_list_spec.rb +26 -0
  39. data/spec/lib/hamster/deque/unshift_spec.rb +26 -0
  40. data/spec/{hamster → lib/hamster}/experimental/mutable_set/add_qm_spec.rb +0 -0
  41. data/spec/{hamster → lib/hamster}/experimental/mutable_set/add_spec.rb +0 -0
  42. data/spec/{hamster → lib/hamster}/experimental/mutable_set/delete_qm_spec.rb +0 -0
  43. data/spec/{hamster → lib/hamster}/experimental/mutable_set/delete_spec.rb +0 -0
  44. data/spec/{hamster → lib/hamster}/hash/all_spec.rb +10 -0
  45. data/spec/lib/hamster/hash/any_spec.rb +56 -0
  46. data/spec/lib/hamster/hash/assoc_spec.rb +52 -0
  47. data/spec/lib/hamster/hash/clear_spec.rb +43 -0
  48. data/spec/lib/hamster/hash/construction_spec.rb +39 -0
  49. data/spec/{hamster → lib/hamster}/hash/copying_spec.rb +2 -4
  50. data/spec/lib/hamster/hash/default_proc_spec.rb +73 -0
  51. data/spec/lib/hamster/hash/delete_spec.rb +40 -0
  52. data/spec/lib/hamster/hash/each_spec.rb +78 -0
  53. data/spec/lib/hamster/hash/each_with_index_spec.rb +30 -0
  54. data/spec/lib/hamster/hash/empty_spec.rb +46 -0
  55. data/spec/lib/hamster/hash/eql_spec.rb +70 -0
  56. data/spec/lib/hamster/hash/except_spec.rb +43 -0
  57. data/spec/lib/hamster/hash/fetch_spec.rb +58 -0
  58. data/spec/lib/hamster/hash/filter_spec.rb +58 -0
  59. data/spec/lib/hamster/hash/find_spec.rb +44 -0
  60. data/spec/lib/hamster/hash/flat_map_spec.rb +36 -0
  61. data/spec/lib/hamster/hash/flatten_spec.rb +99 -0
  62. data/spec/lib/hamster/hash/get_spec.rb +80 -0
  63. data/spec/lib/hamster/hash/has_key_spec.rb +32 -0
  64. data/spec/lib/hamster/hash/has_value_spec.rb +28 -0
  65. data/spec/{hamster → lib/hamster}/hash/hash_spec.rb +5 -12
  66. data/spec/{hamster → lib/hamster}/hash/immutable_spec.rb +0 -0
  67. data/spec/lib/hamster/hash/inspect_spec.rb +31 -0
  68. data/spec/lib/hamster/hash/invert_spec.rb +31 -0
  69. data/spec/lib/hamster/hash/key_spec.rb +28 -0
  70. data/spec/{hamster → lib/hamster}/hash/keys_spec.rb +3 -6
  71. data/spec/lib/hamster/hash/map_spec.rb +46 -0
  72. data/spec/{hamster → lib/hamster}/hash/marshal_spec.rb +3 -3
  73. data/spec/lib/hamster/hash/merge_spec.rb +77 -0
  74. data/spec/lib/hamster/hash/min_max_spec.rb +50 -0
  75. data/spec/lib/hamster/hash/new_spec.rb +71 -0
  76. data/spec/{hamster → lib/hamster}/hash/none_spec.rb +12 -14
  77. data/spec/lib/hamster/hash/partition_spec.rb +36 -0
  78. data/spec/lib/hamster/hash/pretty_print_spec.rb +35 -0
  79. data/spec/lib/hamster/hash/put_spec.rb +81 -0
  80. data/spec/lib/hamster/hash/reduce_spec.rb +36 -0
  81. data/spec/lib/hamster/hash/remove_spec.rb +62 -0
  82. data/spec/lib/hamster/hash/reverse_each_spec.rb +28 -0
  83. data/spec/lib/hamster/hash/sample_spec.rb +14 -0
  84. data/spec/{hamster → lib/hamster}/hash/size_spec.rb +2 -2
  85. data/spec/lib/hamster/hash/slice_spec.rb +45 -0
  86. data/spec/lib/hamster/hash/sort_spec.rb +27 -0
  87. data/spec/lib/hamster/hash/store_spec.rb +54 -0
  88. data/spec/lib/hamster/hash/take_spec.rb +36 -0
  89. data/spec/lib/hamster/hash/to_a_spec.rb +14 -0
  90. data/spec/lib/hamster/hash/to_hash_spec.rb +22 -0
  91. data/spec/{hamster → lib/hamster}/hash/uniq_spec.rb +2 -4
  92. data/spec/lib/hamster/hash/values_at_spec.rb +14 -0
  93. data/spec/lib/hamster/hash/values_spec.rb +25 -0
  94. data/spec/{hamster → lib/hamster}/immutable/copying_spec.rb +0 -0
  95. data/spec/{hamster → lib/hamster}/immutable/immutable_spec.rb +0 -0
  96. data/spec/{hamster → lib/hamster}/immutable/memoize_spec.rb +2 -2
  97. data/spec/{hamster → lib/hamster}/immutable/new_spec.rb +0 -0
  98. data/spec/{hamster → lib/hamster}/immutable/transform_spec.rb +0 -0
  99. data/spec/{hamster → lib/hamster}/immutable/transform_unless_spec.rb +0 -0
  100. data/spec/lib/hamster/list/add_spec.rb +20 -0
  101. data/spec/lib/hamster/list/all_spec.rb +60 -0
  102. data/spec/{hamster → lib/hamster}/list/any_spec.rb +12 -20
  103. data/spec/{hamster → lib/hamster}/list/append_spec.rb +9 -10
  104. data/spec/lib/hamster/list/at_spec.rb +30 -0
  105. data/spec/lib/hamster/list/break_spec.rb +70 -0
  106. data/spec/{hamster → lib/hamster}/list/cadr_spec.rb +5 -8
  107. data/spec/{hamster → lib/hamster}/list/chunk_spec.rb +5 -8
  108. data/spec/{hamster → lib/hamster}/list/clear_spec.rb +4 -7
  109. data/spec/lib/hamster/list/combination_spec.rb +34 -0
  110. data/spec/{hamster → lib/hamster}/list/compact_spec.rb +5 -8
  111. data/spec/lib/hamster/list/compare_spec.rb +31 -0
  112. data/spec/{hamster → lib/hamster}/list/cons_spec.rb +5 -9
  113. data/spec/lib/hamster/list/construction_spec.rb +118 -0
  114. data/spec/{hamster → lib/hamster}/list/copying_spec.rb +3 -7
  115. data/spec/lib/hamster/list/count_spec.rb +37 -0
  116. data/spec/lib/hamster/list/cycle_spec.rb +29 -0
  117. data/spec/lib/hamster/list/delete_at_spec.rb +19 -0
  118. data/spec/lib/hamster/list/delete_spec.rb +17 -0
  119. data/spec/{hamster → lib/hamster}/list/drop_spec.rb +5 -8
  120. data/spec/lib/hamster/list/drop_while_spec.rb +39 -0
  121. data/spec/lib/hamster/list/each_slice_spec.rb +52 -0
  122. data/spec/lib/hamster/list/each_spec.rb +43 -0
  123. data/spec/lib/hamster/list/each_with_index_spec.rb +29 -0
  124. data/spec/{hamster → lib/hamster}/list/elem_index_spec.rb +4 -14
  125. data/spec/{hamster → lib/hamster}/list/elem_indices_spec.rb +5 -9
  126. data/spec/{hamster → lib/hamster}/list/empty_spec.rb +4 -13
  127. data/spec/{hamster → lib/hamster}/list/eql_spec.rb +2 -8
  128. data/spec/lib/hamster/list/fill_spec.rb +50 -0
  129. data/spec/{hamster → lib/hamster}/list/filter_spec.rb +3 -2
  130. data/spec/{hamster → lib/hamster}/list/find_all_spec.rb +3 -2
  131. data/spec/{hamster → lib/hamster}/list/find_index_spec.rb +4 -14
  132. data/spec/{hamster → lib/hamster}/list/find_indices_spec.rb +11 -9
  133. data/spec/{hamster → lib/hamster}/list/find_spec.rb +10 -16
  134. data/spec/{hamster → lib/hamster}/list/flat_map_spec.rb +0 -0
  135. data/spec/{hamster → lib/hamster}/list/flatten_spec.rb +5 -8
  136. data/spec/{hamster → lib/hamster}/list/grep_spec.rb +9 -17
  137. data/spec/{hamster → lib/hamster}/list/group_by_spec.rb +8 -24
  138. data/spec/{hamster → lib/hamster}/list/hash_spec.rb +4 -12
  139. data/spec/{hamster → lib/hamster}/list/head_spec.rb +2 -7
  140. data/spec/{hamster → lib/hamster}/list/include_spec.rb +4 -13
  141. data/spec/{hamster → lib/hamster}/list/init_spec.rb +5 -9
  142. data/spec/lib/hamster/list/inits_spec.rb +29 -0
  143. data/spec/lib/hamster/list/insert_spec.rb +47 -0
  144. data/spec/lib/hamster/list/inspect_spec.rb +30 -0
  145. data/spec/{hamster → lib/hamster}/list/intersperse_spec.rb +5 -8
  146. data/spec/lib/hamster/list/join_spec.rb +64 -0
  147. data/spec/lib/hamster/list/last_spec.rb +24 -0
  148. data/spec/{hamster → lib/hamster}/list/map_spec.rb +11 -20
  149. data/spec/lib/hamster/list/maximum_spec.rb +42 -0
  150. data/spec/{hamster → lib/hamster}/list/merge_by_spec.rb +4 -13
  151. data/spec/{hamster → lib/hamster}/list/merge_spec.rb +0 -0
  152. data/spec/lib/hamster/list/minimum_spec.rb +42 -0
  153. data/spec/lib/hamster/list/multithreading_spec.rb +48 -0
  154. data/spec/{hamster → lib/hamster}/list/none_spec.rb +11 -21
  155. data/spec/{hamster → lib/hamster}/list/one_spec.rb +12 -22
  156. data/spec/lib/hamster/list/partition_spec.rb +116 -0
  157. data/spec/lib/hamster/list/permutation_spec.rb +56 -0
  158. data/spec/{hamster → lib/hamster}/list/pop_spec.rb +1 -1
  159. data/spec/lib/hamster/list/product_spec.rb +24 -0
  160. data/spec/lib/hamster/list/reduce_spec.rb +97 -0
  161. data/spec/{hamster → lib/hamster}/list/remove_spec.rb +9 -19
  162. data/spec/{hamster → lib/hamster}/list/reverse_spec.rb +7 -14
  163. data/spec/lib/hamster/list/rotate_spec.rb +37 -0
  164. data/spec/lib/hamster/list/sample_spec.rb +14 -0
  165. data/spec/{hamster → lib/hamster}/list/select_spec.rb +3 -2
  166. data/spec/{hamster → lib/hamster}/list/size_spec.rb +4 -13
  167. data/spec/lib/hamster/list/slice_spec.rb +230 -0
  168. data/spec/{hamster → lib/hamster}/list/sorting_spec.rb +10 -20
  169. data/spec/lib/hamster/list/span_spec.rb +77 -0
  170. data/spec/{hamster → lib/hamster}/list/split_at_spec.rb +13 -14
  171. data/spec/lib/hamster/list/subsequences_spec.rb +24 -0
  172. data/spec/lib/hamster/list/sum_spec.rb +24 -0
  173. data/spec/lib/hamster/list/tail_spec.rb +31 -0
  174. data/spec/lib/hamster/list/tails_spec.rb +29 -0
  175. data/spec/{hamster → lib/hamster}/list/take_spec.rb +5 -8
  176. data/spec/{hamster → lib/hamster}/list/take_while_spec.rb +11 -17
  177. data/spec/lib/hamster/list/to_a_spec.rb +40 -0
  178. data/spec/{hamster → lib/hamster}/list/to_ary_spec.rb +1 -3
  179. data/spec/{hamster → lib/hamster}/list/to_list_spec.rb +3 -7
  180. data/spec/{hamster → lib/hamster}/list/to_set_spec.rb +2 -10
  181. data/spec/lib/hamster/list/transpose_spec.rb +20 -0
  182. data/spec/{hamster → lib/hamster}/list/union_spec.rb +5 -12
  183. data/spec/{hamster → lib/hamster}/list/uniq_spec.rb +5 -8
  184. data/spec/{hamster → lib/hamster}/list/zip_spec.rb +2 -9
  185. data/spec/lib/hamster/set/add_spec.rb +76 -0
  186. data/spec/{hamster → lib/hamster}/set/all_spec.rb +18 -14
  187. data/spec/{hamster → lib/hamster}/set/any_spec.rb +19 -16
  188. data/spec/{hamster → lib/hamster}/set/clear_spec.rb +8 -11
  189. data/spec/{hamster → lib/hamster}/set/compact_spec.rb +4 -7
  190. data/spec/{hamster → lib/hamster}/set/construction_spec.rb +4 -8
  191. data/spec/{hamster → lib/hamster}/set/copying_spec.rb +3 -5
  192. data/spec/{hamster → lib/hamster}/set/count_spec.rb +11 -16
  193. data/spec/lib/hamster/set/delete_spec.rb +72 -0
  194. data/spec/lib/hamster/set/difference_spec.rb +50 -0
  195. data/spec/lib/hamster/set/disjoint_spec.rb +26 -0
  196. data/spec/lib/hamster/set/each_spec.rb +46 -0
  197. data/spec/lib/hamster/set/empty_spec.rb +47 -0
  198. data/spec/{hamster → lib/hamster}/set/eqeq_spec.rb +0 -0
  199. data/spec/{hamster → lib/hamster}/set/eql_spec.rb +7 -1
  200. data/spec/lib/hamster/set/exclusion_spec.rb +48 -0
  201. data/spec/lib/hamster/set/filter_spec.rb +74 -0
  202. data/spec/{hamster → lib/hamster}/set/find_spec.rb +7 -11
  203. data/spec/lib/hamster/set/flatten_spec.rb +47 -0
  204. data/spec/{hamster → lib/hamster}/set/foreach_spec.rb +5 -4
  205. data/spec/{hamster → lib/hamster}/set/grep_spec.rb +1 -1
  206. data/spec/lib/hamster/set/group_by_spec.rb +60 -0
  207. data/spec/lib/hamster/set/hash_spec.rb +23 -0
  208. data/spec/lib/hamster/set/head_spec.rb +31 -0
  209. data/spec/{hamster → lib/hamster}/set/immutable_spec.rb +0 -0
  210. data/spec/lib/hamster/set/include_spec.rb +61 -0
  211. data/spec/lib/hamster/set/inspect_spec.rb +48 -0
  212. data/spec/lib/hamster/set/intersect_spec.rb +26 -0
  213. data/spec/lib/hamster/set/intersection_spec.rb +53 -0
  214. data/spec/lib/hamster/set/join_spec.rb +65 -0
  215. data/spec/lib/hamster/set/map_spec.rb +60 -0
  216. data/spec/{hamster → lib/hamster}/set/marshal_spec.rb +3 -3
  217. data/spec/{hamster → lib/hamster}/set/maximum_spec.rb +6 -15
  218. data/spec/{hamster → lib/hamster}/set/minimum_spec.rb +6 -16
  219. data/spec/lib/hamster/set/new_spec.rb +54 -0
  220. data/spec/{hamster → lib/hamster}/set/none_spec.rb +15 -15
  221. data/spec/{hamster → lib/hamster}/set/one_spec.rb +14 -16
  222. data/spec/lib/hamster/set/partition_spec.rb +53 -0
  223. data/spec/{hamster → lib/hamster}/set/product_spec.rb +6 -6
  224. data/spec/lib/hamster/set/reduce_spec.rb +56 -0
  225. data/spec/lib/hamster/set/remove_spec.rb +51 -0
  226. data/spec/{hamster/set/each_spec.rb → lib/hamster/set/reverse_each_spec.rb} +8 -7
  227. data/spec/lib/hamster/set/sample_spec.rb +14 -0
  228. data/spec/{hamster → lib/hamster}/set/size_spec.rb +0 -1
  229. data/spec/{hamster → lib/hamster}/set/sorting_spec.rb +17 -13
  230. data/spec/lib/hamster/set/subset_spec.rb +52 -0
  231. data/spec/lib/hamster/set/sum_spec.rb +24 -0
  232. data/spec/lib/hamster/set/superset_spec.rb +52 -0
  233. data/spec/lib/hamster/set/to_a_spec.rb +31 -0
  234. data/spec/lib/hamster/set/to_list_spec.rb +37 -0
  235. data/spec/{hamster → lib/hamster}/set/to_set_spec.rb +2 -6
  236. data/spec/lib/hamster/set/union_spec.rb +55 -0
  237. data/spec/{hamster → lib/hamster}/set/uniq_spec.rb +2 -5
  238. data/spec/lib/hamster/sorted_set/above_spec.rb +52 -0
  239. data/spec/lib/hamster/sorted_set/add_spec.rb +63 -0
  240. data/spec/lib/hamster/sorted_set/at_spec.rb +25 -0
  241. data/spec/lib/hamster/sorted_set/below_spec.rb +52 -0
  242. data/spec/lib/hamster/sorted_set/between_spec.rb +52 -0
  243. data/spec/lib/hamster/sorted_set/clear_spec.rb +35 -0
  244. data/spec/lib/hamster/sorted_set/construction_spec.rb +29 -0
  245. data/spec/lib/hamster/sorted_set/delete_at_spec.rb +19 -0
  246. data/spec/lib/hamster/sorted_set/delete_spec.rb +81 -0
  247. data/spec/{hamster/set → lib/hamster/sorted_set}/difference_spec.rb +5 -9
  248. data/spec/lib/hamster/sorted_set/disjoint_spec.rb +26 -0
  249. data/spec/lib/hamster/sorted_set/drop_spec.rb +29 -0
  250. data/spec/lib/hamster/sorted_set/drop_while_spec.rb +35 -0
  251. data/spec/lib/hamster/sorted_set/each_spec.rb +31 -0
  252. data/spec/lib/hamster/sorted_set/empty_spec.rb +37 -0
  253. data/spec/lib/hamster/sorted_set/eql_spec.rb +121 -0
  254. data/spec/{hamster/set → lib/hamster/sorted_set}/exclusion_spec.rb +4 -9
  255. data/spec/lib/hamster/sorted_set/fetch_spec.rb +65 -0
  256. data/spec/lib/hamster/sorted_set/filter_spec.rb +62 -0
  257. data/spec/lib/hamster/sorted_set/find_index_spec.rb +33 -0
  258. data/spec/lib/hamster/sorted_set/first_spec.rb +21 -0
  259. data/spec/lib/hamster/sorted_set/from_spec.rb +52 -0
  260. data/spec/lib/hamster/sorted_set/group_by_spec.rb +58 -0
  261. data/spec/lib/hamster/sorted_set/include_spec.rb +24 -0
  262. data/spec/lib/hamster/sorted_set/inspect_spec.rb +38 -0
  263. data/spec/lib/hamster/sorted_set/intersect_spec.rb +26 -0
  264. data/spec/lib/hamster/sorted_set/intersection_spec.rb +29 -0
  265. data/spec/lib/hamster/sorted_set/last_spec.rb +37 -0
  266. data/spec/lib/hamster/sorted_set/map_spec.rb +36 -0
  267. data/spec/lib/hamster/sorted_set/marshal_spec.rb +37 -0
  268. data/spec/lib/hamster/sorted_set/minimum_spec.rb +22 -0
  269. data/spec/lib/hamster/sorted_set/new_spec.rb +52 -0
  270. data/spec/lib/hamster/sorted_set/reverse_each_spec.rb +29 -0
  271. data/spec/lib/hamster/sorted_set/sample_spec.rb +14 -0
  272. data/spec/lib/hamster/sorted_set/size_spec.rb +18 -0
  273. data/spec/lib/hamster/sorted_set/slice_spec.rb +241 -0
  274. data/spec/lib/hamster/sorted_set/sorting_spec.rb +45 -0
  275. data/spec/lib/hamster/sorted_set/subset_spec.rb +48 -0
  276. data/spec/lib/hamster/sorted_set/superset_spec.rb +48 -0
  277. data/spec/lib/hamster/sorted_set/take_spec.rb +26 -0
  278. data/spec/lib/hamster/sorted_set/take_while_spec.rb +34 -0
  279. data/spec/lib/hamster/sorted_set/to_set_spec.rb +19 -0
  280. data/spec/lib/hamster/sorted_set/union_spec.rb +28 -0
  281. data/spec/lib/hamster/sorted_set/up_to_spec.rb +52 -0
  282. data/spec/lib/hamster/sorted_set/values_at_spec.rb +34 -0
  283. data/spec/lib/hamster/vector/add_spec.rb +68 -0
  284. data/spec/{hamster → lib/hamster}/vector/any_spec.rb +0 -0
  285. data/spec/lib/hamster/vector/assoc_spec.rb +36 -0
  286. data/spec/lib/hamster/vector/bsearch_spec.rb +58 -0
  287. data/spec/lib/hamster/vector/clear_spec.rb +34 -0
  288. data/spec/lib/hamster/vector/combination_spec.rb +82 -0
  289. data/spec/lib/hamster/vector/compact_spec.rb +30 -0
  290. data/spec/lib/hamster/vector/compare_spec.rb +32 -0
  291. data/spec/lib/hamster/vector/concat_spec.rb +35 -0
  292. data/spec/{hamster → lib/hamster}/vector/copying_spec.rb +3 -6
  293. data/spec/lib/hamster/vector/count_spec.rb +18 -0
  294. data/spec/lib/hamster/vector/delete_at_spec.rb +54 -0
  295. data/spec/lib/hamster/vector/delete_spec.rb +31 -0
  296. data/spec/lib/hamster/vector/drop_spec.rb +35 -0
  297. data/spec/lib/hamster/vector/drop_while_spec.rb +55 -0
  298. data/spec/lib/hamster/vector/each_index_spec.rb +41 -0
  299. data/spec/lib/hamster/vector/each_spec.rb +47 -0
  300. data/spec/lib/hamster/vector/each_with_index_spec.rb +40 -0
  301. data/spec/lib/hamster/vector/empty_spec.rb +44 -0
  302. data/spec/lib/hamster/vector/eql_spec.rb +77 -0
  303. data/spec/lib/hamster/vector/exist_spec.rb +4 -4
  304. data/spec/lib/hamster/vector/exists_spec.rb +4 -4
  305. data/spec/lib/hamster/vector/fetch_spec.rb +65 -0
  306. data/spec/lib/hamster/vector/fill_spec.rb +89 -0
  307. data/spec/lib/hamster/vector/filter_spec.rb +64 -0
  308. data/spec/{hamster → lib/hamster}/vector/first_spec.rb +2 -6
  309. data/spec/lib/hamster/vector/flatten_spec.rb +44 -0
  310. data/spec/lib/hamster/vector/get_spec.rb +75 -0
  311. data/spec/lib/hamster/vector/group_by_spec.rb +58 -0
  312. data/spec/{hamster → lib/hamster}/vector/include_spec.rb +2 -6
  313. data/spec/lib/hamster/vector/insert_spec.rb +69 -0
  314. data/spec/lib/hamster/vector/inspect_spec.rb +50 -0
  315. data/spec/{hamster/set → lib/hamster/vector}/join_spec.rb +23 -18
  316. data/spec/{hamster → lib/hamster}/vector/last_spec.rb +12 -3
  317. data/spec/{hamster → lib/hamster}/vector/length_spec.rb +12 -3
  318. data/spec/lib/hamster/vector/ltlt_spec.rb +20 -2
  319. data/spec/lib/hamster/vector/map_spec.rb +52 -0
  320. data/spec/lib/hamster/vector/marshal_spec.rb +32 -0
  321. data/spec/lib/hamster/vector/maximum_spec.rb +36 -0
  322. data/spec/lib/hamster/vector/minimum_spec.rb +36 -0
  323. data/spec/lib/hamster/vector/multiply_spec.rb +48 -0
  324. data/spec/lib/hamster/vector/new_spec.rb +51 -0
  325. data/spec/lib/hamster/vector/partition_spec.rb +53 -0
  326. data/spec/lib/hamster/vector/permutation_spec.rb +92 -0
  327. data/spec/lib/hamster/vector/pop_spec.rb +27 -0
  328. data/spec/lib/hamster/vector/product_spec.rb +71 -0
  329. data/spec/lib/hamster/vector/reduce_spec.rb +108 -0
  330. data/spec/lib/hamster/vector/remove_spec.rb +44 -0
  331. data/spec/lib/hamster/vector/repeated_combination_spec.rb +78 -0
  332. data/spec/lib/hamster/vector/repeated_permutation_spec.rb +94 -0
  333. data/spec/lib/hamster/vector/reverse_each_spec.rb +32 -0
  334. data/spec/lib/hamster/vector/reverse_spec.rb +22 -0
  335. data/spec/lib/hamster/vector/rindex_spec.rb +37 -0
  336. data/spec/lib/hamster/vector/rotate_spec.rb +74 -0
  337. data/spec/lib/hamster/vector/sample_spec.rb +14 -0
  338. data/spec/{hamster → lib/hamster}/vector/set_spec.rb +48 -14
  339. data/spec/lib/hamster/vector/shift_spec.rb +28 -0
  340. data/spec/lib/hamster/vector/shuffle_spec.rb +44 -0
  341. data/spec/lib/hamster/vector/slice_spec.rb +241 -0
  342. data/spec/lib/hamster/vector/sorting_spec.rb +57 -0
  343. data/spec/{hamster/set → lib/hamster/vector}/sum_spec.rb +3 -9
  344. data/spec/lib/hamster/vector/take_spec.rb +29 -0
  345. data/spec/lib/hamster/vector/take_while_spec.rb +35 -0
  346. data/spec/{hamster → lib/hamster}/vector/to_a_spec.rb +11 -12
  347. data/spec/{hamster → lib/hamster}/vector/to_ary_spec.rb +0 -0
  348. data/spec/{hamster/set → lib/hamster/vector}/to_list_spec.rb +7 -12
  349. data/spec/lib/hamster/vector/to_set_spec.rb +23 -0
  350. data/spec/lib/hamster/vector/transpose_spec.rb +49 -0
  351. data/spec/lib/hamster/vector/uniq_spec.rb +56 -0
  352. data/spec/lib/hamster/vector/unshift_spec.rb +29 -0
  353. data/spec/lib/hamster/vector/values_at_spec.rb +34 -0
  354. data/spec/lib/hamster/vector/zip_spec.rb +58 -0
  355. data/spec/spec_helper.rb +34 -1
  356. metadata +684 -467
  357. data/lib/hamster/core_ext/enumerator.rb +0 -16
  358. data/lib/hamster/experimental/mutable_stack.rb +0 -30
  359. data/lib/hamster/groupable.rb +0 -12
  360. data/lib/hamster/queue.rb +0 -86
  361. data/lib/hamster/sorter.rb +0 -25
  362. data/lib/hamster/stack.rb +0 -77
  363. data/lib/hamster/tuple.rb +0 -24
  364. data/spec/hamster/core_ext/enumerator_spec.rb +0 -19
  365. data/spec/hamster/experimental/mutable_stack/pop_spec.rb +0 -35
  366. data/spec/hamster/experimental/mutable_stack/push_spec.rb +0 -21
  367. data/spec/hamster/hash/any_spec.rb +0 -52
  368. data/spec/hamster/hash/clear_spec.rb +0 -29
  369. data/spec/hamster/hash/construction_spec.rb +0 -27
  370. data/spec/hamster/hash/delete_spec.rb +0 -38
  371. data/spec/hamster/hash/each_spec.rb +0 -30
  372. data/spec/hamster/hash/empty_spec.rb +0 -27
  373. data/spec/hamster/hash/eql_spec.rb +0 -70
  374. data/spec/hamster/hash/except_spec.rb +0 -22
  375. data/spec/hamster/hash/fetch_spec.rb +0 -72
  376. data/spec/hamster/hash/filter_spec.rb +0 -48
  377. data/spec/hamster/hash/find_spec.rb +0 -45
  378. data/spec/hamster/hash/get_spec.rb +0 -55
  379. data/spec/hamster/hash/has_key_spec.rb +0 -26
  380. data/spec/hamster/hash/inspect_spec.rb +0 -24
  381. data/spec/hamster/hash/map_spec.rb +0 -49
  382. data/spec/hamster/hash/merge_spec.rb +0 -30
  383. data/spec/hamster/hash/new_spec.rb +0 -21
  384. data/spec/hamster/hash/put_spec.rb +0 -67
  385. data/spec/hamster/hash/reduce_spec.rb +0 -52
  386. data/spec/hamster/hash/remove_spec.rb +0 -48
  387. data/spec/hamster/hash/slice_spec.rb +0 -26
  388. data/spec/hamster/hash/values_spec.rb +0 -29
  389. data/spec/hamster/list/add_spec.rb +0 -11
  390. data/spec/hamster/list/all_spec.rb +0 -84
  391. data/spec/hamster/list/at_spec.rb +0 -37
  392. data/spec/hamster/list/break_spec.rb +0 -73
  393. data/spec/hamster/list/combinations_spec.rb +0 -41
  394. data/spec/hamster/list/construction_spec.rb +0 -137
  395. data/spec/hamster/list/count_spec.rb +0 -52
  396. data/spec/hamster/list/cycle_spec.rb +0 -36
  397. data/spec/hamster/list/drop_while_spec.rb +0 -47
  398. data/spec/hamster/list/each_slice_spec.rb +0 -64
  399. data/spec/hamster/list/each_spec.rb +0 -56
  400. data/spec/hamster/list/each_with_index_spec.rb +0 -33
  401. data/spec/hamster/list/inits_spec.rb +0 -34
  402. data/spec/hamster/list/inspect_spec.rb +0 -33
  403. data/spec/hamster/list/join_spec.rb +0 -64
  404. data/spec/hamster/list/last_spec.rb +0 -34
  405. data/spec/hamster/list/maximum_spec.rb +0 -58
  406. data/spec/hamster/list/minimum_spec.rb +0 -58
  407. data/spec/hamster/list/partition_spec.rb +0 -63
  408. data/spec/hamster/list/product_spec.rb +0 -34
  409. data/spec/hamster/list/reduce_spec.rb +0 -72
  410. data/spec/hamster/list/slice_spec.rb +0 -40
  411. data/spec/hamster/list/span_spec.rb +0 -75
  412. data/spec/hamster/list/sum_spec.rb +0 -34
  413. data/spec/hamster/list/tail_spec.rb +0 -38
  414. data/spec/hamster/list/tails_spec.rb +0 -34
  415. data/spec/hamster/list/to_a_spec.rb +0 -42
  416. data/spec/hamster/queue/clear_spec.rb +0 -28
  417. data/spec/hamster/queue/construction_spec.rb +0 -34
  418. data/spec/hamster/queue/dequeue_spec.rb +0 -30
  419. data/spec/hamster/queue/empty_spec.rb +0 -35
  420. data/spec/hamster/queue/head_spec.rb +0 -25
  421. data/spec/hamster/queue/inspect_spec.rb +0 -23
  422. data/spec/hamster/queue/to_a_spec.rb +0 -32
  423. data/spec/hamster/queue/to_list_spec.rb +0 -34
  424. data/spec/hamster/set/add_spec.rb +0 -40
  425. data/spec/hamster/set/delete_spec.rb +0 -38
  426. data/spec/hamster/set/empty_spec.rb +0 -25
  427. data/spec/hamster/set/filter_spec.rb +0 -72
  428. data/spec/hamster/set/flatten_spec.rb +0 -47
  429. data/spec/hamster/set/group_by_spec.rb +0 -56
  430. data/spec/hamster/set/hash_spec.rb +0 -20
  431. data/spec/hamster/set/head_spec.rb +0 -28
  432. data/spec/hamster/set/include_spec.rb +0 -27
  433. data/spec/hamster/set/inspect_spec.rb +0 -24
  434. data/spec/hamster/set/intersection_spec.rb +0 -36
  435. data/spec/hamster/set/map_spec.rb +0 -49
  436. data/spec/hamster/set/new_spec.rb +0 -21
  437. data/spec/hamster/set/partition_spec.rb +0 -59
  438. data/spec/hamster/set/reduce_spec.rb +0 -62
  439. data/spec/hamster/set/remove_spec.rb +0 -48
  440. data/spec/hamster/set/subset_spec.rb +0 -31
  441. data/spec/hamster/set/superset_spec.rb +0 -31
  442. data/spec/hamster/set/to_a_spec.rb +0 -32
  443. data/spec/hamster/set/union_spec.rb +0 -35
  444. data/spec/hamster/sorter/immutable_spec.rb +0 -9
  445. data/spec/hamster/stack/clear_spec.rb +0 -28
  446. data/spec/hamster/stack/construction_spec.rb +0 -34
  447. data/spec/hamster/stack/copying_spec.rb +0 -23
  448. data/spec/hamster/stack/empty_spec.rb +0 -23
  449. data/spec/hamster/stack/eql_spec.rb +0 -48
  450. data/spec/hamster/stack/immutable_spec.rb +0 -9
  451. data/spec/hamster/stack/inspect_spec.rb +0 -23
  452. data/spec/hamster/stack/peek_spec.rb +0 -30
  453. data/spec/hamster/stack/pop_spec.rb +0 -31
  454. data/spec/hamster/stack/push_spec.rb +0 -31
  455. data/spec/hamster/stack/size_spec.rb +0 -25
  456. data/spec/hamster/stack/to_a_spec.rb +0 -32
  457. data/spec/hamster/stack/to_ary.rb +0 -37
  458. data/spec/hamster/stack/to_list_spec.rb +0 -25
  459. data/spec/hamster/trie/remove_spec.rb +0 -117
  460. data/spec/hamster/tuple/construction_spec.rb +0 -30
  461. data/spec/hamster/tuple/copying_spec.rb +0 -17
  462. data/spec/hamster/tuple/eql_spec.rb +0 -78
  463. data/spec/hamster/tuple/first_spec.rb +0 -14
  464. data/spec/hamster/tuple/immutable_spec.rb +0 -9
  465. data/spec/hamster/tuple/inspect_spec.rb +0 -14
  466. data/spec/hamster/tuple/last_spec.rb +0 -14
  467. data/spec/hamster/tuple/to_a_spec.rb +0 -30
  468. data/spec/hamster/tuple/to_ary_spec.rb +0 -37
  469. data/spec/hamster/undefined/erase_spec.rb +0 -36
  470. data/spec/hamster/vector/add_spec.rb +0 -56
  471. data/spec/hamster/vector/clear_spec.rb +0 -28
  472. data/spec/hamster/vector/each_spec.rb +0 -35
  473. data/spec/hamster/vector/each_with_index_spec.rb +0 -33
  474. data/spec/hamster/vector/empty_spec.rb +0 -32
  475. data/spec/hamster/vector/eql_spec.rb +0 -53
  476. data/spec/hamster/vector/filter_spec.rb +0 -58
  477. data/spec/hamster/vector/get_spec.rb +0 -58
  478. data/spec/hamster/vector/inspect_spec.rb +0 -33
  479. data/spec/hamster/vector/map_spec.rb +0 -57
  480. data/spec/hamster/vector/new_spec.rb +0 -48
  481. data/spec/hamster/vector/reduce_spec.rb +0 -62
  482. data/spec/lib/hamster/vector/cons_spec.rb +0 -48
@@ -0,0 +1,37 @@
1
+ require "spec_helper"
2
+ require "hamster/sorted_set"
3
+
4
+ describe Hamster::SortedSet do
5
+ let(:sorted_set) { Hamster.sorted_set(*values) }
6
+
7
+ describe "#last" do
8
+ let(:last) { sorted_set.last }
9
+
10
+ shared_examples "checking values" do
11
+ it "returns the last item" do
12
+ expect(last).to eq(last_item)
13
+ end
14
+ end
15
+
16
+ context "with an empty set" do
17
+ let(:last_item) { nil }
18
+ let(:values) { [] }
19
+
20
+ include_examples "checking values"
21
+ end
22
+
23
+ context "with a single item set" do
24
+ let(:last_item) { "A" }
25
+ let(:values) { %w[A] }
26
+
27
+ include_examples "checking values"
28
+ end
29
+
30
+ context "with a multi-item set" do
31
+ let(:last_item) { "B" }
32
+ let(:values) { %w[B A] }
33
+
34
+ include_examples "checking values"
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,36 @@
1
+ require "spec_helper"
2
+ require "hamster/sorted_set"
3
+
4
+ describe Hamster::SortedSet do
5
+ [:map, :collect].each do |method|
6
+ describe "##{method}" do
7
+ context "when empty" do
8
+ it "returns self" do
9
+ Hamster.sorted_set.send(method) {}.should equal(Hamster.sorted_set)
10
+ end
11
+ end
12
+
13
+ context "when not empty" do
14
+ let(:sorted_set) { Hamster.sorted_set("A", "B", "C") }
15
+
16
+ context "with a block" do
17
+ it "preserves the original values" do
18
+ sorted_set.send(method, &:downcase)
19
+ sorted_set.should eql(Hamster.sorted_set("A", "B", "C"))
20
+ end
21
+
22
+ it "returns a new set with the mapped values" do
23
+ sorted_set.send(method, &:downcase).should eql(Hamster.sorted_set("a", "b", "c"))
24
+ end
25
+ end
26
+
27
+ context "with no block" do
28
+ it "returns an Enumerator" do
29
+ sorted_set.send(method).class.should be(Enumerator)
30
+ sorted_set.send(method).each(&:downcase).should == Hamster.sorted_set('a', 'b', 'c')
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,37 @@
1
+ require "spec_helper"
2
+ require "hamster/sorted_set"
3
+
4
+ describe Hamster::SortedSet do
5
+ describe "#marshal_dump/#marshal_load" do
6
+ let(:ruby) do
7
+ File.join(RbConfig::CONFIG["bindir"], RbConfig::CONFIG["ruby_install_name"])
8
+ end
9
+ let(:child_cmd) do
10
+ %Q|#{ruby} -I lib -r hamster -e 'set = Hamster.sorted_set(5, 10, 15); $stdout.write(Marshal.dump(set))'|
11
+ end
12
+
13
+ let(:reloaded_set) do
14
+ IO.popen(child_cmd, "r+") do |child|
15
+ reloaded_set = Marshal.load(child)
16
+ child.close
17
+ reloaded_set
18
+ end
19
+ end
20
+
21
+ it "can survive dumping and loading into a new process" do
22
+ expect(reloaded_set).to eql(Hamster.sorted_set(5, 10, 15))
23
+ end
24
+
25
+ it "is still possible to find items by index after loading" do
26
+ expect(reloaded_set[0]).to eq(5)
27
+ expect(reloaded_set[1]).to eq(10)
28
+ expect(reloaded_set[2]).to eq(15)
29
+ expect(reloaded_set.size).to eq(3)
30
+ end
31
+
32
+ it "raises a TypeError if set has a custom sort order" do
33
+ # this is because comparator block can't be serialized
34
+ -> { Marshal.dump(Hamster.sorted_set(1, 2, 3) { |x| -x }) }.should raise_error(TypeError)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,22 @@
1
+ require "spec_helper"
2
+ require "hamster/sorted_set"
3
+
4
+ describe Hamster::SortedSet do
5
+ [:minimum, :min].each do |method|
6
+ describe "##{method}" do
7
+ [
8
+ [[], nil],
9
+ [["A"], "A"],
10
+ [%w[Ichi Ni San], "Ichi"],
11
+ [[1,2,3,4,5], 1],
12
+ [[0, -0.0, 2.2, -4, -4.2], -4.2],
13
+ ].each do |values, expected|
14
+ context "on #{values.inspect}" do
15
+ it "returns #{expected.inspect}" do
16
+ Hamster.sorted_set(*values).send(method).should == expected
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,52 @@
1
+ require "spec_helper"
2
+ require "hamster/sorted_set"
3
+
4
+ describe Hamster::SortedSet do
5
+ describe ".new" do
6
+ it "accepts a single enumerable argument and creates a new sorted set" do
7
+ sorted_set = Hamster::SortedSet.new([1,2,3])
8
+ sorted_set.size.should be(3)
9
+ sorted_set[0].should be(1)
10
+ sorted_set[1].should be(2)
11
+ sorted_set[2].should be(3)
12
+ end
13
+
14
+ it "also works with a Range" do
15
+ sorted_set = Hamster::SortedSet.new(1..3)
16
+ sorted_set.size.should be(3)
17
+ sorted_set[0].should be(1)
18
+ sorted_set[1].should be(2)
19
+ sorted_set[2].should be(3)
20
+ end
21
+
22
+ it "is amenable to overriding of #initialize" do
23
+ class SnazzySortedSet < Hamster::SortedSet
24
+ def initialize
25
+ super(['SNAZZY!!!'])
26
+ end
27
+ end
28
+
29
+ sorted_set = SnazzySortedSet.new
30
+ sorted_set.size.should be(1)
31
+ sorted_set.to_a.should == ['SNAZZY!!!']
32
+ end
33
+
34
+ context "from a subclass" do
35
+ it "returns a frozen instance of the subclass" do
36
+ subclass = Class.new(Hamster::SortedSet)
37
+ instance = subclass.new(["some", "values"])
38
+ instance.class.should be subclass
39
+ instance.frozen?.should be true
40
+ end
41
+ end
42
+ end
43
+
44
+ describe ".[]" do
45
+ it "accepts a variable number of items and creates a new sorted set" do
46
+ sorted_set = Hamster::SortedSet['a', 'b']
47
+ sorted_set.size.should be(2)
48
+ sorted_set[0].should == 'a'
49
+ sorted_set[1].should == 'b'
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,29 @@
1
+ require "spec_helper"
2
+ require "hamster/sorted_set"
3
+
4
+ describe Hamster::SortedSet do
5
+ describe "#reverse_each" do
6
+ context "with no block" do
7
+ let(:sorted_set) { Hamster.sorted_set("A", "B", "C") }
8
+
9
+ it "returns an Enumerator" do
10
+ sorted_set.reverse_each.class.should be(Enumerator)
11
+ sorted_set.reverse_each.to_a.should eql(sorted_set.to_a.reverse)
12
+ end
13
+ end
14
+
15
+ context "with a block" do
16
+ let(:sorted_set) { Hamster::SortedSet.new((1..1025).to_a) }
17
+
18
+ it "returns self" do
19
+ sorted_set.reverse_each {}.should be(sorted_set)
20
+ end
21
+
22
+ it "iterates over the items in order" do
23
+ items = []
24
+ sorted_set.reverse_each { |item| items << item }
25
+ items.should == (1..1025).to_a.reverse
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+ require "hamster/sorted_set"
3
+
4
+ describe Hamster::SortedSet do
5
+ describe "#sample" do
6
+ let(:sorted_set) { Hamster::SortedSet.new(1..10) }
7
+
8
+ it "returns a randomly chosen item" do
9
+ chosen = 100.times.map { sorted_set.sample }
10
+ chosen.each { |item| sorted_set.include?(item).should == true }
11
+ sorted_set.each { |item| chosen.include?(item).should == true }
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+ require "hamster/sorted_set"
3
+
4
+ describe Hamster::SortedSet do
5
+ [:size, :length].each do |method|
6
+ describe "##{method}" do
7
+ [
8
+ [[], 0],
9
+ [["A"], 1],
10
+ [%w[A B C], 3],
11
+ ].each do |values, result|
12
+ it "returns #{result} for #{values.inspect}" do
13
+ Hamster.sorted_set(*values).send(method).should == result
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,241 @@
1
+ require "spec_helper"
2
+ require "hamster/sorted_set"
3
+
4
+ describe Hamster::SortedSet do
5
+ let(:sorted_set) { Hamster.sorted_set(1,2,3,4) }
6
+ let(:big) { Hamster::SortedSet.new(1..10000) }
7
+
8
+ [:slice, :[]].each do |method|
9
+ describe "##{method}" do
10
+ context "when passed a positive integral index" do
11
+ it "returns the element at that index" do
12
+ sorted_set.send(method, 0).should be(1)
13
+ sorted_set.send(method, 1).should be(2)
14
+ sorted_set.send(method, 2).should be(3)
15
+ sorted_set.send(method, 3).should be(4)
16
+ sorted_set.send(method, 4).should be(nil)
17
+ sorted_set.send(method, 10).should be(nil)
18
+
19
+ big.send(method, 0).should be(1)
20
+ big.send(method, 9999).should be(10000)
21
+ end
22
+
23
+ it "leaves the original unchanged" do
24
+ sorted_set.should eql(Hamster.sorted_set(1,2,3,4))
25
+ end
26
+ end
27
+
28
+ context "when passed a negative integral index" do
29
+ it "returns the element which is number (index.abs) counting from the end of the sorted_set" do
30
+ sorted_set.send(method, -1).should be(4)
31
+ sorted_set.send(method, -2).should be(3)
32
+ sorted_set.send(method, -3).should be(2)
33
+ sorted_set.send(method, -4).should be(1)
34
+ sorted_set.send(method, -5).should be(nil)
35
+ sorted_set.send(method, -10).should be(nil)
36
+
37
+ big.send(method, -1).should be(10000)
38
+ big.send(method, -10000).should be(1)
39
+ end
40
+ end
41
+
42
+ context "when passed a positive integral index and count" do
43
+ it "returns 'count' elements starting from 'index'" do
44
+ sorted_set.send(method, 0, 0).should eql(Hamster.sorted_set)
45
+ sorted_set.send(method, 0, 1).should eql(Hamster.sorted_set(1))
46
+ sorted_set.send(method, 0, 2).should eql(Hamster.sorted_set(1,2))
47
+ sorted_set.send(method, 0, 4).should eql(Hamster.sorted_set(1,2,3,4))
48
+ sorted_set.send(method, 0, 6).should eql(Hamster.sorted_set(1,2,3,4))
49
+ sorted_set.send(method, 0, -1).should be_nil
50
+ sorted_set.send(method, 0, -2).should be_nil
51
+ sorted_set.send(method, 0, -4).should be_nil
52
+ sorted_set.send(method, 2, 0).should eql(Hamster.sorted_set)
53
+ sorted_set.send(method, 2, 1).should eql(Hamster.sorted_set(3))
54
+ sorted_set.send(method, 2, 2).should eql(Hamster.sorted_set(3,4))
55
+ sorted_set.send(method, 2, 4).should eql(Hamster.sorted_set(3,4))
56
+ sorted_set.send(method, 2, -1).should be_nil
57
+ sorted_set.send(method, 4, 0).should eql(Hamster.sorted_set)
58
+ sorted_set.send(method, 4, 2).should eql(Hamster.sorted_set)
59
+ sorted_set.send(method, 4, -1).should be_nil
60
+ sorted_set.send(method, 5, 0).should be_nil
61
+ sorted_set.send(method, 5, 2).should be_nil
62
+ sorted_set.send(method, 5, -1).should be_nil
63
+ sorted_set.send(method, 6, 0).should be_nil
64
+ sorted_set.send(method, 6, 2).should be_nil
65
+ sorted_set.send(method, 6, -1).should be_nil
66
+
67
+ big.send(method, 0, 3).should eql(Hamster.sorted_set(1,2,3))
68
+ big.send(method, 1023, 4).should eql(Hamster.sorted_set(1024,1025,1026,1027))
69
+ big.send(method, 1024, 4).should eql(Hamster.sorted_set(1025,1026,1027,1028))
70
+ end
71
+
72
+ it "leaves the original unchanged" do
73
+ sorted_set.should eql(Hamster.sorted_set(1,2,3,4))
74
+ end
75
+ end
76
+
77
+ context "when passed a negative integral index and count" do
78
+ it "returns 'count' elements, starting from index which is number 'index.abs' counting from the end of the array" do
79
+ sorted_set.send(method, -1, 0).should eql(Hamster.sorted_set)
80
+ sorted_set.send(method, -1, 1).should eql(Hamster.sorted_set(4))
81
+ sorted_set.send(method, -1, 2).should eql(Hamster.sorted_set(4))
82
+ sorted_set.send(method, -1, -1).should be_nil
83
+ sorted_set.send(method, -2, 0).should eql(Hamster.sorted_set)
84
+ sorted_set.send(method, -2, 1).should eql(Hamster.sorted_set(3))
85
+ sorted_set.send(method, -2, 2).should eql(Hamster.sorted_set(3,4))
86
+ sorted_set.send(method, -2, 4).should eql(Hamster.sorted_set(3,4))
87
+ sorted_set.send(method, -2, -1).should be_nil
88
+ sorted_set.send(method, -4, 0).should eql(Hamster.sorted_set)
89
+ sorted_set.send(method, -4, 1).should eql(Hamster.sorted_set(1))
90
+ sorted_set.send(method, -4, 2).should eql(Hamster.sorted_set(1,2))
91
+ sorted_set.send(method, -4, 4).should eql(Hamster.sorted_set(1,2,3,4))
92
+ sorted_set.send(method, -4, 6).should eql(Hamster.sorted_set(1,2,3,4))
93
+ sorted_set.send(method, -4, -1).should be_nil
94
+ sorted_set.send(method, -5, 0).should be_nil
95
+ sorted_set.send(method, -5, 1).should be_nil
96
+ sorted_set.send(method, -5, 10).should be_nil
97
+ sorted_set.send(method, -5, -1).should be_nil
98
+
99
+ big.send(method, -1, 1).should eql(Hamster.sorted_set(10000))
100
+ big.send(method, -1, 2).should eql(Hamster.sorted_set(10000))
101
+ big.send(method, -6, 2).should eql(Hamster.sorted_set(9995,9996))
102
+ end
103
+ end
104
+
105
+ context "when passed a Range" do
106
+ it "returns the elements whose indexes are within the given Range" do
107
+ sorted_set.send(method, 0..-1).should eql(Hamster.sorted_set(1,2,3,4))
108
+ sorted_set.send(method, 0..-10).should eql(Hamster.sorted_set)
109
+ sorted_set.send(method, 0..0).should eql(Hamster.sorted_set(1))
110
+ sorted_set.send(method, 0..1).should eql(Hamster.sorted_set(1,2))
111
+ sorted_set.send(method, 0..2).should eql(Hamster.sorted_set(1,2,3))
112
+ sorted_set.send(method, 0..3).should eql(Hamster.sorted_set(1,2,3,4))
113
+ sorted_set.send(method, 0..4).should eql(Hamster.sorted_set(1,2,3,4))
114
+ sorted_set.send(method, 0..10).should eql(Hamster.sorted_set(1,2,3,4))
115
+ sorted_set.send(method, 2..-10).should eql(Hamster.sorted_set)
116
+ sorted_set.send(method, 2..0).should eql(Hamster.sorted_set)
117
+ sorted_set.send(method, 2..2).should eql(Hamster.sorted_set(3))
118
+ sorted_set.send(method, 2..3).should eql(Hamster.sorted_set(3,4))
119
+ sorted_set.send(method, 2..4).should eql(Hamster.sorted_set(3,4))
120
+ sorted_set.send(method, 3..0).should eql(Hamster.sorted_set)
121
+ sorted_set.send(method, 3..3).should eql(Hamster.sorted_set(4))
122
+ sorted_set.send(method, 3..4).should eql(Hamster.sorted_set(4))
123
+ sorted_set.send(method, 4..0).should eql(Hamster.sorted_set)
124
+ sorted_set.send(method, 4..4).should eql(Hamster.sorted_set)
125
+ sorted_set.send(method, 4..5).should eql(Hamster.sorted_set)
126
+ sorted_set.send(method, 5..0).should be_nil
127
+ sorted_set.send(method, 5..5).should be_nil
128
+ sorted_set.send(method, 5..6).should be_nil
129
+
130
+ big.send(method, 159..162).should eql(Hamster.sorted_set(160,161,162,163))
131
+ big.send(method, 160..162).should eql(Hamster.sorted_set(161,162,163))
132
+ big.send(method, 161..162).should eql(Hamster.sorted_set(162,163))
133
+ big.send(method, 9999..10100).should eql(Hamster.sorted_set(10000))
134
+ big.send(method, 10000..10100).should eql(Hamster.sorted_set)
135
+ big.send(method, 10001..10100).should be_nil
136
+
137
+ sorted_set.send(method, 0...-1).should eql(Hamster.sorted_set(1,2,3))
138
+ sorted_set.send(method, 0...-10).should eql(Hamster.sorted_set)
139
+ sorted_set.send(method, 0...0).should eql(Hamster.sorted_set)
140
+ sorted_set.send(method, 0...1).should eql(Hamster.sorted_set(1))
141
+ sorted_set.send(method, 0...2).should eql(Hamster.sorted_set(1,2))
142
+ sorted_set.send(method, 0...3).should eql(Hamster.sorted_set(1,2,3))
143
+ sorted_set.send(method, 0...4).should eql(Hamster.sorted_set(1,2,3,4))
144
+ sorted_set.send(method, 0...10).should eql(Hamster.sorted_set(1,2,3,4))
145
+ sorted_set.send(method, 2...-10).should eql(Hamster.sorted_set)
146
+ sorted_set.send(method, 2...0).should eql(Hamster.sorted_set)
147
+ sorted_set.send(method, 2...2).should eql(Hamster.sorted_set)
148
+ sorted_set.send(method, 2...3).should eql(Hamster.sorted_set(3))
149
+ sorted_set.send(method, 2...4).should eql(Hamster.sorted_set(3,4))
150
+ sorted_set.send(method, 3...0).should eql(Hamster.sorted_set)
151
+ sorted_set.send(method, 3...3).should eql(Hamster.sorted_set)
152
+ sorted_set.send(method, 3...4).should eql(Hamster.sorted_set(4))
153
+ sorted_set.send(method, 4...0).should eql(Hamster.sorted_set)
154
+ sorted_set.send(method, 4...4).should eql(Hamster.sorted_set)
155
+ sorted_set.send(method, 4...5).should eql(Hamster.sorted_set)
156
+ sorted_set.send(method, 5...0).should be_nil
157
+ sorted_set.send(method, 5...5).should be_nil
158
+ sorted_set.send(method, 5...6).should be_nil
159
+
160
+ big.send(method, 159...162).should eql(Hamster.sorted_set(160,161,162))
161
+ big.send(method, 160...162).should eql(Hamster.sorted_set(161,162))
162
+ big.send(method, 161...162).should eql(Hamster.sorted_set(162))
163
+ big.send(method, 9999...10100).should eql(Hamster.sorted_set(10000))
164
+ big.send(method, 10000...10100).should eql(Hamster.sorted_set)
165
+ big.send(method, 10001...10100).should be_nil
166
+
167
+ sorted_set.send(method, -1..-1).should eql(Hamster.sorted_set(4))
168
+ sorted_set.send(method, -1...-1).should eql(Hamster.sorted_set)
169
+ sorted_set.send(method, -1..3).should eql(Hamster.sorted_set(4))
170
+ sorted_set.send(method, -1...3).should eql(Hamster.sorted_set)
171
+ sorted_set.send(method, -1..4).should eql(Hamster.sorted_set(4))
172
+ sorted_set.send(method, -1...4).should eql(Hamster.sorted_set(4))
173
+ sorted_set.send(method, -1..10).should eql(Hamster.sorted_set(4))
174
+ sorted_set.send(method, -1...10).should eql(Hamster.sorted_set(4))
175
+ sorted_set.send(method, -1..0).should eql(Hamster.sorted_set)
176
+ sorted_set.send(method, -1..-4).should eql(Hamster.sorted_set)
177
+ sorted_set.send(method, -1...-4).should eql(Hamster.sorted_set)
178
+ sorted_set.send(method, -1..-6).should eql(Hamster.sorted_set)
179
+ sorted_set.send(method, -1...-6).should eql(Hamster.sorted_set)
180
+ sorted_set.send(method, -2..-2).should eql(Hamster.sorted_set(3))
181
+ sorted_set.send(method, -2...-2).should eql(Hamster.sorted_set)
182
+ sorted_set.send(method, -2..-1).should eql(Hamster.sorted_set(3,4))
183
+ sorted_set.send(method, -2...-1).should eql(Hamster.sorted_set(3))
184
+ sorted_set.send(method, -2..10).should eql(Hamster.sorted_set(3,4))
185
+ sorted_set.send(method, -2...10).should eql(Hamster.sorted_set(3,4))
186
+
187
+ big.send(method, -1..-1).should eql(Hamster.sorted_set(10000))
188
+ big.send(method, -1..9999).should eql(Hamster.sorted_set(10000))
189
+ big.send(method, -1...9999).should eql(Hamster.sorted_set)
190
+ big.send(method, -2...9999).should eql(Hamster.sorted_set(9999))
191
+ big.send(method, -2..-1).should eql(Hamster.sorted_set(9999,10000))
192
+
193
+ sorted_set.send(method, -4..-4).should eql(Hamster.sorted_set(1))
194
+ sorted_set.send(method, -4..-2).should eql(Hamster.sorted_set(1,2,3))
195
+ sorted_set.send(method, -4...-2).should eql(Hamster.sorted_set(1,2))
196
+ sorted_set.send(method, -4..-1).should eql(Hamster.sorted_set(1,2,3,4))
197
+ sorted_set.send(method, -4...-1).should eql(Hamster.sorted_set(1,2,3))
198
+ sorted_set.send(method, -4..3).should eql(Hamster.sorted_set(1,2,3,4))
199
+ sorted_set.send(method, -4...3).should eql(Hamster.sorted_set(1,2,3))
200
+ sorted_set.send(method, -4..4).should eql(Hamster.sorted_set(1,2,3,4))
201
+ sorted_set.send(method, -4...4).should eql(Hamster.sorted_set(1,2,3,4))
202
+ sorted_set.send(method, -4..0).should eql(Hamster.sorted_set(1))
203
+ sorted_set.send(method, -4...0).should eql(Hamster.sorted_set)
204
+ sorted_set.send(method, -4..1).should eql(Hamster.sorted_set(1,2))
205
+ sorted_set.send(method, -4...1).should eql(Hamster.sorted_set(1))
206
+
207
+ sorted_set.send(method, -5..-5).should be_nil
208
+ sorted_set.send(method, -5...-5).should be_nil
209
+ sorted_set.send(method, -5..-4).should be_nil
210
+ sorted_set.send(method, -5..-1).should be_nil
211
+ sorted_set.send(method, -5..10).should be_nil
212
+
213
+ big.send(method, -10001..-1).should be_nil
214
+ end
215
+
216
+ it "leaves the original unchanged" do
217
+ sorted_set.should eql(Hamster.sorted_set(1,2,3,4))
218
+ end
219
+ end
220
+ end
221
+
222
+ context "when passed a subclass of Range" do
223
+ it "works the same as with a Range" do
224
+ subclass = Class.new(Range)
225
+ sorted_set.send(method, subclass.new(1,2)).should eql(Hamster.sorted_set(2,3))
226
+ sorted_set.send(method, subclass.new(-3,-1,true)).should eql(Hamster.sorted_set(2,3))
227
+ end
228
+ end
229
+
230
+ context "on a subclass of SortedSet" do
231
+ it "with index and count or a range, returns an instance of the subclass" do
232
+ subclass = Class.new(Hamster::SortedSet)
233
+ instance = subclass.new([1,2,3])
234
+ instance.send(method, 0, 0).class.should be(subclass)
235
+ instance.send(method, 0, 2).class.should be(subclass)
236
+ instance.send(method, 0..0).class.should be(subclass)
237
+ instance.send(method, 1..-1).class.should be(subclass)
238
+ end
239
+ end
240
+ end
241
+ end