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,47 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::SortedSet do
4
+ describe "#superset?" do
5
+ [
6
+ [[], [], true],
7
+ [["A"], [], true],
8
+ [[], ["A"], false],
9
+ [["A"], ["A"], true],
10
+ [%w[A B C], ["B"], true],
11
+ [["B"], %w[A B C], false],
12
+ [%w[A B C], %w[A C], true],
13
+ [%w[A C], %w[A B C], false],
14
+ [%w[A B C], %w[A B C], true],
15
+ [%w[A B C], %w[A B C D], false],
16
+ [%w[A B C D], %w[A B C], true],
17
+ ].each do |a, b, expected|
18
+ context "for #{a.inspect} and #{b.inspect}" do
19
+ it "returns #{expected}" do
20
+ SS[*a].superset?(SS[*b]).should == expected
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ describe "#proper_superset?" do
27
+ [
28
+ [[], [], false],
29
+ [["A"], [], true],
30
+ [[], ["A"], false],
31
+ [["A"], ["A"], false],
32
+ [%w[A B C], ["B"], true],
33
+ [["B"], %w[A B C], false],
34
+ [%w[A B C], %w[A C], true],
35
+ [%w[A C], %w[A B C], false],
36
+ [%w[A B C], %w[A B C], false],
37
+ [%w[A B C], %w[A B C D], false],
38
+ [%w[A B C D], %w[A B C], true],
39
+ ].each do |a, b, expected|
40
+ context "for #{a.inspect} and #{b.inspect}" do
41
+ it "returns #{expected}" do
42
+ SS[*a].proper_superset?(SS[*b]).should == expected
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,54 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::SortedSet do
4
+ describe "#take" do
5
+ [
6
+ [[], 10, []],
7
+ [["A"], 10, ["A"]],
8
+ [%w[A B C], 0, []],
9
+ [%w[A B C], 2, %w[A B]],
10
+ ].each do |values, number, expected|
11
+ context "#{number} from #{values.inspect}" do
12
+ let(:sorted_set) { SS[*values] }
13
+
14
+ it "preserves the original" do
15
+ sorted_set.take(number)
16
+ sorted_set.should eql(SS[*values])
17
+ end
18
+
19
+ it "returns #{expected.inspect}" do
20
+ sorted_set.take(number).should eql(SS[*expected])
21
+ end
22
+ end
23
+ end
24
+
25
+ context "when argument is at least size of receiver" do
26
+ let(:sorted_set) { SS[6, 7, 8, 9] }
27
+ it "returns self" do
28
+ sorted_set.take(sorted_set.size).should be(sorted_set)
29
+ sorted_set.take(sorted_set.size + 1).should be(sorted_set)
30
+ end
31
+ end
32
+
33
+ context "when the set has a custom order" do
34
+ let(:sorted_set) { SS.new([1, 2, 3]) { |x| -x }}
35
+ it "maintains the custom order" do
36
+ sorted_set.take(1).to_a.should == [3]
37
+ sorted_set.take(2).to_a.should == [3, 2]
38
+ sorted_set.take(3).to_a.should == [3, 2, 1]
39
+ end
40
+
41
+ it "keeps the comparator even when set is cleared" do
42
+ s = sorted_set.take(0)
43
+ s.add(4).add(5).add(6).to_a.should == [6, 5, 4]
44
+ end
45
+ end
46
+
47
+ context "when called on a subclass" do
48
+ it "should return an instance of the subclass" do
49
+ subclass = Class.new(Immutable::SortedSet)
50
+ subclass.new([1,2,3]).take(1).class.should be(subclass)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,33 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::SortedSet do
4
+ describe "#take_while" do
5
+ [
6
+ [[], []],
7
+ [["A"], ["A"]],
8
+ [%w[A B C], %w[A B]],
9
+ ].each do |values, expected|
10
+ context "on #{values.inspect}" do
11
+ let(:sorted_set) { SS[*values] }
12
+
13
+ context "with a block" do
14
+ it "returns #{expected.inspect}" do
15
+ sorted_set.take_while { |item| item < "C" }.should eql(SS[*expected])
16
+ end
17
+
18
+ it "preserves the original" do
19
+ sorted_set.take_while { |item| item < "C" }
20
+ sorted_set.should eql(SS[*values])
21
+ end
22
+ end
23
+
24
+ context "without a block" do
25
+ it "returns an Enumerator" do
26
+ sorted_set.take_while.class.should be(Enumerator)
27
+ sorted_set.take_while.each { |item| item < "C" }.should eql(SS[*expected])
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::SortedSet do
4
+ describe "#to_set" do
5
+ [
6
+ [],
7
+ ["A"],
8
+ %w[A B C],
9
+ ].each do |values|
10
+ context "on #{values.inspect}" do
11
+ it "returns a set with the same values" do
12
+ SS[*values].to_set.should eql(S[*values])
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::SortedSet do
4
+ [:union, :|, :+, :merge].each do |method|
5
+ describe "##{method}" do
6
+ [
7
+ [[], [], []],
8
+ [["A"], [], ["A"]],
9
+ [["A"], ["A"], ["A"]],
10
+ [%w[A B C], [], %w[A B C]],
11
+ [%w[A C E G X], %w[B C D E H M], %w[A B C D E G H M X]]
12
+ ].each do |a, b, expected|
13
+ context "for #{a.inspect} and #{b.inspect}" do
14
+ it "returns #{expected.inspect}" do
15
+ SS[*a].send(method, SS[*b]).should eql(SS[*expected])
16
+ end
17
+ end
18
+
19
+ context "for #{b.inspect} and #{a.inspect}" do
20
+ it "returns #{expected.inspect}" do
21
+ SS[*b].send(method, SS[*a]).should eql(SS[*expected])
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,52 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::SortedSet do
4
+ describe "#up_to" do
5
+ context "when called without a block" do
6
+ it "returns a sorted set of all items equal to or less than the argument" do
7
+ 100.times do
8
+ items = rand(100).times.collect { rand(1000) }
9
+ set = SS.new(items)
10
+ threshold = rand(1000)
11
+ result = set.up_to(threshold)
12
+ array = items.select { |x| x <= threshold }.sort
13
+ result.class.should be(Immutable::SortedSet)
14
+ result.size.should == array.size
15
+ result.to_a.should == array
16
+ end
17
+ end
18
+ end
19
+
20
+ context "when called with a block" do
21
+ it "yields all the items equal to or less than than the argument" do
22
+ 100.times do
23
+ items = rand(100).times.collect { rand(1000) }
24
+ set = SS.new(items)
25
+ threshold = rand(1000)
26
+ result = []
27
+ set.up_to(threshold) { |x| result << x }
28
+ array = items.select { |x| x <= threshold }.sort
29
+ result.size.should == array.size
30
+ result.should == array
31
+ end
32
+ end
33
+ end
34
+
35
+ context "on an empty set" do
36
+ it "returns an empty set" do
37
+ SS.empty.up_to(1).should be_empty
38
+ SS.empty.up_to('abc').should be_empty
39
+ SS.empty.up_to(:symbol).should be_empty
40
+ SS.empty.up_to(nil).should be_empty
41
+ end
42
+ end
43
+
44
+ context "with an argument less than all the values in the set" do
45
+ it "returns an empty set" do
46
+ result = SS.new(1..100).up_to(0)
47
+ result.class.should be(Immutable::SortedSet)
48
+ result.should be_empty
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,33 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::SortedSet do
4
+ describe "#values_at" do
5
+ let(:sorted_set) { SS['a', 'b', 'c'] }
6
+
7
+ it "accepts any number of indices, and returns a sorted_set of items at those indices" do
8
+ sorted_set.values_at(0).should eql(SS['a'])
9
+ sorted_set.values_at(1,2).should eql(SS['b', 'c'])
10
+ end
11
+
12
+ context "when passed invalid indices" do
13
+ it "filters them out" do
14
+ sorted_set.values_at(1,2,3).should eql(SS['b', 'c'])
15
+ sorted_set.values_at(-10,10).should eql(SS.empty)
16
+ end
17
+ end
18
+
19
+ context "when passed no arguments" do
20
+ it "returns an empty sorted_set" do
21
+ sorted_set.values_at.should eql(SS.empty)
22
+ end
23
+ end
24
+
25
+ context "from a subclass" do
26
+ it "returns an instance of the subclass" do
27
+ subclass = Class.new(Immutable::SortedSet)
28
+ instance = subclass.new([1,2,3])
29
+ instance.values_at(1,2).class.should be(subclass)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,67 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ let(:vector) { V[*values] }
5
+
6
+ [:add, :<<, :push].each do |method|
7
+ describe "##{method}" do
8
+ shared_examples "checking adding values" do
9
+ let(:added_vector) { V[*added_values] }
10
+
11
+ it "preserves the original" do
12
+ original = vector
13
+ vector.send(method, added_value)
14
+ expect(original).to eq(vector)
15
+ end
16
+
17
+ it "adds the item to the vector" do
18
+ result = vector.send(method, added_value)
19
+ expect(result).to eq(added_vector)
20
+ expect(result.size).to eq(vector.size + 1)
21
+ end
22
+ end
23
+
24
+ context "with a empty vector adding a single item" do
25
+ let(:values) { [] }
26
+ let(:added_value) { "A" }
27
+ let(:added_values) { ["A"] }
28
+
29
+ include_examples "checking adding values"
30
+ end
31
+
32
+ context "with a single-item vector adding a different item" do
33
+ let(:values) { ["A"] }
34
+ let(:added_value) { "B" }
35
+ let(:added_values) { %w[A B] }
36
+
37
+ include_examples "checking adding values"
38
+ end
39
+
40
+ context "with a single-item vector adding a duplicate item" do
41
+ let(:values) { ["A"] }
42
+ let(:added_value) { "A" }
43
+ let(:added_values) { %w[A A] }
44
+
45
+ include_examples "checking adding values"
46
+ end
47
+
48
+ [31, 32, 33, 1023, 1024, 1025].each do |size|
49
+ context "with a #{size}-item vector adding a different item" do
50
+ let(:values) { (1..size).to_a }
51
+ let(:added_value) { size+1 }
52
+ let(:added_values) { (1..(size+1)).to_a }
53
+
54
+ include_examples "checking adding values"
55
+ end
56
+ end
57
+
58
+ context "from a subclass" do
59
+ it "returns an instance of the subclass" do
60
+ subclass = Class.new(Immutable::Vector)
61
+ instance = subclass[1,2,3]
62
+ instance.add(4).class.should be(subclass)
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,69 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ let(:vector) { V[*values] }
5
+
6
+ describe "#any?" do
7
+ let(:any?) { vector.any?(&block) }
8
+
9
+ context "when created with no values" do
10
+ let(:values) { [] }
11
+
12
+ context "with a block" do
13
+ let(:block) { ->(item) { item + 1 } }
14
+
15
+ it "returns false" do
16
+ expect(any?).to be(false)
17
+ end
18
+ end
19
+
20
+ context "with a block" do
21
+ let(:block) { nil }
22
+
23
+ it "returns false" do
24
+ expect(any?).to be(false)
25
+ end
26
+ end
27
+ end
28
+
29
+ context "when created with values" do
30
+ let(:values) { ["A", "B", 3, nil] }
31
+
32
+ context "with a block that returns true" do
33
+ let(:block) { ->(item) { item == 3 } }
34
+
35
+ it "returns true" do
36
+ expect(any?).to be(true)
37
+ end
38
+ end
39
+
40
+ context "with a block that doesn't return true" do
41
+ let(:block) { ->(item) { item == "D" } }
42
+
43
+ it "returns false" do
44
+ expect(any?).to be(false)
45
+ end
46
+ end
47
+
48
+ context "without a block" do
49
+ let(:block) { nil }
50
+
51
+ context "with some values that are truthy" do
52
+ let(:values) { [nil, false, "B"] }
53
+
54
+ it "returns true" do
55
+ expect(any?).to be(true)
56
+ end
57
+ end
58
+
59
+ context "with all values that are falsey" do
60
+ let(:values) { [nil, false] }
61
+
62
+ it "returns false" do
63
+ expect(any?).to be(false)
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,45 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Vector do
4
+ let(:vector) { V[[:a, 3], [:b, 2], [:c, 1]] }
5
+
6
+ describe "#assoc" do
7
+ it "searches for a 2-element array with a given 1st item" do
8
+ vector.assoc(:b).should == [:b, 2]
9
+ end
10
+
11
+ it "returns nil if a matching 1st item is not found" do
12
+ vector.assoc(:d).should be_nil
13
+ end
14
+
15
+ it "uses #== to compare 1st items with provided object" do
16
+ vector.assoc(EqualNotEql.new).should_not be_nil
17
+ vector.assoc(EqlNotEqual.new).should be_nil
18
+ end
19
+
20
+ it "skips elements which are not indexable" do
21
+ V[false, true, nil].assoc(:b).should be_nil
22
+ V[[1,2], nil].assoc(3).should be_nil
23
+ end
24
+ end
25
+
26
+ describe "#rassoc" do
27
+ it "searches for a 2-element array with a given 2nd item" do
28
+ vector.rassoc(1).should == [:c, 1]
29
+ end
30
+
31
+ it "returns nil if a matching 2nd item is not found" do
32
+ vector.rassoc(4).should be_nil
33
+ end
34
+
35
+ it "uses #== to compare 2nd items with provided object" do
36
+ vector.rassoc(EqualNotEql.new).should_not be_nil
37
+ vector.rassoc(EqlNotEqual.new).should be_nil
38
+ end
39
+
40
+ it "skips elements which are not indexable" do
41
+ V[false, true, nil].rassoc(:b).should be_nil
42
+ V[[1,2], nil].rassoc(3).should be_nil
43
+ end
44
+ end
45
+ end