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,65 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#bsearch" do
5
+ let(:vector) { V[5,10,20,30] }
6
+
7
+ context "with a block which returns false for elements below desired position, and true for those at/above" do
8
+ it "returns the first element for which the predicate is true" do
9
+ vector.bsearch { |x| x > 10 }.should be(20)
10
+ vector.bsearch { |x| x > 1 }.should be(5)
11
+ vector.bsearch { |x| x > 25 }.should be(30)
12
+ end
13
+
14
+ context "if the block always returns false" do
15
+ it "returns nil" do
16
+ vector.bsearch { false }.should be_nil
17
+ end
18
+ end
19
+
20
+ context "if the block always returns true" do
21
+ it "returns the first element" do
22
+ vector.bsearch { true }.should be(5)
23
+ end
24
+ end
25
+ end
26
+
27
+ context "with a block which returns a negative number for elements below desired position, zero for the right element, and positive for those above" do
28
+ it "returns the element for which the block returns zero" do
29
+ vector.bsearch { |x| x <=> 10 }.should be(10)
30
+ end
31
+
32
+ context "if the block always returns positive" do
33
+ it "returns nil" do
34
+ vector.bsearch { 1 }.should be_nil
35
+ end
36
+ end
37
+
38
+ context "if the block always returns negative" do
39
+ it "returns nil" do
40
+ vector.bsearch { -1 }.should be_nil
41
+ end
42
+ end
43
+
44
+ context "if the block returns sometimes positive, sometimes negative, but never zero" do
45
+ it "returns nil" do
46
+ vector.bsearch { |x| x <=> 11 }.should be_nil
47
+ end
48
+ end
49
+
50
+ context "if not passed a block" do
51
+ it "returns an Enumerator" do
52
+ enum = vector.bsearch
53
+ enum.should be_a(Enumerator)
54
+ enum.each { |x| x <=> 10 }.should == 10
55
+ end
56
+ end
57
+ end
58
+
59
+ context "on an empty vector" do
60
+ it "returns nil" do
61
+ V.empty.bsearch { |x| x > 5 }.should be_nil
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,33 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#clear" do
5
+ [
6
+ [],
7
+ ["A"],
8
+ %w[A B C],
9
+ ].each do |values|
10
+ describe "on #{values}" do
11
+ let(:vector) { V[*values] }
12
+
13
+ it "preserves the original" do
14
+ vector.clear
15
+ vector.should eql(V[*values])
16
+ end
17
+
18
+ it "returns an empty vector" do
19
+ vector.clear.should equal(V.empty)
20
+ end
21
+ end
22
+
23
+ context "from a subclass" do
24
+ it "returns an instance of the subclass" do
25
+ subclass = Class.new(Immutable::Vector)
26
+ instance = subclass.new(%w{a b c})
27
+ instance.clear.class.should be(subclass)
28
+ instance.clear.should be_empty
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,81 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#combination" do
5
+ let(:vector) { V[1,2,3,4] }
6
+
7
+ context "with a block" do
8
+ it "returns self" do
9
+ vector.combination(2) {}.should be(vector)
10
+ end
11
+ end
12
+
13
+ context "with no block" do
14
+ it "returns an Enumerator" do
15
+ vector.combination(2).class.should be(Enumerator)
16
+ vector.combination(2).to_a.should == vector.to_a.combination(2).to_a
17
+ end
18
+ end
19
+
20
+ context "when passed an argument which is out of bounds" do
21
+ it "yields nothing and returns self" do
22
+ vector.combination(5) { fail }.should be(vector)
23
+ vector.combination(-1) { fail }.should be(vector)
24
+ end
25
+ end
26
+
27
+ context "when passed an argument zero" do
28
+ it "yields an empty array" do
29
+ result = []
30
+ vector.combination(0) { |obj| result << obj }
31
+ result.should eql([[]])
32
+ end
33
+ end
34
+
35
+ context "when passed an argument equal to the vector's length" do
36
+ it "yields self as an array" do
37
+ result = []
38
+ vector.combination(4) { |obj| result << obj }
39
+ result.should eql([vector.to_a])
40
+ end
41
+ end
42
+
43
+ context "when passed an argument 1" do
44
+ it "yields each item in the vector, as single-item vectors" do
45
+ result = []
46
+ vector.combination(1) { |obj| result << obj }
47
+ result.should eql([[1], [2], [3], [4]])
48
+ end
49
+ end
50
+
51
+ context "when passed another integral argument" do
52
+ it "yields all combinations of the given length" do
53
+ result = []
54
+ vector.combination(3) { |obj| result << obj }
55
+ result.should eql([[1,2,3], [1,2,4], [1,3,4], [2,3,4]])
56
+ end
57
+ end
58
+
59
+ context "on an empty vector" do
60
+ it "works the same" do
61
+ V.empty.combination(0).to_a.should == [[]]
62
+ V.empty.combination(1).to_a.should == []
63
+ end
64
+ end
65
+
66
+ it "works on many combinations of input" do
67
+ 0.upto(5) do |comb_size|
68
+ array = 12.times.map { rand(1000) }
69
+ V.new(array).combination(comb_size).to_a.should == array.combination(comb_size).to_a
70
+ end
71
+
72
+ array = 20.times.map { rand(1000) }
73
+ V.new(array).combination(2).to_a.should == array.combination(2).to_a
74
+ end
75
+
76
+ it "leaves the original unmodified" do
77
+ vector.combination(2) {}
78
+ vector.should eql(V[1,2,3,4])
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,29 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#compact" do
5
+ it "returns a new Vector with all nils removed" do
6
+ V[1, nil, 2, nil].compact.should eql(V[1, 2])
7
+ V[1, 2, 3].compact.should eql(V[1, 2, 3])
8
+ V[nil].compact.should eql(V.empty)
9
+ end
10
+
11
+ context "on an empty vector" do
12
+ it "returns self" do
13
+ V.empty.compact.should be(V.empty)
14
+ end
15
+ end
16
+
17
+ it "doesn't remove false" do
18
+ V[false].compact.should eql(V[false])
19
+ end
20
+
21
+ context "from a subclass" do
22
+ it "returns an instance of the subclass" do
23
+ subclass = Class.new(V)
24
+ instance = subclass[1, nil, 2]
25
+ instance.compact.class.should be(subclass)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#<=>" do
5
+ [
6
+ [[], [1]],
7
+ [[1], [2]],
8
+ [[1], [1, 2]],
9
+ [[2, 3, 4], [3, 4, 5]],
10
+ [[[0]], [[1]]]
11
+ ].each do |items1, items2|
12
+ describe "with #{items1} and #{items2}" do
13
+ it "returns -1" do
14
+ (V.new(items1) <=> V.new(items2)).should be(-1)
15
+ end
16
+ end
17
+
18
+ describe "with #{items2} and #{items1}" do
19
+ it "returns 1" do
20
+ (V.new(items2) <=> V.new(items1)).should be(1)
21
+ end
22
+ end
23
+
24
+ describe "with #{items1} and #{items1}" do
25
+ it "returns 0" do
26
+ (V.new(items1) <=> V.new(items1)).should be(0)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,34 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ [:+, :concat].each do |method|
5
+ describe "##{method}" do
6
+ let(:vector) { V.new(1..100) }
7
+
8
+ it "preserves the original" do
9
+ vector.concat([1,2,3])
10
+ vector.should eql(V.new(1..100))
11
+ end
12
+
13
+ it "appends the elements in the other enumerable" do
14
+ vector.concat([1,2,3]).should eql(V.new((1..100).to_a + [1,2,3]))
15
+ vector.concat(1..1000).should eql(V.new((1..100).to_a + (1..1000).to_a))
16
+ vector.concat(1..200).size.should == 300
17
+ vector.concat(vector).should eql(V.new((1..100).to_a * 2))
18
+ vector.concat(V.empty).should eql(vector)
19
+ V.empty.concat(vector).should eql(vector)
20
+ end
21
+
22
+ [1, 31, 32, 33, 1023, 1024, 1025].each do |size|
23
+ context "on a #{size}-item vector" do
24
+ it "works the same" do
25
+ vector = V.new(1..size)
26
+ result = vector.concat((size+1)..size+10)
27
+ result.size.should == size + 10
28
+ result.should eql(V.new(1..(size+10)))
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ [:dup, :clone].each do |method|
5
+ [
6
+ [],
7
+ ["A"],
8
+ %w[A B C],
9
+ (1..32),
10
+ ].each do |values|
11
+ describe "on #{values.inspect}" do
12
+ let(:vector) { V[*values] }
13
+
14
+ it "returns self" do
15
+ vector.send(method).should equal(vector)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,17 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#count" do
5
+ it "returns the number of elements" do
6
+ V[:a, :b, :c].count.should == 3
7
+ end
8
+
9
+ it "returns the number of elements that equal the argument" do
10
+ V[:a, :b, :b, :c].count(:b).should == 2
11
+ end
12
+
13
+ it "returns the number of element for which the block evaluates to true" do
14
+ V[:a, :b, :c].count { |s| s != :b }.should == 2
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,53 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#delete_at" do
5
+ let(:vector) { V[1,2,3,4,5] }
6
+
7
+ it "removes the element at the specified index" do
8
+ vector.delete_at(0).should eql(V[2,3,4,5])
9
+ vector.delete_at(2).should eql(V[1,2,4,5])
10
+ vector.delete_at(-1).should eql(V[1,2,3,4])
11
+ end
12
+
13
+ it "makes no modification if the index is out of range" do
14
+ vector.delete_at(5).should eql(vector)
15
+ vector.delete_at(-6).should eql(vector)
16
+ end
17
+
18
+ it "works when deleting last item at boundary where vector trie needs to get shallower" do
19
+ vector = Immutable::Vector.new(1..33)
20
+ vector.delete_at(32).size.should == 32
21
+ vector.delete_at(32).to_a.should eql((1..32).to_a)
22
+ end
23
+
24
+ it "works on an empty vector" do
25
+ V.empty.delete_at(0).should be(V.empty)
26
+ V.empty.delete_at(1).should be(V.empty)
27
+ end
28
+
29
+ it "works on a vector with 1 item" do
30
+ V[10].delete_at(0).should eql(V.empty)
31
+ V[10].delete_at(1).should eql(V[10])
32
+ end
33
+
34
+ it "works on a vector with 32 items" do
35
+ V.new(1..32).delete_at(0).should eql(V.new(2..32))
36
+ V.new(1..32).delete_at(31).should eql(V.new(1..31))
37
+ end
38
+
39
+ it "has the right size and contents after many deletions" do
40
+ array = (1..2000).to_a # we use an Array as standard of correctness
41
+ vector = Immutable::Vector.new(array)
42
+ 500.times do
43
+ index = rand(vector.size)
44
+ vector = vector.delete_at(index)
45
+ array.delete_at(index)
46
+ vector.size.should == array.size
47
+ ary = vector.to_a
48
+ ary.size.should == vector.size
49
+ ary.should eql(array)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,30 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#delete" do
5
+ it "removes elements that are #== to the argument" do
6
+ V[1,2,3].delete(1).should eql(V[2,3])
7
+ V[1,2,3].delete(2).should eql(V[1,3])
8
+ V[1,2,3].delete(3).should eql(V[1,2])
9
+ V[1,2,3].delete(0).should eql(V[1,2,3])
10
+ V['a','b','a','c','a','a','d'].delete('a').should eql(V['b','c','d'])
11
+
12
+ V[EqualNotEql.new, EqualNotEql.new].delete(:something).should eql(V.empty)
13
+ V[EqlNotEqual.new, EqlNotEqual.new].delete(:something).should_not be_empty
14
+ end
15
+
16
+ context "on an empty vector" do
17
+ it "returns self" do
18
+ V.empty.delete(1).should be(V.empty)
19
+ end
20
+ end
21
+
22
+ context "on a subclass of Vector" do
23
+ it "returns an instance of the subclass" do
24
+ subclass = Class.new(Immutable::Vector)
25
+ instance = subclass.new([1,2,3])
26
+ instance.delete(1).class.should be(subclass)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,41 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#drop" do
5
+ [
6
+ [[], 10, []],
7
+ [["A"], 10, []],
8
+ [["A"], 1, []],
9
+ [["A"], 0, ["A"]],
10
+ [%w[A B C], 0, %w[A B C]],
11
+ [%w[A B C], 2, ["C"]],
12
+ [(1..32), 3, (4..32)],
13
+ [(1..33), 32, [33]]
14
+ ].each do |values, number, expected|
15
+ describe "#{number} from #{values.inspect}" do
16
+ let(:vector) { V[*values] }
17
+
18
+ it "preserves the original" do
19
+ vector.drop(number)
20
+ vector.should eql(V[*values])
21
+ end
22
+
23
+ it "returns #{expected.inspect}" do
24
+ vector.drop(number).should eql(V[*expected])
25
+ end
26
+ end
27
+ end
28
+
29
+ it "raises an ArgumentError if number of elements specified is negative" do
30
+ -> { V[1, 2, 3].drop(-1) }.should raise_error(ArgumentError)
31
+ -> { V[1, 2, 3].drop(-3) }.should raise_error(ArgumentError)
32
+ end
33
+
34
+ context "when number of elements specified is zero" do
35
+ let(:vector) { V[1, 2, 3, 4, 5, 6] }
36
+ it "returns self" do
37
+ vector.drop(0).should be(vector)
38
+ end
39
+ end
40
+ end
41
+ end