immutable-ruby 0.0.1

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 (346) hide show
  1. checksums.yaml +7 -0
  2. data/lib/immutable.rb +9 -0
  3. data/lib/immutable/core_ext.rb +2 -0
  4. data/lib/immutable/core_ext/enumerable.rb +11 -0
  5. data/lib/immutable/core_ext/io.rb +21 -0
  6. data/lib/immutable/deque.rb +254 -0
  7. data/lib/immutable/enumerable.rb +152 -0
  8. data/lib/immutable/hash.rb +841 -0
  9. data/lib/immutable/list.rb +1595 -0
  10. data/lib/immutable/nested.rb +75 -0
  11. data/lib/immutable/set.rb +583 -0
  12. data/lib/immutable/sorted_set.rb +1464 -0
  13. data/lib/immutable/trie.rb +338 -0
  14. data/lib/immutable/undefined.rb +5 -0
  15. data/lib/immutable/vector.rb +1539 -0
  16. data/lib/immutable/version.rb +5 -0
  17. data/spec/fixtures/io_spec.txt +3 -0
  18. data/spec/lib/immutable/core_ext/array_spec.rb +13 -0
  19. data/spec/lib/immutable/core_ext/enumerable_spec.rb +29 -0
  20. data/spec/lib/immutable/core_ext/io_spec.rb +28 -0
  21. data/spec/lib/immutable/deque/clear_spec.rb +33 -0
  22. data/spec/lib/immutable/deque/construction_spec.rb +29 -0
  23. data/spec/lib/immutable/deque/copying_spec.rb +19 -0
  24. data/spec/lib/immutable/deque/dequeue_spec.rb +34 -0
  25. data/spec/lib/immutable/deque/empty_spec.rb +39 -0
  26. data/spec/lib/immutable/deque/enqueue_spec.rb +27 -0
  27. data/spec/lib/immutable/deque/first_spec.rb +17 -0
  28. data/spec/lib/immutable/deque/inspect_spec.rb +23 -0
  29. data/spec/lib/immutable/deque/last_spec.rb +17 -0
  30. data/spec/lib/immutable/deque/marshal_spec.rb +33 -0
  31. data/spec/lib/immutable/deque/new_spec.rb +43 -0
  32. data/spec/lib/immutable/deque/pop_spec.rb +36 -0
  33. data/spec/lib/immutable/deque/pretty_print_spec.rb +23 -0
  34. data/spec/lib/immutable/deque/push_spec.rb +36 -0
  35. data/spec/lib/immutable/deque/random_modification_spec.rb +33 -0
  36. data/spec/lib/immutable/deque/shift_spec.rb +29 -0
  37. data/spec/lib/immutable/deque/size_spec.rb +19 -0
  38. data/spec/lib/immutable/deque/to_a_spec.rb +26 -0
  39. data/spec/lib/immutable/deque/to_ary_spec.rb +35 -0
  40. data/spec/lib/immutable/deque/to_list_spec.rb +24 -0
  41. data/spec/lib/immutable/deque/unshift_spec.rb +30 -0
  42. data/spec/lib/immutable/hash/all_spec.rb +53 -0
  43. data/spec/lib/immutable/hash/any_spec.rb +53 -0
  44. data/spec/lib/immutable/hash/assoc_spec.rb +51 -0
  45. data/spec/lib/immutable/hash/clear_spec.rb +42 -0
  46. data/spec/lib/immutable/hash/construction_spec.rb +38 -0
  47. data/spec/lib/immutable/hash/copying_spec.rb +13 -0
  48. data/spec/lib/immutable/hash/default_proc_spec.rb +72 -0
  49. data/spec/lib/immutable/hash/delete_spec.rb +39 -0
  50. data/spec/lib/immutable/hash/each_spec.rb +77 -0
  51. data/spec/lib/immutable/hash/each_with_index_spec.rb +29 -0
  52. data/spec/lib/immutable/hash/empty_spec.rb +43 -0
  53. data/spec/lib/immutable/hash/eql_spec.rb +69 -0
  54. data/spec/lib/immutable/hash/except_spec.rb +42 -0
  55. data/spec/lib/immutable/hash/fetch_spec.rb +57 -0
  56. data/spec/lib/immutable/hash/find_spec.rb +43 -0
  57. data/spec/lib/immutable/hash/flat_map_spec.rb +35 -0
  58. data/spec/lib/immutable/hash/flatten_spec.rb +98 -0
  59. data/spec/lib/immutable/hash/get_spec.rb +79 -0
  60. data/spec/lib/immutable/hash/has_key_spec.rb +31 -0
  61. data/spec/lib/immutable/hash/has_value_spec.rb +27 -0
  62. data/spec/lib/immutable/hash/hash_spec.rb +29 -0
  63. data/spec/lib/immutable/hash/inspect_spec.rb +30 -0
  64. data/spec/lib/immutable/hash/invert_spec.rb +30 -0
  65. data/spec/lib/immutable/hash/key_spec.rb +27 -0
  66. data/spec/lib/immutable/hash/keys_spec.rb +15 -0
  67. data/spec/lib/immutable/hash/map_spec.rb +45 -0
  68. data/spec/lib/immutable/hash/marshal_spec.rb +28 -0
  69. data/spec/lib/immutable/hash/merge_spec.rb +82 -0
  70. data/spec/lib/immutable/hash/min_max_spec.rb +45 -0
  71. data/spec/lib/immutable/hash/new_spec.rb +70 -0
  72. data/spec/lib/immutable/hash/none_spec.rb +48 -0
  73. data/spec/lib/immutable/hash/partition_spec.rb +35 -0
  74. data/spec/lib/immutable/hash/pretty_print_spec.rb +34 -0
  75. data/spec/lib/immutable/hash/put_spec.rb +102 -0
  76. data/spec/lib/immutable/hash/reduce_spec.rb +35 -0
  77. data/spec/lib/immutable/hash/reject_spec.rb +61 -0
  78. data/spec/lib/immutable/hash/reverse_each_spec.rb +27 -0
  79. data/spec/lib/immutable/hash/sample_spec.rb +13 -0
  80. data/spec/lib/immutable/hash/select_spec.rb +57 -0
  81. data/spec/lib/immutable/hash/size_spec.rb +51 -0
  82. data/spec/lib/immutable/hash/slice_spec.rb +44 -0
  83. data/spec/lib/immutable/hash/sort_spec.rb +26 -0
  84. data/spec/lib/immutable/hash/store_spec.rb +75 -0
  85. data/spec/lib/immutable/hash/take_spec.rb +35 -0
  86. data/spec/lib/immutable/hash/to_a_spec.rb +13 -0
  87. data/spec/lib/immutable/hash/to_hash_spec.rb +21 -0
  88. data/spec/lib/immutable/hash/update_in_spec.rb +79 -0
  89. data/spec/lib/immutable/hash/values_at_spec.rb +13 -0
  90. data/spec/lib/immutable/hash/values_spec.rb +23 -0
  91. data/spec/lib/immutable/list/add_spec.rb +25 -0
  92. data/spec/lib/immutable/list/all_spec.rb +57 -0
  93. data/spec/lib/immutable/list/any_spec.rb +49 -0
  94. data/spec/lib/immutable/list/append_spec.rb +38 -0
  95. data/spec/lib/immutable/list/at_spec.rb +29 -0
  96. data/spec/lib/immutable/list/break_spec.rb +69 -0
  97. data/spec/lib/immutable/list/cadr_spec.rb +38 -0
  98. data/spec/lib/immutable/list/chunk_spec.rb +28 -0
  99. data/spec/lib/immutable/list/clear_spec.rb +24 -0
  100. data/spec/lib/immutable/list/combination_spec.rb +33 -0
  101. data/spec/lib/immutable/list/compact_spec.rb +34 -0
  102. data/spec/lib/immutable/list/compare_spec.rb +30 -0
  103. data/spec/lib/immutable/list/cons_spec.rb +25 -0
  104. data/spec/lib/immutable/list/construction_spec.rb +110 -0
  105. data/spec/lib/immutable/list/copying_spec.rb +19 -0
  106. data/spec/lib/immutable/list/count_spec.rb +36 -0
  107. data/spec/lib/immutable/list/cycle_spec.rb +28 -0
  108. data/spec/lib/immutable/list/delete_at_spec.rb +18 -0
  109. data/spec/lib/immutable/list/delete_spec.rb +16 -0
  110. data/spec/lib/immutable/list/drop_spec.rb +30 -0
  111. data/spec/lib/immutable/list/drop_while_spec.rb +38 -0
  112. data/spec/lib/immutable/list/each_slice_spec.rb +51 -0
  113. data/spec/lib/immutable/list/each_spec.rb +40 -0
  114. data/spec/lib/immutable/list/each_with_index_spec.rb +28 -0
  115. data/spec/lib/immutable/list/empty_spec.rb +23 -0
  116. data/spec/lib/immutable/list/eql_spec.rb +61 -0
  117. data/spec/lib/immutable/list/fill_spec.rb +49 -0
  118. data/spec/lib/immutable/list/find_all_spec.rb +70 -0
  119. data/spec/lib/immutable/list/find_index_spec.rb +35 -0
  120. data/spec/lib/immutable/list/find_spec.rb +42 -0
  121. data/spec/lib/immutable/list/flat_map_spec.rb +51 -0
  122. data/spec/lib/immutable/list/flatten_spec.rb +30 -0
  123. data/spec/lib/immutable/list/grep_spec.rb +46 -0
  124. data/spec/lib/immutable/list/group_by_spec.rb +41 -0
  125. data/spec/lib/immutable/list/hash_spec.rb +21 -0
  126. data/spec/lib/immutable/list/head_spec.rb +19 -0
  127. data/spec/lib/immutable/list/include_spec.rb +35 -0
  128. data/spec/lib/immutable/list/index_spec.rb +33 -0
  129. data/spec/lib/immutable/list/indices_spec.rb +61 -0
  130. data/spec/lib/immutable/list/init_spec.rb +28 -0
  131. data/spec/lib/immutable/list/inits_spec.rb +28 -0
  132. data/spec/lib/immutable/list/insert_spec.rb +46 -0
  133. data/spec/lib/immutable/list/inspect_spec.rb +29 -0
  134. data/spec/lib/immutable/list/intersperse_spec.rb +28 -0
  135. data/spec/lib/immutable/list/join_spec.rb +63 -0
  136. data/spec/lib/immutable/list/last_spec.rb +23 -0
  137. data/spec/lib/immutable/list/ltlt_spec.rb +19 -0
  138. data/spec/lib/immutable/list/map_spec.rb +45 -0
  139. data/spec/lib/immutable/list/maximum_spec.rb +39 -0
  140. data/spec/lib/immutable/list/merge_by_spec.rb +51 -0
  141. data/spec/lib/immutable/list/merge_spec.rb +59 -0
  142. data/spec/lib/immutable/list/minimum_spec.rb +39 -0
  143. data/spec/lib/immutable/list/multithreading_spec.rb +47 -0
  144. data/spec/lib/immutable/list/none_spec.rb +47 -0
  145. data/spec/lib/immutable/list/one_spec.rb +49 -0
  146. data/spec/lib/immutable/list/partition_spec.rb +115 -0
  147. data/spec/lib/immutable/list/permutation_spec.rb +55 -0
  148. data/spec/lib/immutable/list/pop_spec.rb +25 -0
  149. data/spec/lib/immutable/list/product_spec.rb +23 -0
  150. data/spec/lib/immutable/list/reduce_spec.rb +53 -0
  151. data/spec/lib/immutable/list/reject_spec.rb +45 -0
  152. data/spec/lib/immutable/list/reverse_spec.rb +34 -0
  153. data/spec/lib/immutable/list/rotate_spec.rb +36 -0
  154. data/spec/lib/immutable/list/sample_spec.rb +13 -0
  155. data/spec/lib/immutable/list/select_spec.rb +70 -0
  156. data/spec/lib/immutable/list/size_spec.rb +25 -0
  157. data/spec/lib/immutable/list/slice_spec.rb +229 -0
  158. data/spec/lib/immutable/list/sorting_spec.rb +46 -0
  159. data/spec/lib/immutable/list/span_spec.rb +76 -0
  160. data/spec/lib/immutable/list/split_at_spec.rb +43 -0
  161. data/spec/lib/immutable/list/subsequences_spec.rb +23 -0
  162. data/spec/lib/immutable/list/sum_spec.rb +23 -0
  163. data/spec/lib/immutable/list/tail_spec.rb +30 -0
  164. data/spec/lib/immutable/list/tails_spec.rb +28 -0
  165. data/spec/lib/immutable/list/take_spec.rb +30 -0
  166. data/spec/lib/immutable/list/take_while_spec.rb +46 -0
  167. data/spec/lib/immutable/list/to_a_spec.rb +39 -0
  168. data/spec/lib/immutable/list/to_ary_spec.rb +41 -0
  169. data/spec/lib/immutable/list/to_list_spec.rb +19 -0
  170. data/spec/lib/immutable/list/to_set_spec.rb +17 -0
  171. data/spec/lib/immutable/list/transpose_spec.rb +19 -0
  172. data/spec/lib/immutable/list/union_spec.rb +31 -0
  173. data/spec/lib/immutable/list/uniq_spec.rb +35 -0
  174. data/spec/lib/immutable/list/zip_spec.rb +23 -0
  175. data/spec/lib/immutable/nested/construction_spec.rb +95 -0
  176. data/spec/lib/immutable/set/add_spec.rb +75 -0
  177. data/spec/lib/immutable/set/all_spec.rb +51 -0
  178. data/spec/lib/immutable/set/any_spec.rb +51 -0
  179. data/spec/lib/immutable/set/clear_spec.rb +33 -0
  180. data/spec/lib/immutable/set/compact_spec.rb +30 -0
  181. data/spec/lib/immutable/set/construction_spec.rb +18 -0
  182. data/spec/lib/immutable/set/copying_spec.rb +13 -0
  183. data/spec/lib/immutable/set/count_spec.rb +36 -0
  184. data/spec/lib/immutable/set/delete_spec.rb +71 -0
  185. data/spec/lib/immutable/set/difference_spec.rb +49 -0
  186. data/spec/lib/immutable/set/disjoint_spec.rb +25 -0
  187. data/spec/lib/immutable/set/each_spec.rb +45 -0
  188. data/spec/lib/immutable/set/empty_spec.rb +44 -0
  189. data/spec/lib/immutable/set/eqeq_spec.rb +103 -0
  190. data/spec/lib/immutable/set/eql_spec.rb +109 -0
  191. data/spec/lib/immutable/set/exclusion_spec.rb +47 -0
  192. data/spec/lib/immutable/set/find_spec.rb +35 -0
  193. data/spec/lib/immutable/set/first_spec.rb +28 -0
  194. data/spec/lib/immutable/set/flatten_spec.rb +46 -0
  195. data/spec/lib/immutable/set/grep_spec.rb +57 -0
  196. data/spec/lib/immutable/set/group_by_spec.rb +59 -0
  197. data/spec/lib/immutable/set/hash_spec.rb +22 -0
  198. data/spec/lib/immutable/set/include_spec.rb +60 -0
  199. data/spec/lib/immutable/set/inspect_spec.rb +47 -0
  200. data/spec/lib/immutable/set/intersect_spec.rb +25 -0
  201. data/spec/lib/immutable/set/intersection_spec.rb +52 -0
  202. data/spec/lib/immutable/set/join_spec.rb +64 -0
  203. data/spec/lib/immutable/set/map_spec.rb +59 -0
  204. data/spec/lib/immutable/set/marshal_spec.rb +28 -0
  205. data/spec/lib/immutable/set/maximum_spec.rb +36 -0
  206. data/spec/lib/immutable/set/minimum_spec.rb +36 -0
  207. data/spec/lib/immutable/set/new_spec.rb +53 -0
  208. data/spec/lib/immutable/set/none_spec.rb +47 -0
  209. data/spec/lib/immutable/set/one_spec.rb +47 -0
  210. data/spec/lib/immutable/set/partition_spec.rb +52 -0
  211. data/spec/lib/immutable/set/product_spec.rb +23 -0
  212. data/spec/lib/immutable/set/reduce_spec.rb +55 -0
  213. data/spec/lib/immutable/set/reject_spec.rb +50 -0
  214. data/spec/lib/immutable/set/reverse_each_spec.rb +38 -0
  215. data/spec/lib/immutable/set/sample_spec.rb +13 -0
  216. data/spec/lib/immutable/set/select_spec.rb +73 -0
  217. data/spec/lib/immutable/set/size_spec.rb +17 -0
  218. data/spec/lib/immutable/set/sorting_spec.rb +59 -0
  219. data/spec/lib/immutable/set/subset_spec.rb +51 -0
  220. data/spec/lib/immutable/set/sum_spec.rb +23 -0
  221. data/spec/lib/immutable/set/superset_spec.rb +51 -0
  222. data/spec/lib/immutable/set/to_a_spec.rb +30 -0
  223. data/spec/lib/immutable/set/to_list_spec.rb +35 -0
  224. data/spec/lib/immutable/set/to_set_spec.rb +19 -0
  225. data/spec/lib/immutable/set/union_spec.rb +63 -0
  226. data/spec/lib/immutable/sorted_set/above_spec.rb +51 -0
  227. data/spec/lib/immutable/sorted_set/add_spec.rb +62 -0
  228. data/spec/lib/immutable/sorted_set/at_spec.rb +24 -0
  229. data/spec/lib/immutable/sorted_set/below_spec.rb +51 -0
  230. data/spec/lib/immutable/sorted_set/between_spec.rb +51 -0
  231. data/spec/lib/immutable/sorted_set/clear_spec.rb +43 -0
  232. data/spec/lib/immutable/sorted_set/copying_spec.rb +20 -0
  233. data/spec/lib/immutable/sorted_set/delete_at_spec.rb +18 -0
  234. data/spec/lib/immutable/sorted_set/delete_spec.rb +89 -0
  235. data/spec/lib/immutable/sorted_set/difference_spec.rb +22 -0
  236. data/spec/lib/immutable/sorted_set/disjoint_spec.rb +25 -0
  237. data/spec/lib/immutable/sorted_set/drop_spec.rb +55 -0
  238. data/spec/lib/immutable/sorted_set/drop_while_spec.rb +34 -0
  239. data/spec/lib/immutable/sorted_set/each_spec.rb +28 -0
  240. data/spec/lib/immutable/sorted_set/empty_spec.rb +34 -0
  241. data/spec/lib/immutable/sorted_set/eql_spec.rb +120 -0
  242. data/spec/lib/immutable/sorted_set/exclusion_spec.rb +22 -0
  243. data/spec/lib/immutable/sorted_set/fetch_spec.rb +64 -0
  244. data/spec/lib/immutable/sorted_set/find_index_spec.rb +40 -0
  245. data/spec/lib/immutable/sorted_set/first_spec.rb +18 -0
  246. data/spec/lib/immutable/sorted_set/from_spec.rb +51 -0
  247. data/spec/lib/immutable/sorted_set/group_by_spec.rb +57 -0
  248. data/spec/lib/immutable/sorted_set/include_spec.rb +23 -0
  249. data/spec/lib/immutable/sorted_set/inspect_spec.rb +37 -0
  250. data/spec/lib/immutable/sorted_set/intersect_spec.rb +25 -0
  251. data/spec/lib/immutable/sorted_set/intersection_spec.rb +28 -0
  252. data/spec/lib/immutable/sorted_set/last_spec.rb +36 -0
  253. data/spec/lib/immutable/sorted_set/map_spec.rb +43 -0
  254. data/spec/lib/immutable/sorted_set/marshal_spec.rb +36 -0
  255. data/spec/lib/immutable/sorted_set/maximum_spec.rb +36 -0
  256. data/spec/lib/immutable/sorted_set/minimum_spec.rb +19 -0
  257. data/spec/lib/immutable/sorted_set/new_spec.rb +71 -0
  258. data/spec/lib/immutable/sorted_set/reverse_each_spec.rb +28 -0
  259. data/spec/lib/immutable/sorted_set/sample_spec.rb +13 -0
  260. data/spec/lib/immutable/sorted_set/select_spec.rb +61 -0
  261. data/spec/lib/immutable/sorted_set/size_spec.rb +17 -0
  262. data/spec/lib/immutable/sorted_set/slice_spec.rb +256 -0
  263. data/spec/lib/immutable/sorted_set/sorting_spec.rb +44 -0
  264. data/spec/lib/immutable/sorted_set/subset_spec.rb +47 -0
  265. data/spec/lib/immutable/sorted_set/superset_spec.rb +47 -0
  266. data/spec/lib/immutable/sorted_set/take_spec.rb +54 -0
  267. data/spec/lib/immutable/sorted_set/take_while_spec.rb +33 -0
  268. data/spec/lib/immutable/sorted_set/to_set_spec.rb +17 -0
  269. data/spec/lib/immutable/sorted_set/union_spec.rb +27 -0
  270. data/spec/lib/immutable/sorted_set/up_to_spec.rb +52 -0
  271. data/spec/lib/immutable/sorted_set/values_at_spec.rb +33 -0
  272. data/spec/lib/immutable/vector/add_spec.rb +67 -0
  273. data/spec/lib/immutable/vector/any_spec.rb +69 -0
  274. data/spec/lib/immutable/vector/assoc_spec.rb +45 -0
  275. data/spec/lib/immutable/vector/bsearch_spec.rb +65 -0
  276. data/spec/lib/immutable/vector/clear_spec.rb +33 -0
  277. data/spec/lib/immutable/vector/combination_spec.rb +81 -0
  278. data/spec/lib/immutable/vector/compact_spec.rb +29 -0
  279. data/spec/lib/immutable/vector/compare_spec.rb +31 -0
  280. data/spec/lib/immutable/vector/concat_spec.rb +34 -0
  281. data/spec/lib/immutable/vector/copying_spec.rb +20 -0
  282. data/spec/lib/immutable/vector/count_spec.rb +17 -0
  283. data/spec/lib/immutable/vector/delete_at_spec.rb +53 -0
  284. data/spec/lib/immutable/vector/delete_spec.rb +30 -0
  285. data/spec/lib/immutable/vector/drop_spec.rb +41 -0
  286. data/spec/lib/immutable/vector/drop_while_spec.rb +54 -0
  287. data/spec/lib/immutable/vector/each_index_spec.rb +40 -0
  288. data/spec/lib/immutable/vector/each_spec.rb +44 -0
  289. data/spec/lib/immutable/vector/each_with_index_spec.rb +39 -0
  290. data/spec/lib/immutable/vector/empty_spec.rb +41 -0
  291. data/spec/lib/immutable/vector/eql_spec.rb +76 -0
  292. data/spec/lib/immutable/vector/fetch_spec.rb +64 -0
  293. data/spec/lib/immutable/vector/fill_spec.rb +88 -0
  294. data/spec/lib/immutable/vector/first_spec.rb +18 -0
  295. data/spec/lib/immutable/vector/flat_map_spec.rb +50 -0
  296. data/spec/lib/immutable/vector/flatten_spec.rb +58 -0
  297. data/spec/lib/immutable/vector/get_spec.rb +74 -0
  298. data/spec/lib/immutable/vector/group_by_spec.rb +57 -0
  299. data/spec/lib/immutable/vector/include_spec.rb +30 -0
  300. data/spec/lib/immutable/vector/insert_spec.rb +68 -0
  301. data/spec/lib/immutable/vector/inspect_spec.rb +49 -0
  302. data/spec/lib/immutable/vector/join_spec.rb +58 -0
  303. data/spec/lib/immutable/vector/last_spec.rb +45 -0
  304. data/spec/lib/immutable/vector/length_spec.rb +45 -0
  305. data/spec/lib/immutable/vector/ltlt_spec.rb +65 -0
  306. data/spec/lib/immutable/vector/map_spec.rb +51 -0
  307. data/spec/lib/immutable/vector/marshal_spec.rb +31 -0
  308. data/spec/lib/immutable/vector/maximum_spec.rb +33 -0
  309. data/spec/lib/immutable/vector/minimum_spec.rb +33 -0
  310. data/spec/lib/immutable/vector/multiply_spec.rb +47 -0
  311. data/spec/lib/immutable/vector/new_spec.rb +50 -0
  312. data/spec/lib/immutable/vector/partition_spec.rb +52 -0
  313. data/spec/lib/immutable/vector/permutation_spec.rb +91 -0
  314. data/spec/lib/immutable/vector/pop_spec.rb +26 -0
  315. data/spec/lib/immutable/vector/product_spec.rb +70 -0
  316. data/spec/lib/immutable/vector/reduce_spec.rb +55 -0
  317. data/spec/lib/immutable/vector/reject_spec.rb +43 -0
  318. data/spec/lib/immutable/vector/repeated_combination_spec.rb +77 -0
  319. data/spec/lib/immutable/vector/repeated_permutation_spec.rb +93 -0
  320. data/spec/lib/immutable/vector/reverse_each_spec.rb +31 -0
  321. data/spec/lib/immutable/vector/reverse_spec.rb +21 -0
  322. data/spec/lib/immutable/vector/rindex_spec.rb +36 -0
  323. data/spec/lib/immutable/vector/rotate_spec.rb +73 -0
  324. data/spec/lib/immutable/vector/sample_spec.rb +13 -0
  325. data/spec/lib/immutable/vector/select_spec.rb +63 -0
  326. data/spec/lib/immutable/vector/set_spec.rb +174 -0
  327. data/spec/lib/immutable/vector/shift_spec.rb +27 -0
  328. data/spec/lib/immutable/vector/shuffle_spec.rb +43 -0
  329. data/spec/lib/immutable/vector/slice_spec.rb +240 -0
  330. data/spec/lib/immutable/vector/sorting_spec.rb +56 -0
  331. data/spec/lib/immutable/vector/sum_spec.rb +17 -0
  332. data/spec/lib/immutable/vector/take_spec.rb +42 -0
  333. data/spec/lib/immutable/vector/take_while_spec.rb +34 -0
  334. data/spec/lib/immutable/vector/to_a_spec.rb +41 -0
  335. data/spec/lib/immutable/vector/to_ary_spec.rb +34 -0
  336. data/spec/lib/immutable/vector/to_list_spec.rb +30 -0
  337. data/spec/lib/immutable/vector/to_set_spec.rb +21 -0
  338. data/spec/lib/immutable/vector/transpose_spec.rb +48 -0
  339. data/spec/lib/immutable/vector/uniq_spec.rb +76 -0
  340. data/spec/lib/immutable/vector/unshift_spec.rb +28 -0
  341. data/spec/lib/immutable/vector/update_in_spec.rb +82 -0
  342. data/spec/lib/immutable/vector/values_at_spec.rb +33 -0
  343. data/spec/lib/immutable/vector/zip_spec.rb +57 -0
  344. data/spec/lib/load_spec.rb +42 -0
  345. data/spec/spec_helper.rb +92 -0
  346. metadata +830 -0
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#reverse_each" do
5
+ [2, 31, 32, 33, 1000, 1024, 1025, 2000].each do |size|
6
+ context "on a #{size}-item vector" do
7
+ let(:vector) { V[1..size] }
8
+
9
+ context "with a block (internal iteration)" do
10
+ it "returns self" do
11
+ vector.reverse_each {}.should be(vector)
12
+ end
13
+
14
+ it "yields all items in the opposite order as #each" do
15
+ result = []
16
+ vector.reverse_each { |item| result << item }
17
+ result.should eql(vector.to_a.reverse)
18
+ end
19
+ end
20
+
21
+ context "with no block" do
22
+ it "returns an Enumerator" do
23
+ result = vector.reverse_each
24
+ result.class.should be(Enumerator)
25
+ result.to_a.should eql(vector.to_a.reverse)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#reverse" do
5
+ [
6
+ [[], []],
7
+ [[1], [1]],
8
+ [[1,2], [2,1]],
9
+ [(1..32).to_a, (1..32).to_a.reverse],
10
+ [(1..33).to_a, (1..33).to_a.reverse],
11
+ [(1..100).to_a, (1..100).to_a.reverse],
12
+ [(1..1024).to_a, (1..1024).to_a.reverse]
13
+ ].each do |initial, expected|
14
+ describe "on #{initial}" do
15
+ it "returns #{expected}" do
16
+ V.new(initial).reverse.should eql(V.new(expected))
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,36 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#rindex" do
5
+ let(:vector) { V[1,2,3,3,2,1] }
6
+
7
+ context "when passed an object present in the vector" do
8
+ it "returns the last index where the object is present" do
9
+ vector.rindex(1).should be(5)
10
+ vector.rindex(2).should be(4)
11
+ vector.rindex(3).should be(3)
12
+ end
13
+ end
14
+
15
+ context "when passed an object not present in the vector" do
16
+ it "returns nil" do
17
+ vector.rindex(0).should be_nil
18
+ vector.rindex(nil).should be_nil
19
+ vector.rindex('string').should be_nil
20
+ end
21
+ end
22
+
23
+ context "with a block" do
24
+ it "returns the last index of an object which the predicate is true for" do
25
+ vector.rindex { |n| n > 2 }.should be(3)
26
+ end
27
+ end
28
+
29
+ context "without an argument OR block" do
30
+ it "returns an Enumerator" do
31
+ vector.rindex.class.should be(Enumerator)
32
+ vector.rindex.each { |n| n > 2 }.should be(3)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,73 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#rotate" do
5
+ let(:vector) { V[1,2,3,4,5] }
6
+
7
+ context "when passed no argument" do
8
+ it "returns a new vector with the first element moved to the end" do
9
+ vector.rotate.should eql(V[2,3,4,5,1])
10
+ end
11
+ end
12
+
13
+ context "with an integral argument n" do
14
+ it "returns a new vector with the first (n % size) elements moved to the end" do
15
+ vector.rotate(2).should eql(V[3,4,5,1,2])
16
+ vector.rotate(3).should eql(V[4,5,1,2,3])
17
+ vector.rotate(4).should eql(V[5,1,2,3,4])
18
+ vector.rotate(5).should eql(V[1,2,3,4,5])
19
+ vector.rotate(-1).should eql(V[5,1,2,3,4])
20
+ end
21
+ end
22
+
23
+ context "with a floating-point argument n" do
24
+ it "coerces the argument to integer using to_int" do
25
+ vector.rotate(2.1).should eql(V[3,4,5,1,2])
26
+ end
27
+ end
28
+
29
+ context "with a non-numeric argument" do
30
+ it "raises a TypeError" do
31
+ -> { vector.rotate('hello') }.should raise_error(TypeError)
32
+ end
33
+ end
34
+
35
+ context "with an argument of zero" do
36
+ it "returns self" do
37
+ vector.rotate(0).should be(vector)
38
+ end
39
+ end
40
+
41
+ context "with an argument equal to the vector's size" do
42
+ it "returns self" do
43
+ vector.rotate(5).should be(vector)
44
+ end
45
+ end
46
+
47
+ [31, 32, 33, 1000, 1023, 1024, 1025].each do |size|
48
+ context "on a #{size}-item vector" do
49
+ it "behaves like Array#rotate" do
50
+ array = (1..size).to_a
51
+ vector = V.new(array)
52
+ 10.times do
53
+ offset = rand(size)
54
+ vector.rotate(offset).should == array.rotate(offset)
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ context "from a subclass" do
61
+ it "returns an instance of the subclass" do
62
+ subclass = Class.new(Immutable::Vector)
63
+ instance = subclass.new([1,2,3])
64
+ instance.rotate(2).class.should be(subclass)
65
+ end
66
+ end
67
+
68
+ it "leaves the original unmodified" do
69
+ vector.rotate(3)
70
+ vector.should eql(V[1,2,3,4,5])
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#sample" do
5
+ let(:vector) { V.new(1..10) }
6
+
7
+ it "returns a randomly chosen item" do
8
+ chosen = 100.times.map { vector.sample }
9
+ chosen.each { |item| vector.include?(item).should == true }
10
+ vector.each { |item| chosen.include?(item).should == true }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,63 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ [:select, :find_all].each do |method|
5
+ describe "##{method}" do
6
+ let(:vector) { V["A", "B", "C"] }
7
+
8
+ describe "with a block" do
9
+ it "preserves the original" do
10
+ vector.send(method) { |item| item == "A" }
11
+ vector.should eql(V["A", "B", "C"])
12
+ end
13
+
14
+ it "returns a vector with the matching values" do
15
+ vector.send(method) { |item| item == "A" }.should eql(V["A"])
16
+ end
17
+ end
18
+
19
+ describe "with no block" do
20
+ it "returns an Enumerator" do
21
+ vector.send(method).class.should be(Enumerator)
22
+ vector.send(method).each { |item| item == "A" }.should eql(V["A"])
23
+ end
24
+ end
25
+
26
+ describe "when nothing matches" do
27
+ it "preserves the original" do
28
+ vector.send(method) { |item| false }
29
+ vector.should eql(V["A", "B", "C"])
30
+ end
31
+
32
+ it "returns an empty vector" do
33
+ vector.send(method) { |item| false }.should equal(V.empty)
34
+ end
35
+ end
36
+
37
+ context "on an empty vector" do
38
+ it "returns self" do
39
+ V.empty.send(method) { |item| true }.should be(V.empty)
40
+ end
41
+ end
42
+
43
+ context "from a subclass" do
44
+ it "returns an instance of the subclass" do
45
+ subclass = Class.new(Immutable::Vector)
46
+ instance = subclass[1,2,3]
47
+ instance.send(method) { |x| x > 1 }.class.should be(subclass)
48
+ end
49
+ end
50
+
51
+ it "works with a variety of inputs" do
52
+ [1, 2, 10, 31, 32, 33, 1023, 1024, 1025].each do |size|
53
+ [0, 5, 32, 50, 500, 800, 1024].each do |threshold|
54
+ vector = V.new(1..size)
55
+ result = vector.send(method) { |item| item <= threshold }
56
+ result.size.should == [size, threshold].min
57
+ result.should eql(V.new(1..[size, threshold].min))
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,174 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ let(:vector) { V[*values] }
5
+
6
+ describe "#set" do
7
+ context "when empty" do
8
+ let(:vector) { V.empty }
9
+
10
+ it "raises an error for index -1" do
11
+ expect { vector.set(-1, :a) }.to raise_error
12
+ end
13
+
14
+ it "allows indexes 0 and 1 to be set" do
15
+ vector.set(0, :a).should eql(V[:a])
16
+ vector.set(1, :a).should eql(V[nil, :a])
17
+ end
18
+ end
19
+
20
+ context "when not empty" do
21
+ let(:vector) { V["A", "B", "C"] }
22
+
23
+ context "with a block" do
24
+ context "and a positive index" do
25
+ context "within the absolute bounds of the vector" do
26
+ it "passes the current value to the block" do
27
+ vector.set(1) { |value| value.should == "B" }
28
+ end
29
+
30
+ it "replaces the value with the result of the block" do
31
+ result = vector.set(1) { |value| "FLIBBLE" }
32
+ result.should eql(V["A", "FLIBBLE", "C"])
33
+ end
34
+
35
+ it "supports to_proc methods" do
36
+ result = vector.set(1, &:downcase)
37
+ result.should eql(V["A", "b", "C"])
38
+ end
39
+ end
40
+
41
+ context "just past the end of the vector" do
42
+ it "passes nil to the block and adds a new value" do
43
+ result = vector.set(3) { |value| value.should be_nil; "D" }
44
+ result.should eql(V["A", "B", "C", "D"])
45
+ end
46
+ end
47
+
48
+ context "further outside the bounds of the vector" do
49
+ it "passes nil to the block, fills up missing nils, and adds a new value" do
50
+ result = vector.set(5) { |value| value.should be_nil; "D" }
51
+ result.should eql(V["A", "B", "C", nil, nil, "D"])
52
+ end
53
+ end
54
+ end
55
+
56
+ context "and a negative index" do
57
+ context "within the absolute bounds of the vector" do
58
+ it "passes the current value to the block" do
59
+ vector.set(-2) { |value| value.should == "B" }
60
+ end
61
+
62
+ it "replaces the value with the result of the block" do
63
+ result = vector.set(-2) { |value| "FLIBBLE" }
64
+ result.should eql(V["A", "FLIBBLE", "C"])
65
+ end
66
+
67
+ it "supports to_proc methods" do
68
+ result = vector.set(-2, &:downcase)
69
+ result.should eql(V["A", "b", "C"])
70
+ end
71
+ end
72
+
73
+ context "outside the absolute bounds of the vector" do
74
+ it "raises an error" do
75
+ expect { vector.set(-vector.size.next) {} }.to raise_error
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ context "with a value" do
82
+ context "and a positive index" do
83
+ context "within the absolute bounds of the vector" do
84
+ let(:set) { vector.set(1, "FLIBBLE") }
85
+
86
+ it "preserves the original" do
87
+ vector.should eql(V["A", "B", "C"])
88
+ end
89
+
90
+ it "sets the new value at the specified index" do
91
+ set.should eql(V["A", "FLIBBLE", "C"])
92
+ end
93
+ end
94
+
95
+ context "just past the end of the vector" do
96
+ it "adds a new value" do
97
+ result = vector.set(3, "FLIBBLE")
98
+ result.should eql(V["A", "B", "C", "FLIBBLE"])
99
+ end
100
+ end
101
+
102
+ context "outside the absolute bounds of the vector" do
103
+ it "fills up with nils" do
104
+ result = vector.set(5, "FLIBBLE")
105
+ result.should eql(V["A", "B", "C", nil, nil, "FLIBBLE"])
106
+ end
107
+ end
108
+ end
109
+
110
+ context "with a negative index" do
111
+ let(:set) { vector.set(-2, "FLIBBLE") }
112
+
113
+ it "preserves the original" do
114
+ set
115
+ vector.should eql(V["A", "B", "C"])
116
+ end
117
+
118
+ it "sets the new value at the specified index" do
119
+ set.should eql(V["A", "FLIBBLE", "C"])
120
+ end
121
+ end
122
+
123
+ context "outside the absolute bounds of the vector" do
124
+ it "raises an error" do
125
+ expect { vector.set(-vector.size.next, "FLIBBLE") }.to raise_error
126
+ end
127
+ end
128
+ end
129
+ end
130
+
131
+ context "from a subclass" do
132
+ it "returns an instance of the subclass" do
133
+ subclass = Class.new(Immutable::Vector)
134
+ instance = subclass[1,2,3]
135
+ instance.set(1, 2.5).class.should be(subclass)
136
+ end
137
+ end
138
+
139
+ [10, 31, 32, 33, 1000, 1023, 1024, 1025, 2000].each do |size|
140
+ context "on a #{size}-item vector" do
141
+ it "works correctly" do
142
+ array = (1..size).to_a
143
+ vector = V.new(array)
144
+
145
+ [0, 1, 10, 31, 32, 33, 100, 500, 1000, 1023, 1024, 1025, 1998, 1999].select { |n| n < size }.each do |i|
146
+ value = rand(10000)
147
+ array[i] = value
148
+ vector = vector.set(i, value)
149
+ vector[i].should be(value)
150
+ end
151
+
152
+ 0.upto(size-1) do |i|
153
+ vector.get(i).should == array[i]
154
+ end
155
+ end
156
+ end
157
+ end
158
+
159
+ context "with an identical value to an existing item" do
160
+ [1, 2, 5, 31,32, 33, 100, 200].each do |size|
161
+ context "on a #{size}-item vector" do
162
+ let(:array) { (0...size).map { |x| x * x} }
163
+ let(:vector) { V.new(array) }
164
+
165
+ it "returns self" do
166
+ (0...size).each do |index|
167
+ vector.set(index, index * index).should equal(vector)
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#shift" do
5
+ [
6
+ [[], []],
7
+ [["A"], []],
8
+ [%w[A B C], %w[B C]],
9
+ [1..31, 2..31],
10
+ [1..32, 2..32],
11
+ [1..33, 2..33]
12
+ ].each do |values, expected|
13
+ context "on #{values.inspect}" do
14
+ let(:vector) { V[*values] }
15
+
16
+ it "preserves the original" do
17
+ vector.shift
18
+ vector.should eql(V[*values])
19
+ end
20
+
21
+ it "returns #{expected.inspect}" do
22
+ vector.shift.should eql(V[*expected])
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end