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
@@ -4,48 +4,40 @@ require "hamster/list"
4
4
  describe Hamster::List do
5
5
  [:any?, :exist?, :exists?].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
7
+ context "on a really big list" do
8
+ let(:list) { Hamster.interval(0, STACK_OVERFLOW_DEPTH) }
11
9
 
12
10
  it "doesn't run out of stack" do
13
- -> { @list.send(method) { false } }.should_not raise_error
11
+ -> { list.send(method) { false } }.should_not raise_error
14
12
  end
15
13
  end
16
14
 
17
- describe "when empty" do
18
- before do
19
- @list = Hamster.list
20
- end
21
-
15
+ context "when empty" do
22
16
  it "with a block returns false" do
23
- @list.send(method) {}.should == false
17
+ Hamster.list.send(method) {}.should == false
24
18
  end
25
19
 
26
20
  it "with no block returns false" do
27
- @list.send(method).should == false
21
+ Hamster.list.send(method).should == false
28
22
  end
29
23
  end
30
24
 
31
- describe "when not empty" do
32
- describe "with a block" do
33
- before do
34
- @list = Hamster.list("A", "B", "C", nil)
35
- end
25
+ context "when not empty" do
26
+ context "with a block" do
27
+ let(:list) { Hamster.list("A", "B", "C", nil) }
36
28
 
37
29
  ["A", "B", "C", nil].each do |value|
38
30
  it "returns true if the block ever returns true (#{value.inspect})" do
39
- @list.send(method) { |item| item == value }.should == true
31
+ list.send(method) { |item| item == value }.should == true
40
32
  end
41
33
  end
42
34
 
43
35
  it "returns false if the block always returns false" do
44
- @list.send(method) { |item| item == "D" }.should == false
36
+ list.send(method) { |item| item == "D" }.should == false
45
37
  end
46
38
  end
47
39
 
48
- describe "with no block" do
40
+ context "with no block" do
49
41
  it "returns true if any value is truthy" do
50
42
  Hamster.list(nil, false, "A", true).send(method).should == true
51
43
  end
@@ -14,24 +14,23 @@ describe Hamster::List do
14
14
  [[], ["A"], ["A"]],
15
15
  [%w[A B], %w[C D], %w[A B C D]],
16
16
  ].each do |left_values, right_values, expected|
17
-
18
- describe "on #{left_values.inspect} and #{right_values.inspect}" do
19
- before do
20
- @left = Hamster.list(*left_values)
21
- @right = Hamster.list(*right_values)
22
- @result = @left.append(@right)
23
- end
17
+ context "on #{left_values.inspect} and #{right_values.inspect}" do
18
+ let(:left) { Hamster.list(*left_values) }
19
+ let(:right) { Hamster.list(*right_values) }
20
+ let(:result) { left.append(right) }
24
21
 
25
22
  it "preserves the left" do
26
- @left.should == Hamster.list(*left_values)
23
+ result
24
+ left.should eql(Hamster.list(*left_values))
27
25
  end
28
26
 
29
27
  it "preserves the right" do
30
- @right.should == Hamster.list(*right_values)
28
+ result
29
+ right.should eql(Hamster.list(*right_values))
31
30
  end
32
31
 
33
32
  it "returns #{expected.inspect}" do
34
- @result.should == Hamster.list(*expected)
33
+ result.should eql(Hamster.list(*expected))
35
34
  end
36
35
  end
37
36
  end
@@ -0,0 +1,30 @@
1
+ require "spec_helper"
2
+ require "hamster/list"
3
+
4
+ describe Hamster::List do
5
+ describe "#at" do
6
+ context "on a really big list" do
7
+ let(:list) { Hamster.interval(0, STACK_OVERFLOW_DEPTH) }
8
+
9
+ it "doesn't run out of stack" do
10
+ -> { list.at(STACK_OVERFLOW_DEPTH) }.should_not raise_error
11
+ end
12
+ end
13
+
14
+ [
15
+ [[], 10, nil],
16
+ [["A"], 10, nil],
17
+ [%w[A B C], 0, "A"],
18
+ [%w[A B C], 2, "C"],
19
+ [%w[A B C], -1, "C"],
20
+ [%w[A B C], -2, "B"],
21
+ [%w[A B C], -4, nil]
22
+ ].each do |values, number, expected|
23
+ describe "#{values.inspect} with #{number}" do
24
+ it "returns #{expected.inspect}" do
25
+ Hamster.list(*values).at(number).should == expected
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,70 @@
1
+ require "spec_helper"
2
+ require "hamster/list"
3
+
4
+ describe Hamster::List do
5
+ describe "#break" do
6
+ it "is lazy" do
7
+ -> { Hamster.stream { fail }.break { |item| false } }.should_not raise_error
8
+ end
9
+
10
+ [
11
+ [[], [], []],
12
+ [[1], [1], []],
13
+ [[1, 2], [1, 2], []],
14
+ [[1, 2, 3], [1, 2], [3]],
15
+ [[1, 2, 3, 4], [1, 2], [3, 4]],
16
+ [[2, 3, 4], [2], [3, 4]],
17
+ [[3, 4], [], [3, 4]],
18
+ [[4], [], [4]],
19
+ ].each do |values, expected_prefix, expected_remainder|
20
+ context "on #{values.inspect}" do
21
+ let(:list) { Hamster.list(*values) }
22
+
23
+ context "with a block" do
24
+ let(:result) { list.break { |item| item > 2 }}
25
+ let(:prefix) { result.first }
26
+ let(:remainder) { result.last }
27
+
28
+ it "preserves the original" do
29
+ result
30
+ list.should eql(Hamster.list(*values))
31
+ end
32
+
33
+ it "returns a frozen array with two items" do
34
+ result.class.should be(Array)
35
+ result.should be_frozen
36
+ result.size.should be(2)
37
+ end
38
+
39
+ it "correctly identifies the prefix" do
40
+ prefix.should eql(Hamster.list(*expected_prefix))
41
+ end
42
+
43
+ it "correctly identifies the remainder" do
44
+ remainder.should eql(Hamster.list(*expected_remainder))
45
+ end
46
+ end
47
+
48
+ context "without a block" do
49
+ let(:result) { list.break }
50
+ let(:prefix) { result.first }
51
+ let(:remainder) { result.last }
52
+
53
+ it "returns a frozen array with two items" do
54
+ result.class.should be(Array)
55
+ result.should be_frozen
56
+ result.size.should be(2)
57
+ end
58
+
59
+ it "returns self as the prefix" do
60
+ prefix.should equal(list)
61
+ end
62
+
63
+ it "leaves the remainder empty" do
64
+ remainder.should be_empty
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -17,24 +17,21 @@ describe Hamster::List do
17
17
  [%w[A B C], :cdddr, Hamster.list],
18
18
  [%w[A B C], :cddddr, Hamster.list],
19
19
  ].each do |values, method, expected|
20
-
21
20
  describe "##{method}" do
22
21
  it "is responded to" do
23
22
  Hamster.list.respond_to?(method).should == true
24
23
  end
25
24
 
26
- describe "on #{values.inspect}" do
27
- before do
28
- @original = Hamster.list(*values)
29
- @result = @original.send(method)
30
- end
25
+ context "on #{values.inspect}" do
26
+ let(:list) { Hamster.list(*values) }
31
27
 
32
28
  it "preserves the original" do
33
- @original.should == Hamster.list(*values)
29
+ list.send(method)
30
+ list.should eql(Hamster.list(*values))
34
31
  end
35
32
 
36
33
  it "returns #{expected.inspect}" do
37
- @result.should == expected
34
+ list.send(method).should == expected
38
35
  end
39
36
  end
40
37
  end
@@ -12,19 +12,16 @@ describe Hamster::List do
12
12
  [["A"], [Hamster.list("A")]],
13
13
  [%w[A B C], [Hamster.list("A", "B"), Hamster.list("C")]],
14
14
  ].each do |values, expected|
15
-
16
- describe "on #{values.inspect}" do
17
- before do
18
- @original = Hamster.list(*values)
19
- @result = @original.chunk(2)
20
- end
15
+ context "on #{values.inspect}" do
16
+ let(:list) { Hamster.list(*values) }
21
17
 
22
18
  it "preserves the original" do
23
- @original.should == Hamster.list(*values)
19
+ list.chunk(2)
20
+ list.should eql(Hamster.list(*values))
24
21
  end
25
22
 
26
23
  it "returns #{expected.inspect}" do
27
- @result.should == Hamster.list(*expected)
24
+ list.chunk(2).should eql(Hamster.list(*expected))
28
25
  end
29
26
  end
30
27
  end
@@ -8,19 +8,16 @@ describe Hamster::List do
8
8
  ["A"],
9
9
  %w[A B C],
10
10
  ].each do |values|
11
-
12
11
  describe "on #{values}" do
13
- before do
14
- @original = Hamster.list(*values)
15
- @result = @original.clear
16
- end
12
+ let(:list) { Hamster.list(*values) }
17
13
 
18
14
  it "preserves the original" do
19
- @original.should == Hamster.list(*values)
15
+ list.clear
16
+ list.should eql(Hamster.list(*values))
20
17
  end
21
18
 
22
19
  it "returns an empty list" do
23
- @result.should equal(Hamster.list)
20
+ list.clear.should equal(Hamster.list)
24
21
  end
25
22
  end
26
23
  end
@@ -0,0 +1,34 @@
1
+ require "spec_helper"
2
+ require "hamster/list"
3
+
4
+ describe Hamster::List do
5
+ describe "#combination" do
6
+ it "is lazy" do
7
+ -> { Hamster.stream { fail }.combination(2) }.should_not raise_error
8
+ end
9
+
10
+ [
11
+ [%w[A B C D], 1, [L["A"], L["B"], L["C"], L["D"]]],
12
+ [%w[A B C D], 2, [L["A","B"], L["A","C"], L["A","D"], L["B","C"], L["B","D"], L["C","D"]]],
13
+ [%w[A B C D], 3, [L["A","B","C"], L["A","B","D"], L["A","C","D"], L["B","C","D"]]],
14
+ [%w[A B C D], 4, [L["A", "B", "C", "D"]]],
15
+ [%w[A B C D], 0, [EmptyList]],
16
+ [%w[A B C D], 5, []],
17
+ [[], 0, [EmptyList]],
18
+ [[], 1, []],
19
+ ].each do |values, number, expected|
20
+ context "on #{values.inspect} in groups of #{number}" do
21
+ let(:list) { Hamster.list(*values) }
22
+
23
+ it "preserves the original" do
24
+ list.combination(number)
25
+ list.should eql(Hamster.list(*values))
26
+ end
27
+
28
+ it "returns #{expected.inspect}" do
29
+ list.combination(number).should eql(Hamster.list(*expected))
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -18,19 +18,16 @@ describe Hamster::List do
18
18
  [["A", nil, "C"], %w[A C]],
19
19
  [[nil, "B", nil], ["B"]],
20
20
  ].each do |values, expected|
21
-
22
- describe "on #{values.inspect}" do
23
- before do
24
- @original = Hamster.list(*values)
25
- @result = @original.compact
26
- end
21
+ context "on #{values.inspect}" do
22
+ let(:list) { Hamster.list(*values) }
27
23
 
28
24
  it "preserves the original" do
29
- @original.should == Hamster.list(*values)
25
+ list.compact
26
+ list.should eql(Hamster.list(*values))
30
27
  end
31
28
 
32
29
  it "returns #{expected.inspect}" do
33
- @result.should == Hamster.list(*expected)
30
+ list.compact.should eql(Hamster.list(*expected))
34
31
  end
35
32
  end
36
33
  end
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+ require "hamster/list"
3
+
4
+ describe Hamster::List do
5
+ describe "#<=>" do
6
+ [
7
+ [[], [1]],
8
+ [[1], [2]],
9
+ [[1], [1, 2]],
10
+ [[2, 3, 4], [3, 4, 5]]
11
+ ].each do |items1, items2|
12
+ context "with #{items1} and #{items2}" do
13
+ it "returns -1" do
14
+ (Hamster.list(*items1) <=> Hamster.list(*items2)).should be(-1)
15
+ end
16
+ end
17
+
18
+ context "with #{items2} and #{items1}" do
19
+ it "returns 1" do
20
+ (Hamster.list(*items2) <=> Hamster.list(*items1)).should be(1)
21
+ end
22
+ end
23
+
24
+ context "with #{items1} and #{items1}" do
25
+ it "returns 0" do
26
+ (Hamster.list(*items1) <=> Hamster.list(*items1)).should be(0)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -4,26 +4,22 @@ require "hamster/list"
4
4
  describe Hamster::List do
5
5
  [:cons, :>>].each do |method|
6
6
  describe "##{method}" do
7
-
8
7
  [
9
8
  [[], "A", ["A"]],
10
9
  [["A"], "B", %w[B A]],
11
10
  [["A"], "A", %w[A A]],
12
11
  [%w[A B C], "D", %w[D A B C]],
13
12
  ].each do |values, new_value, expected|
14
-
15
- describe "on #{values.inspect} with #{new_value.inspect}" do
16
- before do
17
- @original = Hamster.list(*values)
18
- @result = @original.send(method, new_value)
19
- end
13
+ context "on #{values.inspect} with #{new_value.inspect}" do
14
+ let(:list) { Hamster.list(*values) }
20
15
 
21
16
  it "preserves the original" do
22
- @original.should == Hamster.list(*values)
17
+ list.send(method, new_value)
18
+ list.should eql(Hamster.list(*values))
23
19
  end
24
20
 
25
21
  it "returns #{expected.inspect}" do
26
- @result.should == Hamster.list(*expected)
22
+ list.send(method, new_value).should eql(Hamster.list(*expected))
27
23
  end
28
24
  end
29
25
  end
@@ -0,0 +1,118 @@
1
+ require "spec_helper"
2
+ require "hamster/list"
3
+
4
+ describe Hamster do
5
+ describe ".list" do
6
+ context "with no arguments" do
7
+ it "always returns the same instance" do
8
+ Hamster.list.should equal(Hamster.list)
9
+ end
10
+
11
+ it "returns an empty list" do
12
+ Hamster.list.should be_empty
13
+ end
14
+ end
15
+
16
+ context "with a number of items" do
17
+ it "always returns a different instance" do
18
+ Hamster.list("A", "B", "C").should_not equal(Hamster.list("A", "B", "C"))
19
+ end
20
+
21
+ it "is the same as repeatedly using #cons" do
22
+ Hamster.list("A", "B", "C").should eql(Hamster.list.cons("C").cons("B").cons("A"))
23
+ end
24
+ end
25
+ end
26
+
27
+ describe ".stream" do
28
+ context "with no block" do
29
+ it "returns an empty list" do
30
+ Hamster.stream.should eql(Hamster.list)
31
+ end
32
+ end
33
+
34
+ context "with a block" do
35
+ let(:list) { count = 0; Hamster.stream { count += 1 }}
36
+
37
+ it "repeatedly calls the block" do
38
+ list.take(5).should eql(Hamster.list(1, 2, 3, 4, 5))
39
+ end
40
+ end
41
+ end
42
+
43
+ [:interval, :range].each do |method|
44
+ describe ".#{method}" do
45
+ context "for numbers" do
46
+ it "is equivalent to a list with explicit values" do
47
+ Hamster.send(method, 98, 102).should eql(Hamster.list(98, 99, 100, 101, 102))
48
+ end
49
+ end
50
+
51
+ context "for strings" do
52
+ it "is equivalent to a list with explicit values" do
53
+ Hamster.send(method, "A", "AA").should eql(Hamster.list("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "AA"))
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ describe ".repeat" do
60
+ it "returns an infinite list with specified value for each element" do
61
+ Hamster.repeat("A").take(5).should eql(Hamster.list("A", "A", "A", "A", "A"))
62
+ end
63
+ end
64
+
65
+ describe ".replicate" do
66
+ it "returns a list with the specified value repeated the specified number of times" do
67
+ Hamster.replicate(5, "A").should eql(Hamster.list("A", "A", "A", "A", "A"))
68
+ end
69
+ end
70
+
71
+ describe ".iterate" do
72
+ it "returns an infinite list where the first item is calculated by applying the block on the initial argument, the second item by applying the function on the previous result and so on" do
73
+ Hamster.iterate(1) { |item| item * 2 }.take(10).should eql(Hamster.list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512))
74
+ end
75
+ end
76
+
77
+ describe ".enumerate" do
78
+ let(:counter) do
79
+ i = 0
80
+ -> { i += 1 }
81
+ end
82
+
83
+ let(:enum) do
84
+ Enumerator.new do |yielder|
85
+ yielder << 1
86
+ yielder << 2
87
+ yielder << 3
88
+ raise "list fully realized"
89
+ end
90
+ end
91
+
92
+ let(:list) { Hamster.enumerate(enum) }
93
+
94
+ it "returns a list based on the values yielded from the enumerator" do
95
+ expect(list.take(2)).to eq Hamster.list(1, 2)
96
+ end
97
+
98
+ it "realizes values as they are needed" do
99
+ # this example shows that Lists are not as lazy as they could be
100
+ # if Lists were fully lazy, you would have to take(4) to hit the exception
101
+ expect { list.take(3).to_a }.to raise_exception
102
+ end
103
+ end
104
+
105
+ describe "[]" do
106
+ it "takes a variable number of items and returns a list" do
107
+ list = Hamster::List[1,2,3]
108
+ list.should be_kind_of(Hamster::List)
109
+ list.size.should be(3)
110
+ list.to_a.should == [1,2,3]
111
+ end
112
+
113
+ it "returns an empty list when called without arguments" do
114
+ Hamster::List[].should be_kind_of(Hamster::List)
115
+ Hamster::List[].should be_empty
116
+ end
117
+ end
118
+ end