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

Sign up to get free protection for your applications and to get access to all the features.
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,22 @@
1
+ require "spec_helper"
2
+ require "hamster/vector"
3
+
4
+ describe Hamster::Vector do
5
+ describe "#reverse" do
6
+ [
7
+ [[], []],
8
+ [[1], [1]],
9
+ [[1,2], [2,1]],
10
+ [(1..32).to_a, (1..32).to_a.reverse],
11
+ [(1..33).to_a, (1..33).to_a.reverse],
12
+ [(1..100).to_a, (1..100).to_a.reverse],
13
+ [(1..1024).to_a, (1..1024).to_a.reverse]
14
+ ].each do |initial, expected|
15
+ describe "on #{initial}" do
16
+ it "returns #{expected}" do
17
+ Hamster::Vector.new(initial).reverse.should eql(Hamster::Vector.new(expected))
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,37 @@
1
+ require "spec_helper"
2
+ require "hamster/vector"
3
+
4
+ describe Hamster::Vector do
5
+ describe "#rindex" do
6
+ let(:vector) { Hamster.vector(1,2,3,3,2,1) }
7
+
8
+ context "when passed an object present in the vector" do
9
+ it "returns the last index where the object is present" do
10
+ vector.rindex(1).should be(5)
11
+ vector.rindex(2).should be(4)
12
+ vector.rindex(3).should be(3)
13
+ end
14
+ end
15
+
16
+ context "when passed an object not present in the vector" do
17
+ it "returns nil" do
18
+ vector.rindex(0).should be_nil
19
+ vector.rindex(nil).should be_nil
20
+ vector.rindex('string').should be_nil
21
+ end
22
+ end
23
+
24
+ context "with a block" do
25
+ it "returns the last index of an object which the predicate is true for" do
26
+ vector.rindex { |n| n > 2 }.should be(3)
27
+ end
28
+ end
29
+
30
+ context "without an argument OR block" do
31
+ it "returns an Enumerator" do
32
+ vector.rindex.class.should be(Enumerator)
33
+ vector.rindex.each { |n| n > 2 }.should be(3)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,74 @@
1
+ require "spec_helper"
2
+ require "hamster/vector"
3
+
4
+ describe Hamster::Vector do
5
+ describe "#rotate" do
6
+ let(:vector) { Hamster.vector(1,2,3,4,5) }
7
+
8
+ context "when passed no argument" do
9
+ it "returns a new vector with the first element moved to the end" do
10
+ vector.rotate.should eql(Hamster.vector(2,3,4,5,1))
11
+ end
12
+ end
13
+
14
+ context "with an integral argument n" do
15
+ it "returns a new vector with the first (n % size) elements moved to the end" do
16
+ vector.rotate(2).should eql(Hamster.vector(3,4,5,1,2))
17
+ vector.rotate(3).should eql(Hamster.vector(4,5,1,2,3))
18
+ vector.rotate(4).should eql(Hamster.vector(5,1,2,3,4))
19
+ vector.rotate(5).should eql(Hamster.vector(1,2,3,4,5))
20
+ vector.rotate(-1).should eql(Hamster.vector(5,1,2,3,4))
21
+ end
22
+ end
23
+
24
+ context "with a floating-point argument n" do
25
+ it "coerces the argument to integer using to_int" do
26
+ vector.rotate(2.1).should eql(Hamster.vector(3,4,5,1,2))
27
+ end
28
+ end
29
+
30
+ context "with a non-numeric argument" do
31
+ it "raises a TypeError" do
32
+ -> { vector.rotate('hello') }.should raise_error(TypeError)
33
+ end
34
+ end
35
+
36
+ context "with an argument of zero" do
37
+ it "returns self" do
38
+ vector.rotate(0).should be(vector)
39
+ end
40
+ end
41
+
42
+ context "with an argument equal to the vector's size" do
43
+ it "returns self" do
44
+ vector.rotate(5).should be(vector)
45
+ end
46
+ end
47
+
48
+ [31, 32, 33, 1000, 1023, 1024, 1025].each do |size|
49
+ context "on a #{size}-item vector" do
50
+ it "behaves like Array#rotate" do
51
+ array = (1..size).to_a
52
+ vector = V.new(array)
53
+ 10.times do
54
+ offset = rand(size)
55
+ vector.rotate(offset).should == array.rotate(offset)
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ context "from a subclass" do
62
+ it "returns an instance of the subclass" do
63
+ subclass = Class.new(Hamster::Vector)
64
+ instance = subclass.new([1,2,3])
65
+ instance.rotate(2).class.should be(subclass)
66
+ end
67
+ end
68
+
69
+ it "leaves the original unmodified" do
70
+ vector.rotate(3)
71
+ vector.should eql(Hamster.vector(1,2,3,4,5))
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+ require "hamster/vector"
3
+
4
+ describe Hamster::Vector do
5
+ describe "#sample" do
6
+ let(:vector) { Hamster::Vector.new(1..10) }
7
+
8
+ it "returns a randomly chosen item" do
9
+ chosen = 100.times.map { vector.sample }
10
+ chosen.each { |item| vector.include?(item).should == true }
11
+ vector.each { |item| chosen.include?(item).should == true }
12
+ end
13
+ end
14
+ end
@@ -27,18 +27,25 @@ describe Hamster::Vector do
27
27
 
28
28
  it "replaces the value with the result of the block" do
29
29
  result = vector.set(1) { |value| "FLIBBLE" }
30
- result.should == Hamster.vector("A", "FLIBBLE", "C")
30
+ result.should eql(Hamster.vector("A", "FLIBBLE", "C"))
31
31
  end
32
32
 
33
33
  it "supports to_proc methods" do
34
34
  result = vector.set(1, &:downcase)
35
- result.should == Hamster.vector("A", "b", "C")
35
+ result.should eql(Hamster.vector("A", "b", "C"))
36
36
  end
37
37
  end
38
38
 
39
- context "outside the absolute bounds of the vector" do
39
+ context "just past the end of the vector" do
40
+ it "passes nil to the block and adds a new value" do
41
+ result = vector.set(3) { |value| value.should be_nil; "D" }
42
+ result.should eql(Hamster.vector("A", "B", "C", "D"))
43
+ end
44
+ end
45
+
46
+ context "further outside the bounds of the vector" do
40
47
  it "raises an error" do
41
- expect { vector.set(vector.size) {} }.to raise_error
48
+ expect { vector.set(4) {} }.to raise_error
42
49
  end
43
50
  end
44
51
  end
@@ -51,12 +58,12 @@ describe Hamster::Vector do
51
58
 
52
59
  it "replaces the value with the result of the block" do
53
60
  result = vector.set(-2) { |value| "FLIBBLE" }
54
- result.should == Hamster.vector("A", "FLIBBLE", "C")
61
+ result.should eql(Hamster.vector("A", "FLIBBLE", "C"))
55
62
  end
56
63
 
57
64
  it "supports to_proc methods" do
58
65
  result = vector.set(-2, &:downcase)
59
- result.should == Hamster.vector("A", "b", "C")
66
+ result.should eql(Hamster.vector("A", "b", "C"))
60
67
  end
61
68
  end
62
69
 
@@ -74,17 +81,24 @@ describe Hamster::Vector do
74
81
  let(:set) { vector.set(1, "FLIBBLE") }
75
82
 
76
83
  it "preserves the original" do
77
- vector.should == Hamster.vector("A", "B", "C")
84
+ vector.should eql(Hamster.vector("A", "B", "C"))
78
85
  end
79
86
 
80
87
  it "sets the new value at the specified index" do
81
- set.should == Hamster.vector("A", "FLIBBLE", "C")
88
+ set.should eql(Hamster.vector("A", "FLIBBLE", "C"))
89
+ end
90
+ end
91
+
92
+ context "just past the end of the vector" do
93
+ it "adds a new value" do
94
+ result = vector.set(3, "FLIBBLE")
95
+ result.should eql(Hamster.vector("A", "B", "C", "FLIBBLE"))
82
96
  end
83
97
  end
84
98
 
85
99
  context "outside the absolute bounds of the vector" do
86
100
  it "raises an error" do
87
- expect { vector.set(vector.size, "FLIBBLE") }.to raise_error
101
+ expect { vector.set(4, "FLIBBLE") }.to raise_error
88
102
  end
89
103
  end
90
104
  end
@@ -94,11 +108,11 @@ describe Hamster::Vector do
94
108
 
95
109
  it "preserves the original" do
96
110
  set
97
- vector.should == Hamster.vector("A", "B", "C")
111
+ vector.should eql(Hamster.vector("A", "B", "C"))
98
112
  end
99
113
 
100
114
  it "sets the new value at the specified index" do
101
- set.should == Hamster.vector("A", "FLIBBLE", "C")
115
+ set.should eql(Hamster.vector("A", "FLIBBLE", "C"))
102
116
  end
103
117
  end
104
118
 
@@ -112,9 +126,29 @@ describe Hamster::Vector do
112
126
 
113
127
  context "from a subclass" do
114
128
  it "returns an instance of the subclass" do
115
- @subclass = Class.new(Hamster::Vector)
116
- @instance = @subclass[1,2,3]
117
- @instance.set(1, 2.5).class.should be(@subclass)
129
+ subclass = Class.new(Hamster::Vector)
130
+ instance = subclass[1,2,3]
131
+ instance.set(1, 2.5).class.should be(subclass)
132
+ end
133
+ end
134
+
135
+ [10, 31, 32, 33, 1000, 1023, 1024, 1025, 2000].each do |size|
136
+ context "on a #{size}-item vector" do
137
+ it "works correctly" do
138
+ array = (1..size).to_a
139
+ vector = V.new(array)
140
+
141
+ [0, 1, 10, 31, 32, 33, 100, 500, 1000, 1023, 1024, 1025, 1998, 1999].select { |n| n < size }.each do |i|
142
+ value = rand(10000)
143
+ array[i] = value
144
+ vector = vector.set(i, value)
145
+ vector[i].should be(value)
146
+ end
147
+
148
+ 0.upto(size-1) do |i|
149
+ vector.get(i).should == array[i]
150
+ end
151
+ end
118
152
  end
119
153
  end
120
154
  end
@@ -0,0 +1,28 @@
1
+ require "spec_helper"
2
+ require "hamster/vector"
3
+
4
+ describe Hamster::Vector do
5
+ describe "#shift" do
6
+ [
7
+ [[], []],
8
+ [["A"], []],
9
+ [%w[A B C], %w[B C]],
10
+ [1..31, 2..31],
11
+ [1..32, 2..32],
12
+ [1..33, 2..33]
13
+ ].each do |values, expected|
14
+ context "on #{values.inspect}" do
15
+ let(:vector) { Hamster.vector(*values) }
16
+
17
+ it "preserves the original" do
18
+ vector.shift
19
+ vector.should eql(Hamster.vector(*values))
20
+ end
21
+
22
+ it "returns #{expected.inspect}" do
23
+ vector.shift.should eql(Hamster.vector(*expected))
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+ require "hamster/vector"
3
+
4
+ describe Hamster::Vector do
5
+ describe "#shuffle" do
6
+ let(:vector) { Hamster.vector(1,2,3,4) }
7
+
8
+ it "returns the same values, in a usually different order" do
9
+ different = false
10
+ 10.times do
11
+ shuffled = vector.shuffle
12
+ shuffled.sort.should eql(vector)
13
+ different ||= (shuffled != vector)
14
+ end
15
+ different.should be(true)
16
+ end
17
+
18
+ it "leaves the original unchanged" do
19
+ vector.shuffle
20
+ vector.should eql(Hamster.vector(1,2,3,4))
21
+ end
22
+
23
+ context "from a subclass" do
24
+ it "returns an instance of the subclass" do
25
+ subclass = Class.new(Hamster::Vector)
26
+ instance = subclass.new([1,2,3])
27
+ instance.shuffle.class.should be(subclass)
28
+ end
29
+ end
30
+
31
+ [32, 33, 1023, 1024, 1025].each do |size|
32
+ context "on a #{size}-item vector" do
33
+ it "works correctly" do
34
+ vector = V.new(1..size)
35
+ shuffled = vector.shuffle
36
+ shuffled = vector.shuffle while shuffled.eql?(vector) # in case we get the same
37
+ vector.should eql(V.new(1..size))
38
+ shuffled.size.should == vector.size
39
+ shuffled.sort.should eql(vector)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,241 @@
1
+ require "spec_helper"
2
+ require "hamster/vector"
3
+
4
+ describe Hamster::Vector do
5
+ let(:vector) { Hamster.vector(1,2,3,4) }
6
+ let(:big) { Hamster::Vector.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
+ vector.send(method, 0).should be(1)
13
+ vector.send(method, 1).should be(2)
14
+ vector.send(method, 2).should be(3)
15
+ vector.send(method, 3).should be(4)
16
+ vector.send(method, 4).should be(nil)
17
+ vector.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
+ vector.should eql(Hamster.vector(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 vector" do
30
+ vector.send(method, -1).should be(4)
31
+ vector.send(method, -2).should be(3)
32
+ vector.send(method, -3).should be(2)
33
+ vector.send(method, -4).should be(1)
34
+ vector.send(method, -5).should be(nil)
35
+ vector.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
+ vector.send(method, 0, 0).should eql(Hamster.vector)
45
+ vector.send(method, 0, 1).should eql(Hamster.vector(1))
46
+ vector.send(method, 0, 2).should eql(Hamster.vector(1,2))
47
+ vector.send(method, 0, 4).should eql(Hamster.vector(1,2,3,4))
48
+ vector.send(method, 0, 6).should eql(Hamster.vector(1,2,3,4))
49
+ vector.send(method, 0, -1).should be_nil
50
+ vector.send(method, 0, -2).should be_nil
51
+ vector.send(method, 0, -4).should be_nil
52
+ vector.send(method, 2, 0).should eql(Hamster.vector)
53
+ vector.send(method, 2, 1).should eql(Hamster.vector(3))
54
+ vector.send(method, 2, 2).should eql(Hamster.vector(3,4))
55
+ vector.send(method, 2, 4).should eql(Hamster.vector(3,4))
56
+ vector.send(method, 2, -1).should be_nil
57
+ vector.send(method, 4, 0).should eql(Hamster.vector)
58
+ vector.send(method, 4, 2).should eql(Hamster.vector)
59
+ vector.send(method, 4, -1).should be_nil
60
+ vector.send(method, 5, 0).should be_nil
61
+ vector.send(method, 5, 2).should be_nil
62
+ vector.send(method, 5, -1).should be_nil
63
+ vector.send(method, 6, 0).should be_nil
64
+ vector.send(method, 6, 2).should be_nil
65
+ vector.send(method, 6, -1).should be_nil
66
+
67
+ big.send(method, 0, 3).should eql(Hamster.vector(1,2,3))
68
+ big.send(method, 1023, 4).should eql(Hamster.vector(1024,1025,1026,1027))
69
+ big.send(method, 1024, 4).should eql(Hamster.vector(1025,1026,1027,1028))
70
+ end
71
+
72
+ it "leaves the original unchanged" do
73
+ vector.should eql(Hamster.vector(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
+ vector.send(method, -1, 0).should eql(Hamster.vector)
80
+ vector.send(method, -1, 1).should eql(Hamster.vector(4))
81
+ vector.send(method, -1, 2).should eql(Hamster.vector(4))
82
+ vector.send(method, -1, -1).should be_nil
83
+ vector.send(method, -2, 0).should eql(Hamster.vector)
84
+ vector.send(method, -2, 1).should eql(Hamster.vector(3))
85
+ vector.send(method, -2, 2).should eql(Hamster.vector(3,4))
86
+ vector.send(method, -2, 4).should eql(Hamster.vector(3,4))
87
+ vector.send(method, -2, -1).should be_nil
88
+ vector.send(method, -4, 0).should eql(Hamster.vector)
89
+ vector.send(method, -4, 1).should eql(Hamster.vector(1))
90
+ vector.send(method, -4, 2).should eql(Hamster.vector(1,2))
91
+ vector.send(method, -4, 4).should eql(Hamster.vector(1,2,3,4))
92
+ vector.send(method, -4, 6).should eql(Hamster.vector(1,2,3,4))
93
+ vector.send(method, -4, -1).should be_nil
94
+ vector.send(method, -5, 0).should be_nil
95
+ vector.send(method, -5, 1).should be_nil
96
+ vector.send(method, -5, 10).should be_nil
97
+ vector.send(method, -5, -1).should be_nil
98
+
99
+ big.send(method, -1, 1).should eql(Hamster.vector(10000))
100
+ big.send(method, -1, 2).should eql(Hamster.vector(10000))
101
+ big.send(method, -6, 2).should eql(Hamster.vector(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
+ vector.send(method, 0..-1).should eql(Hamster.vector(1,2,3,4))
108
+ vector.send(method, 0..-10).should eql(Hamster.vector)
109
+ vector.send(method, 0..0).should eql(Hamster.vector(1))
110
+ vector.send(method, 0..1).should eql(Hamster.vector(1,2))
111
+ vector.send(method, 0..2).should eql(Hamster.vector(1,2,3))
112
+ vector.send(method, 0..3).should eql(Hamster.vector(1,2,3,4))
113
+ vector.send(method, 0..4).should eql(Hamster.vector(1,2,3,4))
114
+ vector.send(method, 0..10).should eql(Hamster.vector(1,2,3,4))
115
+ vector.send(method, 2..-10).should eql(Hamster.vector)
116
+ vector.send(method, 2..0).should eql(Hamster.vector)
117
+ vector.send(method, 2..2).should eql(Hamster.vector(3))
118
+ vector.send(method, 2..3).should eql(Hamster.vector(3,4))
119
+ vector.send(method, 2..4).should eql(Hamster.vector(3,4))
120
+ vector.send(method, 3..0).should eql(Hamster.vector)
121
+ vector.send(method, 3..3).should eql(Hamster.vector(4))
122
+ vector.send(method, 3..4).should eql(Hamster.vector(4))
123
+ vector.send(method, 4..0).should eql(Hamster.vector)
124
+ vector.send(method, 4..4).should eql(Hamster.vector)
125
+ vector.send(method, 4..5).should eql(Hamster.vector)
126
+ vector.send(method, 5..0).should be_nil
127
+ vector.send(method, 5..5).should be_nil
128
+ vector.send(method, 5..6).should be_nil
129
+
130
+ big.send(method, 159..162).should eql(Hamster.vector(160,161,162,163))
131
+ big.send(method, 160..162).should eql(Hamster.vector(161,162,163))
132
+ big.send(method, 161..162).should eql(Hamster.vector(162,163))
133
+ big.send(method, 9999..10100).should eql(Hamster.vector(10000))
134
+ big.send(method, 10000..10100).should eql(Hamster.vector)
135
+ big.send(method, 10001..10100).should be_nil
136
+
137
+ vector.send(method, 0...-1).should eql(Hamster.vector(1,2,3))
138
+ vector.send(method, 0...-10).should eql(Hamster.vector)
139
+ vector.send(method, 0...0).should eql(Hamster.vector)
140
+ vector.send(method, 0...1).should eql(Hamster.vector(1))
141
+ vector.send(method, 0...2).should eql(Hamster.vector(1,2))
142
+ vector.send(method, 0...3).should eql(Hamster.vector(1,2,3))
143
+ vector.send(method, 0...4).should eql(Hamster.vector(1,2,3,4))
144
+ vector.send(method, 0...10).should eql(Hamster.vector(1,2,3,4))
145
+ vector.send(method, 2...-10).should eql(Hamster.vector)
146
+ vector.send(method, 2...0).should eql(Hamster.vector)
147
+ vector.send(method, 2...2).should eql(Hamster.vector)
148
+ vector.send(method, 2...3).should eql(Hamster.vector(3))
149
+ vector.send(method, 2...4).should eql(Hamster.vector(3,4))
150
+ vector.send(method, 3...0).should eql(Hamster.vector)
151
+ vector.send(method, 3...3).should eql(Hamster.vector)
152
+ vector.send(method, 3...4).should eql(Hamster.vector(4))
153
+ vector.send(method, 4...0).should eql(Hamster.vector)
154
+ vector.send(method, 4...4).should eql(Hamster.vector)
155
+ vector.send(method, 4...5).should eql(Hamster.vector)
156
+ vector.send(method, 5...0).should be_nil
157
+ vector.send(method, 5...5).should be_nil
158
+ vector.send(method, 5...6).should be_nil
159
+
160
+ big.send(method, 159...162).should eql(Hamster.vector(160,161,162))
161
+ big.send(method, 160...162).should eql(Hamster.vector(161,162))
162
+ big.send(method, 161...162).should eql(Hamster.vector(162))
163
+ big.send(method, 9999...10100).should eql(Hamster.vector(10000))
164
+ big.send(method, 10000...10100).should eql(Hamster.vector)
165
+ big.send(method, 10001...10100).should be_nil
166
+
167
+ vector.send(method, -1..-1).should eql(Hamster.vector(4))
168
+ vector.send(method, -1...-1).should eql(Hamster.vector)
169
+ vector.send(method, -1..3).should eql(Hamster.vector(4))
170
+ vector.send(method, -1...3).should eql(Hamster.vector)
171
+ vector.send(method, -1..4).should eql(Hamster.vector(4))
172
+ vector.send(method, -1...4).should eql(Hamster.vector(4))
173
+ vector.send(method, -1..10).should eql(Hamster.vector(4))
174
+ vector.send(method, -1...10).should eql(Hamster.vector(4))
175
+ vector.send(method, -1..0).should eql(Hamster.vector)
176
+ vector.send(method, -1..-4).should eql(Hamster.vector)
177
+ vector.send(method, -1...-4).should eql(Hamster.vector)
178
+ vector.send(method, -1..-6).should eql(Hamster.vector)
179
+ vector.send(method, -1...-6).should eql(Hamster.vector)
180
+ vector.send(method, -2..-2).should eql(Hamster.vector(3))
181
+ vector.send(method, -2...-2).should eql(Hamster.vector)
182
+ vector.send(method, -2..-1).should eql(Hamster.vector(3,4))
183
+ vector.send(method, -2...-1).should eql(Hamster.vector(3))
184
+ vector.send(method, -2..10).should eql(Hamster.vector(3,4))
185
+ vector.send(method, -2...10).should eql(Hamster.vector(3,4))
186
+
187
+ big.send(method, -1..-1).should eql(Hamster.vector(10000))
188
+ big.send(method, -1..9999).should eql(Hamster.vector(10000))
189
+ big.send(method, -1...9999).should eql(Hamster.vector)
190
+ big.send(method, -2...9999).should eql(Hamster.vector(9999))
191
+ big.send(method, -2..-1).should eql(Hamster.vector(9999,10000))
192
+
193
+ vector.send(method, -4..-4).should eql(Hamster.vector(1))
194
+ vector.send(method, -4..-2).should eql(Hamster.vector(1,2,3))
195
+ vector.send(method, -4...-2).should eql(Hamster.vector(1,2))
196
+ vector.send(method, -4..-1).should eql(Hamster.vector(1,2,3,4))
197
+ vector.send(method, -4...-1).should eql(Hamster.vector(1,2,3))
198
+ vector.send(method, -4..3).should eql(Hamster.vector(1,2,3,4))
199
+ vector.send(method, -4...3).should eql(Hamster.vector(1,2,3))
200
+ vector.send(method, -4..4).should eql(Hamster.vector(1,2,3,4))
201
+ vector.send(method, -4...4).should eql(Hamster.vector(1,2,3,4))
202
+ vector.send(method, -4..0).should eql(Hamster.vector(1))
203
+ vector.send(method, -4...0).should eql(Hamster.vector)
204
+ vector.send(method, -4..1).should eql(Hamster.vector(1,2))
205
+ vector.send(method, -4...1).should eql(Hamster.vector(1))
206
+
207
+ vector.send(method, -5..-5).should be_nil
208
+ vector.send(method, -5...-5).should be_nil
209
+ vector.send(method, -5..-4).should be_nil
210
+ vector.send(method, -5..-1).should be_nil
211
+ vector.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
+ vector.should eql(Hamster.vector(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
+ vector.send(method, subclass.new(1,2)).should eql(Hamster.vector(2,3))
226
+ vector.send(method, subclass.new(-3,-1,true)).should eql(Hamster.vector(2,3))
227
+ end
228
+ end
229
+
230
+ context "on a subclass of Vector" do
231
+ it "with index and count or a range, returns an instance of the subclass" do
232
+ subclass = Class.new(Hamster::Vector)
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