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,54 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#drop_while" do
5
+ [
6
+ [[], []],
7
+ [["A"], []],
8
+ [%w[A B C], ["C"]],
9
+ ].each do |values, expected|
10
+ describe "on #{values.inspect}" do
11
+ let(:vector) { V[*values] }
12
+
13
+ describe "with a block" do
14
+ let(:result) { vector.drop_while { |item| item < "C" } }
15
+
16
+ it "preserves the original" do
17
+ result
18
+ vector.should eql(V[*values])
19
+ end
20
+
21
+ it "returns #{expected.inspect}" do
22
+ result.should eql(V[*expected])
23
+ end
24
+ end
25
+
26
+ describe "without a block" do
27
+ it "returns an Enumerator" do
28
+ vector.drop_while.class.should be(Enumerator)
29
+ vector.drop_while.each { |item| item < "C" }.should eql(V[*expected])
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ context "on an empty vector" do
36
+ it "returns an empty vector" do
37
+ V.empty.drop_while { false }.should eql(V.empty)
38
+ end
39
+ end
40
+
41
+ it "returns an empty vector if block is always true" do
42
+ V.new(1..32).drop_while { true }.should eql(V.empty)
43
+ V.new(1..100).drop_while { true }.should eql(V.empty)
44
+ end
45
+
46
+ it "stops dropping items if block returns nil" do
47
+ V[1, 2, 3, nil, 4, 5].drop_while { |x| x }.should eql(V[nil, 4, 5])
48
+ end
49
+
50
+ it "stops dropping items if block returns false" do
51
+ V[1, 2, 3, false, 4, 5].drop_while { |x| x }.should eql(V[false, 4, 5])
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,40 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#each_index" do
5
+ let(:vector) { V[1,2,3,4] }
6
+
7
+ context "with a block" do
8
+ it "yields all the valid indices into the vector" do
9
+ result = []
10
+ vector.each_index { |i| result << i }
11
+ result.should eql([0,1,2,3])
12
+ end
13
+
14
+ it "returns self" do
15
+ vector.each_index {}.should be(vector)
16
+ end
17
+ end
18
+
19
+ context "without a block" do
20
+ it "returns an Enumerator" do
21
+ vector.each_index.class.should be(Enumerator)
22
+ vector.each_index.to_a.should eql([0,1,2,3])
23
+ end
24
+ end
25
+
26
+ context "on an empty vector" do
27
+ it "doesn't yield anything" do
28
+ V.empty.each_index { fail }
29
+ end
30
+ end
31
+
32
+ [1, 2, 10, 31, 32, 33, 1000, 1024, 1025].each do |size|
33
+ context "on a #{size}-item vector" do
34
+ it "yields all valid indices" do
35
+ V.new(1..size).each_index.to_a.should == (0..(size-1)).to_a
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#each" do
5
+ describe "with no block" do
6
+ let(:vector) { V["A", "B", "C"] }
7
+
8
+ it "returns an Enumerator" do
9
+ vector.each.class.should be(Enumerator)
10
+ vector.each.to_a.should == vector
11
+ end
12
+ end
13
+
14
+ [31, 32, 33, 1023, 1024, 1025].each do |size|
15
+ context "on a #{size}-item vector" do
16
+ describe "with a block" do
17
+ let(:vector) { V.new(1..size) }
18
+
19
+ it "returns self" do
20
+ items = []
21
+ vector.each { |item| items << item }.should be(vector)
22
+ end
23
+
24
+ it "yields all the items" do
25
+ items = []
26
+ vector.each { |item| items << item }
27
+ items.should == (1..size).to_a
28
+ end
29
+
30
+ it "iterates over the items in order" do
31
+ vector.each.first.should == 1
32
+ vector.each.to_a.last.should == size
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ context "on an empty vector" do
39
+ it "doesn't yield anything" do
40
+ V.empty.each { fail }
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#each_with_index" do
5
+ describe "with no block" do
6
+ let(:vector) { V["A", "B", "C"] }
7
+
8
+ it "returns an Enumerator" do
9
+ vector.each_with_index.class.should be(Enumerator)
10
+ vector.each_with_index.to_a.should == [['A', 0], ['B', 1], ['C', 2]]
11
+ end
12
+ end
13
+
14
+ [1, 2, 31, 32, 33, 1023, 1024, 1025].each do |size|
15
+ context "on a #{size}-item vector" do
16
+ describe "with a block" do
17
+ let(:vector) { V.new(1..size) }
18
+
19
+ it "returns self" do
20
+ pairs = []
21
+ vector.each_with_index { |item, index| pairs << [item, index] }.should be(vector)
22
+ end
23
+
24
+ it "iterates over the items in order" do
25
+ pairs = []
26
+ vector.each_with_index { |item, index| pairs << [item, index] }.should be(vector)
27
+ pairs.should == (1..size).zip(0..size.pred)
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ context "on an empty vector" do
34
+ it "doesn't yield anything" do
35
+ V.empty.each_with_index { |item, index| fail }
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,41 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#empty?" do
5
+ [
6
+ [[], true],
7
+ [["A"], false],
8
+ [%w[A B C], false],
9
+ ].each do |values, expected|
10
+ describe "on #{values.inspect}" do
11
+ it "returns #{expected.inspect}" do
12
+ V[*values].empty?.should == expected
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ describe ".empty" do
19
+ it "returns the canonical empty vector" do
20
+ V.empty.size.should be(0)
21
+ V.empty.object_id.should be(V.empty.object_id)
22
+ end
23
+
24
+ context "from a subclass" do
25
+ it "returns an empty instance of the subclass" do
26
+ subclass = Class.new(Immutable::Vector)
27
+ subclass.empty.class.should be(subclass)
28
+ subclass.empty.should be_empty
29
+ end
30
+
31
+ it "calls overridden #initialize when creating empty Hash" do
32
+ subclass = Class.new(Immutable::Vector) do
33
+ def initialize
34
+ @variable = 'value'
35
+ end
36
+ end
37
+ subclass.empty.instance_variable_get(:@variable).should == 'value'
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,76 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#eql" do
5
+ let(:vector) { V["A", "B", "C"] }
6
+
7
+ it "returns false when comparing with an array with the same contents" do
8
+ vector.eql?(%w[A B C]).should == false
9
+ end
10
+
11
+ it "returns false when comparing with an arbitrary object" do
12
+ vector.eql?(Object.new).should == false
13
+ end
14
+
15
+ it "returns false when comparing an empty vector with an empty array" do
16
+ V.empty.eql?([]).should == false
17
+ end
18
+
19
+ it "returns false when comparing with a subclass of Immutable::Vector" do
20
+ vector.eql?(Class.new(Immutable::Vector).new(%w[A B C])).should == false
21
+ end
22
+ end
23
+
24
+ describe "#==" do
25
+ let(:vector) { V["A", "B", "C"] }
26
+
27
+ it "returns true when comparing with an array with the same contents" do
28
+ (vector == %w[A B C]).should == true
29
+ end
30
+
31
+ it "returns false when comparing with an arbitrary object" do
32
+ (vector == Object.new).should == false
33
+ end
34
+
35
+ it "returns true when comparing an empty vector with an empty array" do
36
+ (V.empty == []).should == true
37
+ end
38
+
39
+ it "returns true when comparing with a subclass of Immutable::Vector" do
40
+ (vector == Class.new(Immutable::Vector).new(%w[A B C])).should == true
41
+ end
42
+
43
+ it "works on larger vectors" do
44
+ array = 2000.times.map { rand(10000) }
45
+ (V.new(array.dup) == array).should == true
46
+ end
47
+ end
48
+
49
+ [:eql?, :==].each do |method|
50
+ describe "##{method}" do
51
+ [
52
+ [[], [], true],
53
+ [[], [nil], false],
54
+ [["A"], [], false],
55
+ [["A"], ["A"], true],
56
+ [["A"], ["B"], false],
57
+ [%w[A B], ["A"], false],
58
+ [%w[A B C], %w[A B C], true],
59
+ [%w[C A B], %w[A B C], false],
60
+ ].each do |a, b, expected|
61
+ describe "returns #{expected.inspect}" do
62
+ let(:vector_a) { V[*a] }
63
+ let(:vector_b) { V[*b] }
64
+
65
+ it "for vectors #{a.inspect} and #{b.inspect}" do
66
+ vector_a.send(method, vector_b).should == expected
67
+ end
68
+
69
+ it "for vectors #{b.inspect} and #{a.inspect}" do
70
+ vector_b.send(method, vector_a).should == expected
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,64 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#fetch" do
5
+ let(:vector) { V['a', 'b', 'c'] }
6
+
7
+ context "with no default provided" do
8
+ context "when the index exists" do
9
+ it "returns the value at the index" do
10
+ vector.fetch(0).should == "a"
11
+ vector.fetch(1).should == "b"
12
+ vector.fetch(2).should == "c"
13
+ end
14
+ end
15
+
16
+ context "when the key does not exist" do
17
+ it "raises an IndexError" do
18
+ -> { vector.fetch(3) }.should raise_error(IndexError)
19
+ -> { vector.fetch(-4) }.should raise_error(IndexError)
20
+ end
21
+ end
22
+ end
23
+
24
+ context "with a default value" do
25
+ context "when the index exists" do
26
+ it "returns the value at the index" do
27
+ vector.fetch(0, "default").should == "a"
28
+ vector.fetch(1, "default").should == "b"
29
+ vector.fetch(2, "default").should == "c"
30
+ end
31
+ end
32
+
33
+ context "when the index does not exist" do
34
+ it "returns the default value" do
35
+ vector.fetch(3, "default").should == "default"
36
+ vector.fetch(-4, "default").should == "default"
37
+ end
38
+ end
39
+ end
40
+
41
+ context "with a default block" do
42
+ context "when the index exists" do
43
+ it "returns the value at the index" do
44
+ vector.fetch(0) { "default".upcase }.should == "a"
45
+ vector.fetch(1) { "default".upcase }.should == "b"
46
+ vector.fetch(2) { "default".upcase }.should == "c"
47
+ end
48
+ end
49
+
50
+ context "when the index does not exist" do
51
+ it "invokes the block with the missing index as parameter" do
52
+ vector.fetch(3) { |index| index.should == 3}
53
+ vector.fetch(-4) { |index| index.should == -4 }
54
+ vector.fetch(3) { "default".upcase }.should == "DEFAULT"
55
+ vector.fetch(-4) { "default".upcase }.should == "DEFAULT"
56
+ end
57
+ end
58
+ end
59
+
60
+ it "gives precedence to default block over default argument if passed both" do
61
+ vector.fetch(3, 'one') { 'two' }.should == 'two'
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,88 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ describe "#fill" do
5
+ let(:vector) { V[1, 2, 3, 4, 5, 6] }
6
+
7
+ it "can replace a range of items at the beginning of a vector" do
8
+ vector.fill(:a, 0, 3).should eql(V[:a, :a, :a, 4, 5, 6])
9
+ end
10
+
11
+ it "can replace a range of items in the middle of a vector" do
12
+ vector.fill(:a, 3, 2).should eql(V[1, 2, 3, :a, :a, 6])
13
+ end
14
+
15
+ it "can replace a range of items at the end of a vector" do
16
+ vector.fill(:a, 4, 2).should eql(V[1, 2, 3, 4, :a, :a])
17
+ end
18
+
19
+ it "can replace all the items in a vector" do
20
+ vector.fill(:a, 0, 6).should eql(V[:a, :a, :a, :a, :a, :a])
21
+ end
22
+
23
+ it "can fill past the end of the vector" do
24
+ vector.fill(:a, 3, 6).should eql(V[1, 2, 3, :a, :a, :a, :a, :a, :a])
25
+ end
26
+
27
+ context "with 1 argument" do
28
+ it "replaces all the items in the vector by default" do
29
+ vector.fill(:a).should eql(V[:a, :a, :a, :a, :a, :a])
30
+ end
31
+ end
32
+
33
+ context "with 2 arguments" do
34
+ it "replaces up to the end of the vector by default" do
35
+ vector.fill(:a, 4).should eql(V[1, 2, 3, 4, :a, :a])
36
+ end
37
+ end
38
+
39
+ context "when index and length are 0" do
40
+ it "leaves the vector unmodified" do
41
+ vector.fill(:a, 0, 0).should eql(vector)
42
+ end
43
+ end
44
+
45
+ context "when expanding a vector past boundary where vector trie needs to deepen" do
46
+ it "works the same" do
47
+ vector.fill(:a, 32, 3).size.should == 35
48
+ vector.fill(:a, 32, 3).to_a.size.should == 35
49
+ end
50
+ end
51
+
52
+ [1000, 1023, 1024, 1025, 2000].each do |size|
53
+ context "on a #{size}-item vector" do
54
+ it "works the same" do
55
+ array = (0..size).to_a
56
+ vector = V.new(array)
57
+ [[:a, 0, 5], [:b, 31, 2], [:c, 32, 60], [:d, 1000, 20], [:e, 1024, 33], [:f, 1200, 35]].each do |obj, index, length|
58
+ next if index > size
59
+ vector = vector.fill(obj, index, length)
60
+ array.fill(obj, index, length)
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
69
+
70
+ it "behaves like Array#fill, on a variety of inputs" do
71
+ 50.times do
72
+ array = rand(100).times.map { rand(1000) }
73
+ index = rand(array.size)
74
+ length = rand(50)
75
+ V.new(array).fill(:a, index, length).should == array.fill(:a, index, length)
76
+ end
77
+ 10.times do
78
+ array = rand(100).times.map { rand(10000) }
79
+ length = rand(100)
80
+ V.new(array).fill(:a, array.size, length).should == array.fill(:a, array.size, length)
81
+ end
82
+ 10.times do
83
+ array = rand(100).times.map { rand(10000) }
84
+ V.new(array).fill(:a).should == array.fill(:a)
85
+ end
86
+ end
87
+ end
88
+ end