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,18 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#first" do
5
+ [
6
+ [[], nil],
7
+ [["A"], "A"],
8
+ [%w[A B C], "A"],
9
+ [(1..32), 1],
10
+ ].each do |values, expected|
11
+ describe "on #{values.inspect}" do
12
+ it "returns #{expected.inspect}" do
13
+ V[*values].first.should == expected
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,50 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ let(:vector) { V[*values] }
5
+
6
+ describe "#flat_map" do
7
+ let(:block) { ->(item) { [item, item + 1, item * item] } }
8
+ let(:flat_map) { vector.flat_map(&block) }
9
+ let(:flattened_vector) { V[*flattened_values] }
10
+
11
+ shared_examples "checking flattened result" do
12
+ it "returns the flattened values as an Immutable::Vector" do
13
+ expect(flat_map).to eq(flattened_vector)
14
+ end
15
+
16
+ it "returns an Immutable::Vector" do
17
+ expect(flat_map).to be_a(Immutable::Vector)
18
+ end
19
+ end
20
+
21
+ context "with an empty vector" do
22
+ let(:values) { [] }
23
+ let(:flattened_values) { [] }
24
+
25
+ include_examples "checking flattened result"
26
+ end
27
+
28
+ context "with a block that returns an empty vector" do
29
+ let(:block) { ->(item) { [] } }
30
+ let(:values) { [1, 2, 3] }
31
+ let(:flattened_values) { [] }
32
+
33
+ include_examples "checking flattened result"
34
+ end
35
+
36
+ context "with a vector of one item" do
37
+ let(:values) { [7] }
38
+ let(:flattened_values) { [7, 8, 49] }
39
+
40
+ include_examples "checking flattened result"
41
+ end
42
+
43
+ context "with a vector of multiple items" do
44
+ let(:values) { [1, 2, 3] }
45
+ let(:flattened_values) { [1, 2, 1, 2, 3, 4, 3, 4, 9] }
46
+
47
+ include_examples "checking flattened result"
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,58 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#flatten" do
5
+ it "recursively flattens nested vectors into containing vector" do
6
+ V[V[1], V[2]].flatten.should eql(V[1,2])
7
+ V[V[V[V[V[V[1,2,3]]]]]].flatten.should eql(V[1,2,3])
8
+ V[V[V[1]], V[V[V[2]]]].flatten.should eql(V[1,2])
9
+ end
10
+
11
+ it "flattens nested arrays as well" do
12
+ V[[1,2,3],[[4],[5,6]]].flatten.should eql(V[1,2,3,4,5,6])
13
+ end
14
+
15
+ context "with an integral argument" do
16
+ it "only flattens down to the specified depth" do
17
+ V[V[V[1,2]]].flatten(1).should eql(V[V[1,2]])
18
+ V[V[V[V[1]], V[2], V[3]]].flatten(2).should eql(V[V[1], 2, 3])
19
+ end
20
+ end
21
+
22
+ context "with an argument of zero" do
23
+ it "returns self" do
24
+ vector = V[1,2,3]
25
+ vector.flatten(0).should be(vector)
26
+ end
27
+ end
28
+
29
+ context "on a subclass" do
30
+ it "returns an instance of the subclass" do
31
+ subclass = Class.new(Immutable::Vector)
32
+ instance = subclass.new([1,2])
33
+ instance.flatten.class.should be(subclass)
34
+ end
35
+ end
36
+
37
+ context "on a vector with no nested vectors" do
38
+ it "returns an unchanged vector" do
39
+ vector = V[1,2,3]
40
+ vector.flatten.should.eql?(V[1,2,3])
41
+ end
42
+
43
+ context "on a Vector larger than 32 items initialized with Vector.new" do
44
+ # Regression test, for problem discovered while working on GH issue #182
45
+ it "returns an unchanged vector" do
46
+ vector1,vector2 = 2.times.collect { V.new(0..33) }
47
+ vector1.flatten.should eql(vector2)
48
+ end
49
+ end
50
+ end
51
+
52
+ it "leaves the original unmodified" do
53
+ vector = V[1,2,3]
54
+ vector.flatten
55
+ vector.should eql(V[1,2,3])
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,74 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ [:get, :at].each do |method|
5
+ describe "##{method}" do
6
+ context "when empty" do
7
+ it "always returns nil" do
8
+ (-1..1).each do |i|
9
+ V.empty.send(method, i).should be_nil
10
+ end
11
+ end
12
+ end
13
+
14
+ context "when not empty" do
15
+ let(:vector) { V[*(1..1025)] }
16
+
17
+ context "with a positive index" do
18
+ context "within the absolute bounds of the vector" do
19
+ it "returns the value at the specified index from the head" do
20
+ (0..(vector.size - 1)).each do |i|
21
+ vector.send(method, i).should == i + 1
22
+ end
23
+ end
24
+ end
25
+
26
+ context "outside the absolute bounds of the vector" do
27
+ it "returns nil" do
28
+ vector.send(method, vector.size).should be_nil
29
+ end
30
+ end
31
+ end
32
+
33
+ context "with a negative index" do
34
+ context "within the absolute bounds of the vector" do
35
+ it "returns the value at the specified index from the tail" do
36
+ (-vector.size..-1).each do |i|
37
+ vector.send(method, i).should == vector.size + i + 1
38
+ end
39
+ end
40
+ end
41
+
42
+ context "outside the absolute bounds of the vector" do
43
+ it "returns nil" do
44
+ vector.send(method, -vector.size.next).should be_nil
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ [1, 10, 31, 32, 33, 1024, 1025, 2000].each do |size|
51
+ context "on a #{size}-item vector" do
52
+ it "works correctly, even after various addings and removings" do
53
+ array = size.times.map { rand(10000) }
54
+ vector = V.new(array)
55
+ 100.times do
56
+ if rand(2) == 0
57
+ value, index = rand(10000), rand(size)
58
+ array[index] = value
59
+ vector = vector.set(index, value)
60
+ else
61
+ index = rand(array.size)
62
+ array.delete_at(index)
63
+ vector = vector.delete_at(index)
64
+ end
65
+ end
66
+ 0.upto(array.size) do |i|
67
+ array[i].should == vector.send(method, i)
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,57 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#group_by" do
5
+ context "with a block" do
6
+ [
7
+ [[], []],
8
+ [[1], [true => V[1]]],
9
+ [[1, 2, 3, 4], [true => V[1, 3], false => V[2, 4]]],
10
+ ].each do |values, expected|
11
+ context "on #{values.inspect}" do
12
+ let(:vector) { V[*values] }
13
+
14
+ it "returns #{expected.inspect}" do
15
+ vector.group_by(&:odd?).should eql(H[*expected])
16
+ vector.should eql(V.new(values)) # make sure it hasn't changed
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ context "without a block" do
23
+ [
24
+ [[], []],
25
+ [[1], [1 => V[1]]],
26
+ [[1, 2, 3, 4], [1 => V[1], 2 => V[2], 3 => V[3], 4 => V[4]]],
27
+ ].each do |values, expected|
28
+ context "on #{values.inspect}" do
29
+ let(:vector) { V[*values] }
30
+
31
+ it "returns #{expected.inspect}" do
32
+ vector.group_by.should eql(H[*expected])
33
+ vector.should eql(V.new(values)) # make sure it hasn't changed
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ context "on an empty vector" do
40
+ it "returns an empty hash" do
41
+ V.empty.group_by { |x| x }.should eql(H.empty)
42
+ end
43
+ end
44
+
45
+ it "returns a hash without default proc" do
46
+ V[1,2,3].group_by { |x| x }.default_proc.should be_nil
47
+ end
48
+
49
+ context "from a subclass" do
50
+ it "returns an Hash whose values are instances of the subclass" do
51
+ subclass = Class.new(Immutable::Vector)
52
+ instance = subclass.new([1, 'string', :symbol])
53
+ instance.group_by { |x| x.class }.values.each { |v| v.class.should be(subclass) }
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,30 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ [:include?, :member?].each do |method|
5
+ describe "##{method}" do
6
+ [
7
+ [[], "A", false],
8
+ [[], nil, false],
9
+ [["A"], "A", true],
10
+ [["A"], "B", false],
11
+ [["A"], nil, false],
12
+ [["A", "B", nil], "A", true],
13
+ [["A", "B", nil], "B", true],
14
+ [["A", "B", nil], nil, true],
15
+ [["A", "B", nil], "C", false],
16
+ [["A", "B", false], false, true],
17
+ [[2], 2, true],
18
+ [[2], 2.0, true],
19
+ [[2.0], 2.0, true],
20
+ [[2.0], 2, true],
21
+ ].each do |values, item, expected|
22
+ describe "on #{values.inspect}" do
23
+ it "returns #{expected.inspect}" do
24
+ V[*values].send(method, item).should == expected
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,68 @@
1
+ require "spec_helper"
2
+ require 'pry'
3
+
4
+ describe Immutable::Vector do
5
+ describe "#insert" do
6
+ let(:original) { V[1, 2, 3] }
7
+
8
+ it "can add items at the beginning of a vector" do
9
+ vector = original.insert(0, :a, :b)
10
+ vector.size.should be(5)
11
+ vector.at(0).should be(:a)
12
+ vector.at(2).should be(1)
13
+ end
14
+
15
+ it "can add items in the middle of a vector" do
16
+ vector = original.insert(1, :a, :b, :c)
17
+ vector.size.should be(6)
18
+ vector.to_a.should == [1, :a, :b, :c, 2, 3]
19
+ end
20
+
21
+ it "can add items at the end of a vector" do
22
+ vector = original.insert(3, :a, :b, :c)
23
+ vector.size.should be(6)
24
+ vector.to_a.should == [1, 2, 3, :a, :b, :c]
25
+ end
26
+
27
+ it "can add items past the end of a vector" do
28
+ vector = original.insert(6, :a, :b)
29
+ vector.size.should be(8)
30
+ vector.to_a.should == [1, 2, 3, nil, nil, nil, :a, :b]
31
+ end
32
+
33
+ it "accepts a negative index, which counts back from the end of the vector" do
34
+ vector = original.insert(-2, :a)
35
+ vector.size.should be(4)
36
+ vector.to_a.should == [1, :a, 2, 3]
37
+ end
38
+
39
+ it "raises IndexError if a negative index is too great" do
40
+ expect { original.insert(-4, :a) }.to raise_error(IndexError)
41
+ end
42
+
43
+ it "works when adding an item past boundary when vector trie needs to deepen" do
44
+ vector = original.insert(32, :a, :b)
45
+ vector.size.should == 34
46
+ vector.to_a.size.should == 34
47
+ end
48
+
49
+ it "works when adding to an empty Vector" do
50
+ V.empty.insert(0, :a).should eql(V[:a])
51
+ end
52
+
53
+ it "has the right size and contents after many insertions" do
54
+ array = (1..4000).to_a # we use an Array as standard of correctness
55
+ vector = Immutable::Vector.new(array)
56
+ 100.times do
57
+ items = rand(10).times.map { rand(10000) }
58
+ index = rand(vector.size)
59
+ vector = vector.insert(index, *items)
60
+ array.insert(index, *items)
61
+ vector.size.should == array.size
62
+ ary = vector.to_a
63
+ ary.size.should == vector.size
64
+ ary.should eql(array)
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,49 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ let(:vector) { V[*values] }
5
+
6
+ describe "#inspect" do
7
+ let(:inspect) { vector.inspect }
8
+
9
+ shared_examples "checking output" do
10
+ it "returns its contents as a programmer-readable string" do
11
+ expect(inspect).to eq(output)
12
+ end
13
+
14
+ it "returns a string which can be eval'd to get back an equivalent vector" do
15
+ expect(eval(inspect)).to eql(vector)
16
+ end
17
+ end
18
+
19
+ context "with an empty array" do
20
+ let(:output) { "Immutable::Vector[]" }
21
+ let(:values) { [] }
22
+
23
+ include_examples "checking output"
24
+ end
25
+
26
+ context "with a single item array" do
27
+ let(:output) { "Immutable::Vector[\"A\"]" }
28
+ let(:values) { %w[A] }
29
+
30
+ include_examples "checking output"
31
+ end
32
+
33
+ context "with a multi-item array" do
34
+ let(:output) { "Immutable::Vector[\"A\", \"B\"]" }
35
+ let(:values) { %w[A B] }
36
+
37
+ include_examples "checking output"
38
+ end
39
+
40
+ context "from a subclass" do
41
+ MyVector = Class.new(Immutable::Vector)
42
+ let(:vector) { MyVector.new(values) }
43
+ let(:output) { "MyVector[1, 2]" }
44
+ let(:values) { [1, 2] }
45
+
46
+ include_examples "checking output"
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,58 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#join" do
5
+ context "with a separator" do
6
+ [
7
+ [[], ""],
8
+ [["A"], "A"],
9
+ [[DeterministicHash.new("A", 1), DeterministicHash.new("B", 2), DeterministicHash.new("C", 3)], "A|B|C"]
10
+ ].each do |values, expected|
11
+ describe "on #{values.inspect}" do
12
+ let(:vector) { V[*values] }
13
+
14
+ it "preserves the original" do
15
+ vector.join("|")
16
+ vector.should eql(V[*values])
17
+ end
18
+
19
+ it "returns #{expected.inspect}" do
20
+ vector.join("|").should == expected
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ context "without a separator" do
27
+ [
28
+ [[], ""],
29
+ [["A"], "A"],
30
+ [[DeterministicHash.new("A", 1), DeterministicHash.new("B", 2), DeterministicHash.new("C", 3)], "ABC"]
31
+ ].each do |values, expected|
32
+ describe "on #{values.inspect}" do
33
+ let(:vector) { V[*values] }
34
+
35
+ it "preserves the original" do
36
+ vector.join
37
+ vector.should eql(V[*values])
38
+ end
39
+
40
+ it "returns #{expected.inspect}" do
41
+ vector.join.should == expected
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ context "without a separator (with global default separator set)" do
48
+ before { $, = '**' }
49
+ after { $, = nil }
50
+
51
+ describe 'on ["A", "B", "C"]' do
52
+ it 'returns "A**B**C"' do
53
+ V["A", "B", "C"].join.should == "A**B**C"
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end