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,45 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ let(:vector) { V[*values] }
5
+
6
+ describe "#last" do
7
+ let(:last) { vector.last }
8
+
9
+ shared_examples "checking values" do
10
+ it "returns the last item" do
11
+ expect(last).to eq(last_item)
12
+ end
13
+ end
14
+
15
+ context "with an empty vector" do
16
+ let(:last_item) { nil }
17
+ let(:values) { [] }
18
+
19
+ include_examples "checking values"
20
+ end
21
+
22
+ context "with a single item vector" do
23
+ let(:last_item) { "A" }
24
+ let(:values) { %w[A] }
25
+
26
+ include_examples "checking values"
27
+ end
28
+
29
+ context "with a multi-item vector" do
30
+ let(:last_item) { "B" }
31
+ let(:values) { %w[A B] }
32
+
33
+ include_examples "checking values"
34
+ end
35
+
36
+ [31, 32, 33, 1023, 1024, 1025].each do |size|
37
+ context "with a #{size}-item vector" do
38
+ let(:last_item) { size }
39
+ let(:values) { (1..size).to_a }
40
+
41
+ include_examples "checking values"
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,45 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ let(:vector) { V[*values] }
5
+
6
+ describe "#length" do
7
+ let(:length) { vector.length }
8
+
9
+ shared_examples "checking size" do
10
+ it "returns the values" do
11
+ expect(length).to eq(size)
12
+ end
13
+ end
14
+
15
+ context "with an empty vector" do
16
+ let(:values) { [] }
17
+ let(:size) { 0 }
18
+
19
+ include_examples "checking size"
20
+ end
21
+
22
+ context "with a single item vector" do
23
+ let(:values) { %w[A] }
24
+ let(:size) { 1 }
25
+
26
+ include_examples "checking size"
27
+ end
28
+
29
+ context "with a multi-item vector" do
30
+ let(:values) { %w[A B] }
31
+ let(:size) { 2 }
32
+
33
+ include_examples "checking size"
34
+ end
35
+
36
+ [31, 32, 33, 1023, 1024, 1025].each do |size|
37
+ context "with a #{size}-item vector" do
38
+ let(:values) { (1..size).to_a }
39
+ let(:size) { size }
40
+
41
+ include_examples "checking size"
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,65 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ let(:vector) { V[*values] }
5
+
6
+ describe "#<<" do
7
+ let(:ltlt) { vector << added_value }
8
+
9
+ shared_examples "checking adding values" do
10
+ let(:added_vector) { V[*added_values] }
11
+
12
+ it "preserves the original" do
13
+ original = vector
14
+ vector << added_value
15
+ expect(original).to eq(vector)
16
+ end
17
+
18
+ it "ltlts the item to the vector" do
19
+ expect(ltlt).to eq(added_vector)
20
+ end
21
+ end
22
+
23
+ context "with a empty array adding a single item" do
24
+ let(:values) { [] }
25
+ let(:added_value) { "A" }
26
+ let(:added_values) { ["A"] }
27
+
28
+ include_examples "checking adding values"
29
+ end
30
+
31
+ context "with a single-item array adding a different item" do
32
+ let(:values) { ["A"] }
33
+ let(:added_value) { "B" }
34
+ let(:added_values) { %w[A B] }
35
+
36
+ include_examples "checking adding values"
37
+ end
38
+
39
+ context "with a single-item array adding a duplicate item" do
40
+ let(:values) { ["A"] }
41
+ let(:added_value) { "A" }
42
+ let(:added_values) { %w[A A] }
43
+
44
+ include_examples "checking adding values"
45
+ end
46
+
47
+ [31, 32, 33, 1023, 1024, 1025].each do |size|
48
+ context "with a #{size}-item vector adding a different item" do
49
+ let(:values) { (1..size).to_a }
50
+ let(:added_value) { size+1 }
51
+ let(:added_values) { (1..(size+1)).to_a }
52
+
53
+ include_examples "checking adding values"
54
+ end
55
+ end
56
+
57
+ context "from a subclass" do
58
+ it "returns an instance of the subclass" do
59
+ subclass = Class.new(Immutable::Vector)
60
+ instance = subclass[1,2,3]
61
+ (instance << 4).class.should be(subclass)
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,51 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ [:map, :collect].each do |method|
5
+ describe "##{method}" do
6
+ context "when empty" do
7
+ let(:vector) { V.empty }
8
+
9
+ it "returns self" do
10
+ vector.send(method) {}.should equal(vector)
11
+ end
12
+ end
13
+
14
+ context "when not empty" do
15
+ let(:vector) { V["A", "B", "C"] }
16
+
17
+ context "with a block" do
18
+ it "preserves the original values" do
19
+ vector.send(method, &:downcase)
20
+ vector.should eql(V["A", "B", "C"])
21
+ end
22
+
23
+ it "returns a new vector with the mapped values" do
24
+ vector.send(method, &:downcase).should eql(V["a", "b", "c"])
25
+ end
26
+ end
27
+
28
+ context "with no block" do
29
+ it "returns an Enumerator" do
30
+ vector.send(method).class.should be(Enumerator)
31
+ vector.send(method).each(&:downcase).should eql(V['a', 'b', 'c'])
32
+ end
33
+ end
34
+ end
35
+
36
+ context "from a subclass" do
37
+ it "returns an instance of the subclass" do
38
+ subclass = Class.new(Immutable::Vector)
39
+ instance = subclass[1,2,3]
40
+ instance.map { |x| x + 1 }.class.should be(subclass)
41
+ end
42
+ end
43
+
44
+ context "on a large vector" do
45
+ it "works" do
46
+ V.new(1..2000).map { |x| x * 2 }.should eql(V.new((1..2000).map { |x| x * 2}))
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#marshal_dump/#marshal_load" do
5
+ let(:ruby) do
6
+ File.join(RbConfig::CONFIG["bindir"], RbConfig::CONFIG["ruby_install_name"])
7
+ end
8
+ let(:child_cmd) do
9
+ %Q|#{ruby} -I lib -r immutable -e 'vector = Immutable::Vector[5, 10, 15]; $stdout.write(Marshal.dump(vector))'|
10
+ end
11
+
12
+ let(:reloaded_vector) do
13
+ IO.popen(child_cmd, "r+") do |child|
14
+ reloaded_vector = Marshal.load(child)
15
+ child.close
16
+ reloaded_vector
17
+ end
18
+ end
19
+
20
+ it "can survive dumping and loading into a new process" do
21
+ expect(reloaded_vector).to eql(V[5, 10, 15])
22
+ end
23
+
24
+ it "is still possible to find items by index after loading" do
25
+ expect(reloaded_vector[0]).to eq(5)
26
+ expect(reloaded_vector[1]).to eq(10)
27
+ expect(reloaded_vector[2]).to eq(15)
28
+ expect(reloaded_vector.size).to eq(3)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,33 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#max" do
5
+ context "with a block" do
6
+ [
7
+ [[], nil],
8
+ [["A"], "A"],
9
+ [%w[Ichi Ni San], "Ichi"],
10
+ ].each do |values, expected|
11
+ describe "on #{values.inspect}" do
12
+ it "returns #{expected.inspect}" do
13
+ V[*values].max { |maximum, item| maximum.length <=> item.length }.should == expected
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ context "without a block" do
20
+ [
21
+ [[], nil],
22
+ [["A"], "A"],
23
+ [%w[Ichi Ni San], "San"],
24
+ ].each do |values, expected|
25
+ describe "on #{values.inspect}" do
26
+ it "returns #{expected.inspect}" do
27
+ V[*values].max.should == expected
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#min" do
5
+ context "with a block" do
6
+ [
7
+ [[], nil],
8
+ [["A"], "A"],
9
+ [%w[Ichi Ni San], "Ni"],
10
+ ].each do |values, expected|
11
+ describe "on #{values.inspect}" do
12
+ it "returns #{expected.inspect}" do
13
+ V[*values].min { |minimum, item| minimum.length <=> item.length }.should == expected
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ context "without a block" do
20
+ [
21
+ [[], nil],
22
+ [["A"], "A"],
23
+ [%w[Ichi Ni San], "Ichi"],
24
+ ].each do |values, expected|
25
+ describe "on #{values.inspect}" do
26
+ it "returns #{expected.inspect}" do
27
+ V[*values].min.should == expected
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,47 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#*" do
5
+ let(:vector) { V[1, 2, 3] }
6
+
7
+ context "with a String argument" do
8
+ it "acts just like #join" do
9
+ (vector * 'boo').should eql(vector.join('boo'))
10
+ end
11
+ end
12
+
13
+ context "with an Integer argument" do
14
+ it "concatenates n copies of the array" do
15
+ (vector * 0).should eql(V.empty)
16
+ (vector * 1).should eql(vector)
17
+ (vector * 2).should eql(V[1,2,3,1,2,3])
18
+ (vector * 3).should eql(V[1,2,3,1,2,3,1,2,3])
19
+ end
20
+
21
+ it "raises an ArgumentError if integer is negative" do
22
+ -> { vector * -1 }.should raise_error(ArgumentError)
23
+ end
24
+
25
+ it "works on large vectors" do
26
+ array = (1..50).to_a
27
+ (V.new(array) * 25).should eql(V.new(array * 25))
28
+ end
29
+ end
30
+
31
+ context "with a subclass of Vector" do
32
+ it "returns an instance of the subclass" do
33
+ subclass = Class.new(Immutable::Vector)
34
+ instance = subclass.new([1,2,3])
35
+ (instance * 10).class.should be(subclass)
36
+ end
37
+ end
38
+
39
+ it "raises a TypeError if passed nil" do
40
+ -> { vector * nil }.should raise_error(TypeError)
41
+ end
42
+
43
+ it "raises an ArgumentError if passed no arguments" do
44
+ -> { vector.* }.should raise_error(ArgumentError)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,50 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe ".new" do
5
+ it "accepts a single enumerable argument and creates a new vector" do
6
+ vector = Immutable::Vector.new([1,2,3])
7
+ vector.size.should be(3)
8
+ vector[0].should be(1)
9
+ vector[1].should be(2)
10
+ vector[2].should be(3)
11
+ end
12
+
13
+ it "makes a defensive copy of a non-frozen mutable Array passed in" do
14
+ array = [1,2,3]
15
+ vector = Immutable::Vector.new(array)
16
+ array[0] = 'changed'
17
+ vector[0].should be(1)
18
+ end
19
+
20
+ it "is amenable to overriding of #initialize" do
21
+ class SnazzyVector < Immutable::Vector
22
+ def initialize
23
+ super(['SNAZZY!!!'])
24
+ end
25
+ end
26
+
27
+ vector = SnazzyVector.new
28
+ vector.size.should be(1)
29
+ vector.should == ['SNAZZY!!!']
30
+ end
31
+
32
+ context "from a subclass" do
33
+ it "returns a frozen instance of the subclass" do
34
+ subclass = Class.new(Immutable::Vector)
35
+ instance = subclass.new(["some", "values"])
36
+ instance.class.should be subclass
37
+ instance.frozen?.should be true
38
+ end
39
+ end
40
+ end
41
+
42
+ describe ".[]" do
43
+ it "accepts a variable number of items and creates a new vector" do
44
+ vector = Immutable::Vector['a', 'b']
45
+ vector.size.should be(2)
46
+ vector[0].should == 'a'
47
+ vector[1].should == 'b'
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,52 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#partition" do
5
+ [
6
+ [[], [], []],
7
+ [[1], [1], []],
8
+ [[1, 2], [1], [2]],
9
+ [[1, 2, 3], [1, 3], [2]],
10
+ [[1, 2, 3, 4], [1, 3], [2, 4]],
11
+ [[2, 3, 4], [3], [2, 4]],
12
+ [[3, 4], [3], [4]],
13
+ [[4], [], [4]],
14
+ ].each do |values, expected_matches, expected_remainder|
15
+ describe "on #{values.inspect}" do
16
+ let(:vector) { V[*values] }
17
+
18
+ describe "with a block" do
19
+ let(:result) { vector.partition(&:odd?) }
20
+ let(:matches) { result.first }
21
+ let(:remainder) { result.last }
22
+
23
+ it "preserves the original" do
24
+ result
25
+ vector.should eql(V[*values])
26
+ end
27
+
28
+ it "returns a frozen array with two items" do
29
+ result.class.should be(Array)
30
+ result.should be_frozen
31
+ result.size.should be(2)
32
+ end
33
+
34
+ it "correctly identifies the matches" do
35
+ matches.should eql(V[*expected_matches])
36
+ end
37
+
38
+ it "correctly identifies the remainder" do
39
+ remainder.should eql(V[*expected_remainder])
40
+ end
41
+ end
42
+
43
+ describe "without a block" do
44
+ it "returns an Enumerator" do
45
+ vector.partition.class.should be(Enumerator)
46
+ vector.partition.each(&:odd?).should eql([V.new(expected_matches), V.new(expected_remainder)])
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end