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/list"
3
+
4
+ describe Hamster::List do
5
+ describe "#rotate" do
6
+ let(:list) { Hamster.list(1,2,3,4,5) }
7
+
8
+ context "when passed no argument" do
9
+ it "returns a new list with the first element moved to the end" do
10
+ list.rotate.should eql(Hamster.list(2,3,4,5,1))
11
+ end
12
+ end
13
+
14
+ context "with an integral argument n" do
15
+ it "returns a new list with the first (n % size) elements moved to the end" do
16
+ list.rotate(2).should eql(Hamster.list(3,4,5,1,2))
17
+ list.rotate(3).should eql(Hamster.list(4,5,1,2,3))
18
+ list.rotate(4).should eql(Hamster.list(5,1,2,3,4))
19
+ list.rotate(5).should eql(Hamster.list(1,2,3,4,5))
20
+ list.rotate(-1).should eql(Hamster.list(5,1,2,3,4))
21
+ end
22
+ end
23
+
24
+ context "with a non-numeric argument" do
25
+ it "raises a TypeError" do
26
+ -> { list.rotate('hello') }.should raise_error(TypeError)
27
+ end
28
+ end
29
+
30
+ context "with an argument of zero (or one evenly divisible by list length)" do
31
+ it "it returns self" do
32
+ list.rotate(0).should be(list)
33
+ list.rotate(5).should be(list)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+ require "hamster/list"
3
+
4
+ describe Hamster::List do
5
+ describe "#sample" do
6
+ let(:list) { Hamster.list(*(1..10)) }
7
+
8
+ it "returns a randomly chosen item" do
9
+ chosen = 100.times.map { list.sample }
10
+ chosen.each { |item| list.include?(item).should == true }
11
+ list.each { |item| chosen.include?(item).should == true }
12
+ end
13
+ end
14
+ end
@@ -26,8 +26,9 @@ describe Hamster::List do
26
26
  context "without a block" do
27
27
  let(:select) { list.select }
28
28
 
29
- it "returns itself" do
30
- expect(select).to eq(list)
29
+ it "returns an Enumerator" do
30
+ expect(select.class).to be(Enumerator)
31
+ expect(select.each { |item| item == item.upcase }).to eq(selected_list)
31
32
  end
32
33
  end
33
34
  end
@@ -4,13 +4,9 @@ require "hamster/list"
4
4
  describe Hamster::List do
5
5
  [:size, :length].each do |method|
6
6
  describe "##{method}" do
7
- describe "on a really big list" do
8
- before do
9
- @list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
10
- end
11
-
7
+ context "on a really big list" do
12
8
  it "doesn't run out of stack" do
13
- -> { @list.size }.should_not raise_error
9
+ -> { Hamster.interval(0, STACK_OVERFLOW_DEPTH).size }.should_not raise_error
14
10
  end
15
11
  end
16
12
 
@@ -19,14 +15,9 @@ describe Hamster::List do
19
15
  [["A"], 1],
20
16
  [%w[A B C], 3],
21
17
  ].each do |values, expected|
22
-
23
- describe "on #{values.inspect}" do
24
- before do
25
- @list = Hamster.list(*values)
26
- end
27
-
18
+ context "on #{values.inspect}" do
28
19
  it "returns #{expected.inspect}" do
29
- @list.send(method).should == expected
20
+ Hamster.list(*values).send(method).should == expected
30
21
  end
31
22
  end
32
23
  end
@@ -0,0 +1,230 @@
1
+ require "spec_helper"
2
+ require "hamster/list"
3
+
4
+ describe Hamster::List do
5
+ let(:list) { Hamster.list(1,2,3,4) }
6
+ let(:big) { Hamster.list(*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
+ list.send(method, 0).should be(1)
13
+ list.send(method, 1).should be(2)
14
+ list.send(method, 2).should be(3)
15
+ list.send(method, 3).should be(4)
16
+ list.send(method, 4).should be(nil)
17
+ list.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
+ list.should eql(Hamster.list(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 list" do
30
+ list.send(method, -1).should be(4)
31
+ list.send(method, -2).should be(3)
32
+ list.send(method, -3).should be(2)
33
+ list.send(method, -4).should be(1)
34
+ list.send(method, -5).should be(nil)
35
+ list.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
+ list.send(method, 0, 0).should eql(Hamster.list)
45
+ list.send(method, 0, 1).should eql(Hamster.list(1))
46
+ list.send(method, 0, 2).should eql(Hamster.list(1,2))
47
+ list.send(method, 0, 4).should eql(Hamster.list(1,2,3,4))
48
+ list.send(method, 0, 6).should eql(Hamster.list(1,2,3,4))
49
+ list.send(method, 0, -1).should be_nil
50
+ list.send(method, 0, -2).should be_nil
51
+ list.send(method, 0, -4).should be_nil
52
+ list.send(method, 2, 0).should eql(Hamster.list)
53
+ list.send(method, 2, 1).should eql(Hamster.list(3))
54
+ list.send(method, 2, 2).should eql(Hamster.list(3,4))
55
+ list.send(method, 2, 4).should eql(Hamster.list(3,4))
56
+ list.send(method, 2, -1).should be_nil
57
+ list.send(method, 4, 0).should eql(Hamster.list)
58
+ list.send(method, 4, 2).should eql(Hamster.list)
59
+ list.send(method, 4, -1).should be_nil
60
+ list.send(method, 5, 0).should be_nil
61
+ list.send(method, 5, 2).should be_nil
62
+ list.send(method, 5, -1).should be_nil
63
+ list.send(method, 6, 0).should be_nil
64
+ list.send(method, 6, 2).should be_nil
65
+ list.send(method, 6, -1).should be_nil
66
+
67
+ big.send(method, 0, 3).should eql(Hamster.list(1,2,3))
68
+ big.send(method, 1023, 4).should eql(Hamster.list(1024,1025,1026,1027))
69
+ big.send(method, 1024, 4).should eql(Hamster.list(1025,1026,1027,1028))
70
+ end
71
+
72
+ it "leaves the original unchanged" do
73
+ list.should eql(Hamster.list(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
+ list.send(method, -1, 0).should eql(Hamster.list)
80
+ list.send(method, -1, 1).should eql(Hamster.list(4))
81
+ list.send(method, -1, 2).should eql(Hamster.list(4))
82
+ list.send(method, -1, -1).should be_nil
83
+ list.send(method, -2, 0).should eql(Hamster.list)
84
+ list.send(method, -2, 1).should eql(Hamster.list(3))
85
+ list.send(method, -2, 2).should eql(Hamster.list(3,4))
86
+ list.send(method, -2, 4).should eql(Hamster.list(3,4))
87
+ list.send(method, -2, -1).should be_nil
88
+ list.send(method, -4, 0).should eql(Hamster.list)
89
+ list.send(method, -4, 1).should eql(Hamster.list(1))
90
+ list.send(method, -4, 2).should eql(Hamster.list(1,2))
91
+ list.send(method, -4, 4).should eql(Hamster.list(1,2,3,4))
92
+ list.send(method, -4, 6).should eql(Hamster.list(1,2,3,4))
93
+ list.send(method, -4, -1).should be_nil
94
+ list.send(method, -5, 0).should be_nil
95
+ list.send(method, -5, 1).should be_nil
96
+ list.send(method, -5, 10).should be_nil
97
+ list.send(method, -5, -1).should be_nil
98
+
99
+ big.send(method, -1, 1).should eql(Hamster.list(10000))
100
+ big.send(method, -1, 2).should eql(Hamster.list(10000))
101
+ big.send(method, -6, 2).should eql(Hamster.list(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
+ list.send(method, 0..-1).should eql(Hamster.list(1,2,3,4))
108
+ list.send(method, 0..-10).should eql(Hamster.list)
109
+ list.send(method, 0..0).should eql(Hamster.list(1))
110
+ list.send(method, 0..1).should eql(Hamster.list(1,2))
111
+ list.send(method, 0..2).should eql(Hamster.list(1,2,3))
112
+ list.send(method, 0..3).should eql(Hamster.list(1,2,3,4))
113
+ list.send(method, 0..4).should eql(Hamster.list(1,2,3,4))
114
+ list.send(method, 0..10).should eql(Hamster.list(1,2,3,4))
115
+ list.send(method, 2..-10).should eql(Hamster.list)
116
+ list.send(method, 2..0).should eql(Hamster.list)
117
+ list.send(method, 2..2).should eql(Hamster.list(3))
118
+ list.send(method, 2..3).should eql(Hamster.list(3,4))
119
+ list.send(method, 2..4).should eql(Hamster.list(3,4))
120
+ list.send(method, 3..0).should eql(Hamster.list)
121
+ list.send(method, 3..3).should eql(Hamster.list(4))
122
+ list.send(method, 3..4).should eql(Hamster.list(4))
123
+ list.send(method, 4..0).should eql(Hamster.list)
124
+ list.send(method, 4..4).should eql(Hamster.list)
125
+ list.send(method, 4..5).should eql(Hamster.list)
126
+ list.send(method, 5..0).should be_nil
127
+ list.send(method, 5..5).should be_nil
128
+ list.send(method, 5..6).should be_nil
129
+
130
+ big.send(method, 159..162).should eql(Hamster.list(160,161,162,163))
131
+ big.send(method, 160..162).should eql(Hamster.list(161,162,163))
132
+ big.send(method, 161..162).should eql(Hamster.list(162,163))
133
+ big.send(method, 9999..10100).should eql(Hamster.list(10000))
134
+ big.send(method, 10000..10100).should eql(Hamster.list)
135
+ big.send(method, 10001..10100).should be_nil
136
+
137
+ list.send(method, 0...-1).should eql(Hamster.list(1,2,3))
138
+ list.send(method, 0...-10).should eql(Hamster.list)
139
+ list.send(method, 0...0).should eql(Hamster.list)
140
+ list.send(method, 0...1).should eql(Hamster.list(1))
141
+ list.send(method, 0...2).should eql(Hamster.list(1,2))
142
+ list.send(method, 0...3).should eql(Hamster.list(1,2,3))
143
+ list.send(method, 0...4).should eql(Hamster.list(1,2,3,4))
144
+ list.send(method, 0...10).should eql(Hamster.list(1,2,3,4))
145
+ list.send(method, 2...-10).should eql(Hamster.list)
146
+ list.send(method, 2...0).should eql(Hamster.list)
147
+ list.send(method, 2...2).should eql(Hamster.list)
148
+ list.send(method, 2...3).should eql(Hamster.list(3))
149
+ list.send(method, 2...4).should eql(Hamster.list(3,4))
150
+ list.send(method, 3...0).should eql(Hamster.list)
151
+ list.send(method, 3...3).should eql(Hamster.list)
152
+ list.send(method, 3...4).should eql(Hamster.list(4))
153
+ list.send(method, 4...0).should eql(Hamster.list)
154
+ list.send(method, 4...4).should eql(Hamster.list)
155
+ list.send(method, 4...5).should eql(Hamster.list)
156
+ list.send(method, 5...0).should be_nil
157
+ list.send(method, 5...5).should be_nil
158
+ list.send(method, 5...6).should be_nil
159
+
160
+ big.send(method, 159...162).should eql(Hamster.list(160,161,162))
161
+ big.send(method, 160...162).should eql(Hamster.list(161,162))
162
+ big.send(method, 161...162).should eql(Hamster.list(162))
163
+ big.send(method, 9999...10100).should eql(Hamster.list(10000))
164
+ big.send(method, 10000...10100).should eql(Hamster.list)
165
+ big.send(method, 10001...10100).should be_nil
166
+
167
+ list.send(method, -1..-1).should eql(Hamster.list(4))
168
+ list.send(method, -1...-1).should eql(Hamster.list)
169
+ list.send(method, -1..3).should eql(Hamster.list(4))
170
+ list.send(method, -1...3).should eql(Hamster.list)
171
+ list.send(method, -1..4).should eql(Hamster.list(4))
172
+ list.send(method, -1...4).should eql(Hamster.list(4))
173
+ list.send(method, -1..10).should eql(Hamster.list(4))
174
+ list.send(method, -1...10).should eql(Hamster.list(4))
175
+ list.send(method, -1..0).should eql(Hamster.list)
176
+ list.send(method, -1..-4).should eql(Hamster.list)
177
+ list.send(method, -1...-4).should eql(Hamster.list)
178
+ list.send(method, -1..-6).should eql(Hamster.list)
179
+ list.send(method, -1...-6).should eql(Hamster.list)
180
+ list.send(method, -2..-2).should eql(Hamster.list(3))
181
+ list.send(method, -2...-2).should eql(Hamster.list)
182
+ list.send(method, -2..-1).should eql(Hamster.list(3,4))
183
+ list.send(method, -2...-1).should eql(Hamster.list(3))
184
+ list.send(method, -2..10).should eql(Hamster.list(3,4))
185
+ list.send(method, -2...10).should eql(Hamster.list(3,4))
186
+
187
+ big.send(method, -1..-1).should eql(Hamster.list(10000))
188
+ big.send(method, -1..9999).should eql(Hamster.list(10000))
189
+ big.send(method, -1...9999).should eql(Hamster.list)
190
+ big.send(method, -2...9999).should eql(Hamster.list(9999))
191
+ big.send(method, -2..-1).should eql(Hamster.list(9999,10000))
192
+
193
+ list.send(method, -4..-4).should eql(Hamster.list(1))
194
+ list.send(method, -4..-2).should eql(Hamster.list(1,2,3))
195
+ list.send(method, -4...-2).should eql(Hamster.list(1,2))
196
+ list.send(method, -4..-1).should eql(Hamster.list(1,2,3,4))
197
+ list.send(method, -4...-1).should eql(Hamster.list(1,2,3))
198
+ list.send(method, -4..3).should eql(Hamster.list(1,2,3,4))
199
+ list.send(method, -4...3).should eql(Hamster.list(1,2,3))
200
+ list.send(method, -4..4).should eql(Hamster.list(1,2,3,4))
201
+ list.send(method, -4...4).should eql(Hamster.list(1,2,3,4))
202
+ list.send(method, -4..0).should eql(Hamster.list(1))
203
+ list.send(method, -4...0).should eql(Hamster.list)
204
+ list.send(method, -4..1).should eql(Hamster.list(1,2))
205
+ list.send(method, -4...1).should eql(Hamster.list(1))
206
+
207
+ list.send(method, -5..-5).should be_nil
208
+ list.send(method, -5...-5).should be_nil
209
+ list.send(method, -5..-4).should be_nil
210
+ list.send(method, -5..-1).should be_nil
211
+ list.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
+ list.should eql(Hamster.list(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
+ list.send(method, subclass.new(1,2)).should eql(Hamster.list(2,3))
226
+ list.send(method, subclass.new(-3,-1,true)).should eql(Hamster.list(2,3))
227
+ end
228
+ end
229
+ end
230
+ end
@@ -6,7 +6,6 @@ describe Hamster::List do
6
6
  [:sort, ->(left, right) { left.length <=> right.length }],
7
7
  [:sort_by, ->(item) { item.length }],
8
8
  ].each do |method, comparator|
9
-
10
9
  describe "##{method}" do
11
10
  it "is lazy" do
12
11
  -> { Hamster.stream { fail }.send(method, &comparator) }.should_not raise_error
@@ -17,37 +16,28 @@ describe Hamster::List do
17
16
  [["A"], ["A"]],
18
17
  [%w[Ichi Ni San], %w[Ni San Ichi]],
19
18
  ].each do |values, expected|
19
+ context "on #{values.inspect}" do
20
+ let(:list) { Hamster.list(*values) }
20
21
 
21
- describe "on #{values.inspect}" do
22
- before do
23
- @original = Hamster.list(*values)
24
- end
25
-
26
- describe "with a block" do
27
- before do
28
- @result = @original.send(method, &comparator)
29
- end
30
-
22
+ context "with a block" do
31
23
  it "preserves the original" do
32
- @original.should == Hamster.list(*values)
24
+ list.send(method, &comparator)
25
+ list.should == Hamster.list(*values)
33
26
  end
34
27
 
35
28
  it "returns #{expected.inspect}" do
36
- @result.should == Hamster.list(*expected)
29
+ list.send(method, &comparator).should == Hamster.list(*expected)
37
30
  end
38
31
  end
39
32
 
40
- describe "without a block" do
41
- before do
42
- @result = @original.send(method)
43
- end
44
-
33
+ context "without a block" do
45
34
  it "preserves the original" do
46
- @original.should == Hamster.list(*values)
35
+ list.send(method)
36
+ list.should eql(Hamster.list(*values))
47
37
  end
48
38
 
49
39
  it "returns #{expected.sort.inspect}" do
50
- @result.should == Hamster.list(*expected.sort)
40
+ list.send(method).should == Hamster.list(*expected.sort)
51
41
  end
52
42
  end
53
43
  end
@@ -0,0 +1,77 @@
1
+ require "spec_helper"
2
+ require "hamster/list"
3
+
4
+ describe "Hamster.list#span" do
5
+ it "is lazy" do
6
+ -> { Hamster.stream { |item| fail }.span { true } }.should_not raise_error
7
+ end
8
+
9
+ describe <<-DESC do
10
+ given a predicate (in the form of a block), splits the list into two lists
11
+ (returned as an array) such that elements in the first list (the prefix) are
12
+ taken from the head of the list while the predicate is satisfied, and elements
13
+ in the second list (the remainder) are the remaining elements from the list
14
+ once the predicate is not satisfied. For example:
15
+ DESC
16
+
17
+ [
18
+ [[], [], []],
19
+ [[1], [1], []],
20
+ [[1, 2], [1, 2], []],
21
+ [[1, 2, 3], [1, 2], [3]],
22
+ [[1, 2, 3, 4], [1, 2], [3, 4]],
23
+ [[2, 3, 4], [2], [3, 4]],
24
+ [[3, 4], [], [3, 4]],
25
+ [[4], [], [4]],
26
+ ].each do |values, expected_prefix, expected_remainder|
27
+ context "given the list #{values.inspect}" do
28
+ let(:list) { Hamster.list(*values) }
29
+
30
+ context "and a predicate that returns true for values <= 2" do
31
+ let(:result) { list.span { |item| item <= 2 }}
32
+ let(:prefix) { result.first }
33
+ let(:remainder) { result.last }
34
+
35
+ it "preserves the original" do
36
+ result
37
+ list.should eql(Hamster.list(*values))
38
+ end
39
+
40
+ it "returns the prefix as #{expected_prefix.inspect}" do
41
+ prefix.should eql(Hamster.list(*expected_prefix))
42
+ end
43
+
44
+ it "returns the remainder as #{expected_remainder.inspect}" do
45
+ remainder.should eql(Hamster.list(*expected_remainder))
46
+ end
47
+
48
+ it "calls the block only once for each element" do
49
+ count = 0
50
+ result = list.span { |item| count += 1; item <= 2 }
51
+ # force realization of lazy lists
52
+ result.first.size.should == expected_prefix.size
53
+ result.last.size.should == expected_remainder.size
54
+ # it may not need to call the block on every element, just up to the
55
+ # point where the block first returns a false value
56
+ count.should <= values.size
57
+ end
58
+ end
59
+
60
+ context "without a predicate" do
61
+ it "returns a frozen array" do
62
+ list.span.class.should be(Array)
63
+ list.span.should be_frozen
64
+ end
65
+
66
+ it "returns self as the prefix" do
67
+ list.span.first.should equal(list)
68
+ end
69
+
70
+ it "returns an empty list as the remainder" do
71
+ list.span.last.should be_empty
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end