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,35 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ [:reduce, :inject].each do |method|
5
+ describe "##{method}" do
6
+ context "when empty" do
7
+ it "returns the memo" do
8
+ H.empty.send(method, "ABC") {}.should == "ABC"
9
+ end
10
+ end
11
+
12
+ context "when not empty" do
13
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
14
+
15
+ context "with a block" do
16
+ it "returns the final memo" do
17
+ hash.send(method, 0) { |memo, key, value| memo + 1 }.should == 3
18
+ end
19
+ end
20
+
21
+ context "with no block" do
22
+ let(:hash) { H[a: 1, b: 2] }
23
+
24
+ it "uses a passed string as the name of a method to use instead" do
25
+ [[:a, 1, :b, 2], [:b, 2, :a, 1]].include?(hash.send(method, "+")).should == true
26
+ end
27
+
28
+ it "uses a passed symbol as the name of a method to use instead" do
29
+ [[:a, 1, :b, 2], [:b, 2, :a, 1]].include?(hash.send(method, :+)).should == true
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,61 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ [:reject, :delete_if].each do |method|
5
+ describe "##{method}" do
6
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
7
+
8
+ context "when nothing matches" do
9
+ it "returns self" do
10
+ hash.send(method) { |key, value| false }.should equal(hash)
11
+ end
12
+ end
13
+
14
+ context "when only some things match" do
15
+ context "with a block" do
16
+ let(:result) { hash.send(method) { |key, value| key == "A" && value == "aye" }}
17
+
18
+ it "preserves the original" do
19
+ result
20
+ hash.should eql(H["A" => "aye", "B" => "bee", "C" => "see"])
21
+ end
22
+
23
+ it "returns a set with the matching values" do
24
+ result.should eql(H["B" => "bee", "C" => "see"])
25
+ end
26
+
27
+ it "yields entries in the same order as #each" do
28
+ each_pairs = []
29
+ remove_pairs = []
30
+ hash.each_pair { |k,v| each_pairs << [k,v] }
31
+ hash.send(method) { |k,v| remove_pairs << [k,v] }
32
+ each_pairs.should == remove_pairs
33
+ end
34
+ end
35
+
36
+ context "with no block" do
37
+ it "returns an Enumerator" do
38
+ hash.send(method).class.should be(Enumerator)
39
+ hash.send(method).to_a.sort.should == [['A', 'aye'], ['B', 'bee'], ['C', 'see']]
40
+ hash.send(method).each { true }.should eql(H.empty)
41
+ end
42
+ end
43
+
44
+ context "on a large hash, with many combinations of input" do
45
+ it "still works" do
46
+ array = 1000.times.collect { |n| [n, n] }
47
+ hash = H.new(array)
48
+ [0, 10, 100, 200, 500, 800, 900, 999, 1000].each do |threshold|
49
+ result = hash.send(method) { |k,v| k >= threshold}
50
+ result.size.should == threshold
51
+ 0.upto(threshold-1) { |n| result.key?(n).should == true }
52
+ threshold.upto(1000) { |n| result.key?(n).should == false }
53
+ end
54
+ # shouldn't have changed
55
+ hash.should eql(H.new(1000.times.collect { |n| [n, n] }))
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
5
+
6
+ describe "#reverse_each" do
7
+ context "with a block" do
8
+ it "returns self" do
9
+ hash.reverse_each {}.should be(hash)
10
+ end
11
+
12
+ it "yields all key/value pairs in the opposite order as #each" do
13
+ result = []
14
+ hash.reverse_each { |entry| result << entry }
15
+ result.should eql(hash.to_a.reverse)
16
+ end
17
+ end
18
+
19
+ context "with no block" do
20
+ it "returns an Enumerator" do
21
+ result = hash.reverse_each
22
+ result.class.should be(Enumerator)
23
+ result.to_a.should eql(hash.to_a.reverse)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#sample" do
5
+ let(:hash) { Immutable::Hash.new((:a..:z).zip(1..26)) }
6
+
7
+ it "returns a randomly chosen item" do
8
+ chosen = 250.times.map { hash.sample }.sort.uniq
9
+ chosen.each { |item| hash.include?(item[0]).should == true }
10
+ hash.each { |item| chosen.include?(item).should == true }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,57 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ [:select, :find_all, :keep_if].each do |method|
5
+ describe "##{method}" do
6
+ let(:original) { H["A" => "aye", "B" => "bee", "C" => "see"] }
7
+
8
+ context "when everything matches" do
9
+ it "returns self" do
10
+ original.send(method) { |key, value| true }.should equal(original)
11
+ end
12
+ end
13
+
14
+ context "when only some things match" do
15
+ context "with a block" do
16
+ let(:result) { original.send(method) { |key, value| key == "A" && value == "aye" }}
17
+
18
+ it "preserves the original" do
19
+ original.should eql(H["A" => "aye", "B" => "bee", "C" => "see"])
20
+ end
21
+
22
+ it "returns a set with the matching values" do
23
+ result.should eql(H["A" => "aye"])
24
+ end
25
+ end
26
+
27
+ it "yields entries as [key, value] pairs" do
28
+ original.send(method) do |e|
29
+ e.should be_kind_of(Array)
30
+ ["A", "B", "C"].include?(e[0]).should == true
31
+ ["aye", "bee", "see"].include?(e[1]).should == true
32
+ end
33
+ end
34
+
35
+ context "with no block" do
36
+ it "returns an Enumerator" do
37
+ original.send(method).class.should be(Enumerator)
38
+ original.send(method).to_a.sort.should == [['A', 'aye'], ['B', 'bee'], ['C', 'see']]
39
+ end
40
+ end
41
+ end
42
+
43
+ it "works on a large hash, with many combinations of input" do
44
+ keys = (1..1000).to_a
45
+ original = H.new(keys.zip(2..1001))
46
+ 25.times do
47
+ threshold = rand(1000)
48
+ result = original.send(method) { |k,v| k <= threshold }
49
+ result.size.should == threshold
50
+ result.each_key { |k| k.should <= threshold }
51
+ (threshold+1).upto(1000) { |k| result.key?(k).should == false }
52
+ end
53
+ original.should eql(H.new(keys.zip(2..1001))) # shouldn't have changed
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,51 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ [:size, :length].each do |method|
5
+ describe "##{method}" do
6
+ [
7
+ [[], 0],
8
+ [["A" => "aye"], 1],
9
+ [["A" => "bee", "B" => "bee", "C" => "see"], 3],
10
+ ].each do |values, result|
11
+
12
+ it "returns #{result} for #{values.inspect}" do
13
+ H[*values].send(method).should == result
14
+ end
15
+ end
16
+
17
+ lots = (1..10_842).to_a
18
+ srand 89_533_474
19
+ random_things = (lots + lots).sort_by { |x|rand }
20
+
21
+ it "has the correct size after adding lots of things with colliding keys and such" do
22
+ h = H.empty
23
+ random_things.each do |thing|
24
+ h = h.put(thing, thing * 2)
25
+ end
26
+ h.size.should == 10_842
27
+ end
28
+
29
+ random_actions = (lots.map { |x|[:add, x] } + lots.map { |x|[:add, x] } + lots.map { |x|[:remove, x] }).sort_by { |x|rand }
30
+ ending_size = random_actions.reduce({}) do |h, (act, ob)|
31
+ if act == :add
32
+ h[ob] = 1
33
+ else
34
+ h.delete(ob)
35
+ end
36
+ h
37
+ end.size
38
+ it "has the correct size after lots of addings and removings" do
39
+ h = H.empty
40
+ random_actions.each do |(act, ob)|
41
+ if act == :add
42
+ h = h.put(ob, ob * 3)
43
+ else
44
+ h = h.delete(ob)
45
+ end
46
+ end
47
+ h.size.should == ending_size
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ let(:hash) { H.new("A" => "aye", "B" => "bee", "C" => "see", nil => "NIL") }
5
+
6
+ describe "#slice" do
7
+ let(:slice) { hash.slice(*values) }
8
+
9
+ context "with all keys present in the Hash" do
10
+ let(:values) { ["B", nil] }
11
+
12
+ it "returns the sliced values" do
13
+ expect(slice).to eq(described_class.new("B" => "bee", nil => "NIL"))
14
+ end
15
+
16
+ it "doesn't modify the original Hash" do
17
+ slice
18
+ hash.should eql(H.new("A" => "aye", "B" => "bee", "C" => "see", nil => "NIL"))
19
+ end
20
+ end
21
+
22
+ context "with keys aren't present in the Hash" do
23
+ let(:values) { ["B", "A", 3] }
24
+
25
+ it "returns the sliced values of the matching keys" do
26
+ expect(slice).to eq(described_class.new("A" => "aye", "B" => "bee"))
27
+ end
28
+
29
+ it "doesn't modify the original Hash" do
30
+ slice
31
+ hash.should eql(H.new("A" => "aye", "B" => "bee", "C" => "see", nil => "NIL"))
32
+ end
33
+ end
34
+
35
+ context "on a Hash with a default block" do
36
+ let(:hash) { H.new('A' => 'aye', 'B' => 'bee') { 'nothing' }}
37
+ let(:values) { ["B", nil] }
38
+
39
+ it "maintains the default block" do
40
+ expect(slice['C']).to eq('nothing')
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,26 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ let(:hash) { H[a: 3, b: 2, c: 1] }
5
+
6
+ describe "#sort" do
7
+ it "returns a Vector of sorted key/val pairs" do
8
+ hash.sort.should eql(V[[:a, 3], [:b, 2], [:c, 1]])
9
+ end
10
+
11
+ it "works on large hashes" do
12
+ array = (1..1000).map { |n| [n,n] }
13
+ H.new(array.shuffle).sort.should eql(V.new(array))
14
+ end
15
+
16
+ it "uses block as comparator to sort if passed a block" do
17
+ hash.sort { |a,b| b <=> a }.should eql(V[[:c, 1], [:b, 2], [:a, 3]])
18
+ end
19
+ end
20
+
21
+ describe "#sort_by" do
22
+ it "returns a Vector of key/val pairs, sorted using the block as a key function" do
23
+ hash.sort_by { |k,v| v }.should eql(V[[:c, 1], [:b, 2], [:a, 3]])
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,75 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#store" do
5
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
6
+
7
+ context "with a unique key" do
8
+ let(:result) { hash.store("D", "dee") }
9
+
10
+ it "preserves the original" do
11
+ result
12
+ hash.should eql(H["A" => "aye", "B" => "bee", "C" => "see"])
13
+ end
14
+
15
+ it "returns a copy with the superset of key/value pairs" do
16
+ result.should eql(H["A" => "aye", "B" => "bee", "C" => "see", "D" => "dee"])
17
+ end
18
+ end
19
+
20
+ context "with a duplicate key" do
21
+ let(:result) { hash.store("C", "sea") }
22
+
23
+ it "preserves the original" do
24
+ result
25
+ hash.should eql(H["A" => "aye", "B" => "bee", "C" => "see"])
26
+ end
27
+
28
+ it "returns a copy with the superset of key/value pairs" do
29
+ result.should eql(H["A" => "aye", "B" => "bee", "C" => "sea"])
30
+ end
31
+ end
32
+
33
+ context "with duplicate key and identical value" do
34
+ let(:hash) { H["X" => 1, "Y" => 2] }
35
+ let(:result) { hash.store("X", 1) }
36
+
37
+ it "returns the original hash unmodified" do
38
+ result.should be(hash)
39
+ end
40
+
41
+ context "with big hash (force nested tries)" do
42
+ let(:keys) { (0..99).map(&:to_s) }
43
+ let(:values) { (100..199).to_a }
44
+ let(:hash) { H[keys.zip(values)] }
45
+
46
+ it "returns the original hash unmodified for all changes" do
47
+ keys.each_with_index do |key, index|
48
+ result = hash.store(key, values[index])
49
+ result.should be(hash)
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ context "with unequal keys which hash to the same value" do
56
+ let(:hash) { H[DeterministicHash.new('a', 1) => 'aye'] }
57
+
58
+ it "stores and can retrieve both" do
59
+ result = hash.store(DeterministicHash.new('b', 1), 'bee')
60
+ result.get(DeterministicHash.new('a', 1)).should eql('aye')
61
+ result.get(DeterministicHash.new('b', 1)).should eql('bee')
62
+ end
63
+ end
64
+
65
+ context "when a String is inserted as key and then mutated" do
66
+ it "is not affected" do
67
+ string = "a string!"
68
+ hash = H.empty.store(string, 'a value!')
69
+ string.upcase!
70
+ hash['a string!'].should == 'a value!'
71
+ hash['A STRING!'].should be_nil
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,35 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
5
+
6
+ describe "#take" do
7
+ it "returns the first N key/val pairs from hash" do
8
+ hash.take(0).should == []
9
+ [[['A', 'aye']], [['B', 'bee']], [['C', 'see']]].include?(hash.take(1)).should == true
10
+ [['A', 'aye'], ['B', 'bee'], ['C', 'see']].combination(2).include?(hash.take(2).sort).should == true
11
+ hash.take(3).sort.should == [['A', 'aye'], ['B', 'bee'], ['C', 'see']]
12
+ hash.take(4).sort.should == [['A', 'aye'], ['B', 'bee'], ['C', 'see']]
13
+ end
14
+ end
15
+
16
+ describe "#take_while" do
17
+ it "passes elements to the block until the block returns nil/false" do
18
+ passed = nil
19
+ hash.take_while { |k,v| passed = k; false }
20
+ ['A', 'B', 'C'].include?(passed).should == true
21
+ end
22
+
23
+ it "returns an array of all elements before the one which returned nil/false" do
24
+ count = 0
25
+ result = hash.take_while { count += 1; count < 3 }
26
+ [['A', 'aye'], ['B', 'bee'], ['C', 'see']].combination(2).include?(result.sort).should == true
27
+ end
28
+
29
+ it "passes all elements if the block never returns nil/false" do
30
+ passed = []
31
+ hash.take_while { |k,v| passed << [k, v]; true }.should == hash.to_a
32
+ passed.sort.should == [['A', 'aye'], ['B', 'bee'], ['C', 'see']]
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#to_a" do
5
+ it "returns an Array of [key, value] pairs in same order as #each" do
6
+ hash = H[:a => 1, 1 => :a, 3 => :b, :b => 5]
7
+ pairs = []
8
+ hash.each_pair { |k,v| pairs << [k,v] }
9
+ hash.to_a.should be_kind_of(Array)
10
+ hash.to_a.should == pairs
11
+ end
12
+ end
13
+ end