immutable-ruby 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. checksums.yaml +7 -0
  2. data/lib/immutable.rb +9 -0
  3. data/lib/immutable/core_ext.rb +2 -0
  4. data/lib/immutable/core_ext/enumerable.rb +11 -0
  5. data/lib/immutable/core_ext/io.rb +21 -0
  6. data/lib/immutable/deque.rb +254 -0
  7. data/lib/immutable/enumerable.rb +152 -0
  8. data/lib/immutable/hash.rb +841 -0
  9. data/lib/immutable/list.rb +1595 -0
  10. data/lib/immutable/nested.rb +75 -0
  11. data/lib/immutable/set.rb +583 -0
  12. data/lib/immutable/sorted_set.rb +1464 -0
  13. data/lib/immutable/trie.rb +338 -0
  14. data/lib/immutable/undefined.rb +5 -0
  15. data/lib/immutable/vector.rb +1539 -0
  16. data/lib/immutable/version.rb +5 -0
  17. data/spec/fixtures/io_spec.txt +3 -0
  18. data/spec/lib/immutable/core_ext/array_spec.rb +13 -0
  19. data/spec/lib/immutable/core_ext/enumerable_spec.rb +29 -0
  20. data/spec/lib/immutable/core_ext/io_spec.rb +28 -0
  21. data/spec/lib/immutable/deque/clear_spec.rb +33 -0
  22. data/spec/lib/immutable/deque/construction_spec.rb +29 -0
  23. data/spec/lib/immutable/deque/copying_spec.rb +19 -0
  24. data/spec/lib/immutable/deque/dequeue_spec.rb +34 -0
  25. data/spec/lib/immutable/deque/empty_spec.rb +39 -0
  26. data/spec/lib/immutable/deque/enqueue_spec.rb +27 -0
  27. data/spec/lib/immutable/deque/first_spec.rb +17 -0
  28. data/spec/lib/immutable/deque/inspect_spec.rb +23 -0
  29. data/spec/lib/immutable/deque/last_spec.rb +17 -0
  30. data/spec/lib/immutable/deque/marshal_spec.rb +33 -0
  31. data/spec/lib/immutable/deque/new_spec.rb +43 -0
  32. data/spec/lib/immutable/deque/pop_spec.rb +36 -0
  33. data/spec/lib/immutable/deque/pretty_print_spec.rb +23 -0
  34. data/spec/lib/immutable/deque/push_spec.rb +36 -0
  35. data/spec/lib/immutable/deque/random_modification_spec.rb +33 -0
  36. data/spec/lib/immutable/deque/shift_spec.rb +29 -0
  37. data/spec/lib/immutable/deque/size_spec.rb +19 -0
  38. data/spec/lib/immutable/deque/to_a_spec.rb +26 -0
  39. data/spec/lib/immutable/deque/to_ary_spec.rb +35 -0
  40. data/spec/lib/immutable/deque/to_list_spec.rb +24 -0
  41. data/spec/lib/immutable/deque/unshift_spec.rb +30 -0
  42. data/spec/lib/immutable/hash/all_spec.rb +53 -0
  43. data/spec/lib/immutable/hash/any_spec.rb +53 -0
  44. data/spec/lib/immutable/hash/assoc_spec.rb +51 -0
  45. data/spec/lib/immutable/hash/clear_spec.rb +42 -0
  46. data/spec/lib/immutable/hash/construction_spec.rb +38 -0
  47. data/spec/lib/immutable/hash/copying_spec.rb +13 -0
  48. data/spec/lib/immutable/hash/default_proc_spec.rb +72 -0
  49. data/spec/lib/immutable/hash/delete_spec.rb +39 -0
  50. data/spec/lib/immutable/hash/each_spec.rb +77 -0
  51. data/spec/lib/immutable/hash/each_with_index_spec.rb +29 -0
  52. data/spec/lib/immutable/hash/empty_spec.rb +43 -0
  53. data/spec/lib/immutable/hash/eql_spec.rb +69 -0
  54. data/spec/lib/immutable/hash/except_spec.rb +42 -0
  55. data/spec/lib/immutable/hash/fetch_spec.rb +57 -0
  56. data/spec/lib/immutable/hash/find_spec.rb +43 -0
  57. data/spec/lib/immutable/hash/flat_map_spec.rb +35 -0
  58. data/spec/lib/immutable/hash/flatten_spec.rb +98 -0
  59. data/spec/lib/immutable/hash/get_spec.rb +79 -0
  60. data/spec/lib/immutable/hash/has_key_spec.rb +31 -0
  61. data/spec/lib/immutable/hash/has_value_spec.rb +27 -0
  62. data/spec/lib/immutable/hash/hash_spec.rb +29 -0
  63. data/spec/lib/immutable/hash/inspect_spec.rb +30 -0
  64. data/spec/lib/immutable/hash/invert_spec.rb +30 -0
  65. data/spec/lib/immutable/hash/key_spec.rb +27 -0
  66. data/spec/lib/immutable/hash/keys_spec.rb +15 -0
  67. data/spec/lib/immutable/hash/map_spec.rb +45 -0
  68. data/spec/lib/immutable/hash/marshal_spec.rb +28 -0
  69. data/spec/lib/immutable/hash/merge_spec.rb +82 -0
  70. data/spec/lib/immutable/hash/min_max_spec.rb +45 -0
  71. data/spec/lib/immutable/hash/new_spec.rb +70 -0
  72. data/spec/lib/immutable/hash/none_spec.rb +48 -0
  73. data/spec/lib/immutable/hash/partition_spec.rb +35 -0
  74. data/spec/lib/immutable/hash/pretty_print_spec.rb +34 -0
  75. data/spec/lib/immutable/hash/put_spec.rb +102 -0
  76. data/spec/lib/immutable/hash/reduce_spec.rb +35 -0
  77. data/spec/lib/immutable/hash/reject_spec.rb +61 -0
  78. data/spec/lib/immutable/hash/reverse_each_spec.rb +27 -0
  79. data/spec/lib/immutable/hash/sample_spec.rb +13 -0
  80. data/spec/lib/immutable/hash/select_spec.rb +57 -0
  81. data/spec/lib/immutable/hash/size_spec.rb +51 -0
  82. data/spec/lib/immutable/hash/slice_spec.rb +44 -0
  83. data/spec/lib/immutable/hash/sort_spec.rb +26 -0
  84. data/spec/lib/immutable/hash/store_spec.rb +75 -0
  85. data/spec/lib/immutable/hash/take_spec.rb +35 -0
  86. data/spec/lib/immutable/hash/to_a_spec.rb +13 -0
  87. data/spec/lib/immutable/hash/to_hash_spec.rb +21 -0
  88. data/spec/lib/immutable/hash/update_in_spec.rb +79 -0
  89. data/spec/lib/immutable/hash/values_at_spec.rb +13 -0
  90. data/spec/lib/immutable/hash/values_spec.rb +23 -0
  91. data/spec/lib/immutable/list/add_spec.rb +25 -0
  92. data/spec/lib/immutable/list/all_spec.rb +57 -0
  93. data/spec/lib/immutable/list/any_spec.rb +49 -0
  94. data/spec/lib/immutable/list/append_spec.rb +38 -0
  95. data/spec/lib/immutable/list/at_spec.rb +29 -0
  96. data/spec/lib/immutable/list/break_spec.rb +69 -0
  97. data/spec/lib/immutable/list/cadr_spec.rb +38 -0
  98. data/spec/lib/immutable/list/chunk_spec.rb +28 -0
  99. data/spec/lib/immutable/list/clear_spec.rb +24 -0
  100. data/spec/lib/immutable/list/combination_spec.rb +33 -0
  101. data/spec/lib/immutable/list/compact_spec.rb +34 -0
  102. data/spec/lib/immutable/list/compare_spec.rb +30 -0
  103. data/spec/lib/immutable/list/cons_spec.rb +25 -0
  104. data/spec/lib/immutable/list/construction_spec.rb +110 -0
  105. data/spec/lib/immutable/list/copying_spec.rb +19 -0
  106. data/spec/lib/immutable/list/count_spec.rb +36 -0
  107. data/spec/lib/immutable/list/cycle_spec.rb +28 -0
  108. data/spec/lib/immutable/list/delete_at_spec.rb +18 -0
  109. data/spec/lib/immutable/list/delete_spec.rb +16 -0
  110. data/spec/lib/immutable/list/drop_spec.rb +30 -0
  111. data/spec/lib/immutable/list/drop_while_spec.rb +38 -0
  112. data/spec/lib/immutable/list/each_slice_spec.rb +51 -0
  113. data/spec/lib/immutable/list/each_spec.rb +40 -0
  114. data/spec/lib/immutable/list/each_with_index_spec.rb +28 -0
  115. data/spec/lib/immutable/list/empty_spec.rb +23 -0
  116. data/spec/lib/immutable/list/eql_spec.rb +61 -0
  117. data/spec/lib/immutable/list/fill_spec.rb +49 -0
  118. data/spec/lib/immutable/list/find_all_spec.rb +70 -0
  119. data/spec/lib/immutable/list/find_index_spec.rb +35 -0
  120. data/spec/lib/immutable/list/find_spec.rb +42 -0
  121. data/spec/lib/immutable/list/flat_map_spec.rb +51 -0
  122. data/spec/lib/immutable/list/flatten_spec.rb +30 -0
  123. data/spec/lib/immutable/list/grep_spec.rb +46 -0
  124. data/spec/lib/immutable/list/group_by_spec.rb +41 -0
  125. data/spec/lib/immutable/list/hash_spec.rb +21 -0
  126. data/spec/lib/immutable/list/head_spec.rb +19 -0
  127. data/spec/lib/immutable/list/include_spec.rb +35 -0
  128. data/spec/lib/immutable/list/index_spec.rb +33 -0
  129. data/spec/lib/immutable/list/indices_spec.rb +61 -0
  130. data/spec/lib/immutable/list/init_spec.rb +28 -0
  131. data/spec/lib/immutable/list/inits_spec.rb +28 -0
  132. data/spec/lib/immutable/list/insert_spec.rb +46 -0
  133. data/spec/lib/immutable/list/inspect_spec.rb +29 -0
  134. data/spec/lib/immutable/list/intersperse_spec.rb +28 -0
  135. data/spec/lib/immutable/list/join_spec.rb +63 -0
  136. data/spec/lib/immutable/list/last_spec.rb +23 -0
  137. data/spec/lib/immutable/list/ltlt_spec.rb +19 -0
  138. data/spec/lib/immutable/list/map_spec.rb +45 -0
  139. data/spec/lib/immutable/list/maximum_spec.rb +39 -0
  140. data/spec/lib/immutable/list/merge_by_spec.rb +51 -0
  141. data/spec/lib/immutable/list/merge_spec.rb +59 -0
  142. data/spec/lib/immutable/list/minimum_spec.rb +39 -0
  143. data/spec/lib/immutable/list/multithreading_spec.rb +47 -0
  144. data/spec/lib/immutable/list/none_spec.rb +47 -0
  145. data/spec/lib/immutable/list/one_spec.rb +49 -0
  146. data/spec/lib/immutable/list/partition_spec.rb +115 -0
  147. data/spec/lib/immutable/list/permutation_spec.rb +55 -0
  148. data/spec/lib/immutable/list/pop_spec.rb +25 -0
  149. data/spec/lib/immutable/list/product_spec.rb +23 -0
  150. data/spec/lib/immutable/list/reduce_spec.rb +53 -0
  151. data/spec/lib/immutable/list/reject_spec.rb +45 -0
  152. data/spec/lib/immutable/list/reverse_spec.rb +34 -0
  153. data/spec/lib/immutable/list/rotate_spec.rb +36 -0
  154. data/spec/lib/immutable/list/sample_spec.rb +13 -0
  155. data/spec/lib/immutable/list/select_spec.rb +70 -0
  156. data/spec/lib/immutable/list/size_spec.rb +25 -0
  157. data/spec/lib/immutable/list/slice_spec.rb +229 -0
  158. data/spec/lib/immutable/list/sorting_spec.rb +46 -0
  159. data/spec/lib/immutable/list/span_spec.rb +76 -0
  160. data/spec/lib/immutable/list/split_at_spec.rb +43 -0
  161. data/spec/lib/immutable/list/subsequences_spec.rb +23 -0
  162. data/spec/lib/immutable/list/sum_spec.rb +23 -0
  163. data/spec/lib/immutable/list/tail_spec.rb +30 -0
  164. data/spec/lib/immutable/list/tails_spec.rb +28 -0
  165. data/spec/lib/immutable/list/take_spec.rb +30 -0
  166. data/spec/lib/immutable/list/take_while_spec.rb +46 -0
  167. data/spec/lib/immutable/list/to_a_spec.rb +39 -0
  168. data/spec/lib/immutable/list/to_ary_spec.rb +41 -0
  169. data/spec/lib/immutable/list/to_list_spec.rb +19 -0
  170. data/spec/lib/immutable/list/to_set_spec.rb +17 -0
  171. data/spec/lib/immutable/list/transpose_spec.rb +19 -0
  172. data/spec/lib/immutable/list/union_spec.rb +31 -0
  173. data/spec/lib/immutable/list/uniq_spec.rb +35 -0
  174. data/spec/lib/immutable/list/zip_spec.rb +23 -0
  175. data/spec/lib/immutable/nested/construction_spec.rb +95 -0
  176. data/spec/lib/immutable/set/add_spec.rb +75 -0
  177. data/spec/lib/immutable/set/all_spec.rb +51 -0
  178. data/spec/lib/immutable/set/any_spec.rb +51 -0
  179. data/spec/lib/immutable/set/clear_spec.rb +33 -0
  180. data/spec/lib/immutable/set/compact_spec.rb +30 -0
  181. data/spec/lib/immutable/set/construction_spec.rb +18 -0
  182. data/spec/lib/immutable/set/copying_spec.rb +13 -0
  183. data/spec/lib/immutable/set/count_spec.rb +36 -0
  184. data/spec/lib/immutable/set/delete_spec.rb +71 -0
  185. data/spec/lib/immutable/set/difference_spec.rb +49 -0
  186. data/spec/lib/immutable/set/disjoint_spec.rb +25 -0
  187. data/spec/lib/immutable/set/each_spec.rb +45 -0
  188. data/spec/lib/immutable/set/empty_spec.rb +44 -0
  189. data/spec/lib/immutable/set/eqeq_spec.rb +103 -0
  190. data/spec/lib/immutable/set/eql_spec.rb +109 -0
  191. data/spec/lib/immutable/set/exclusion_spec.rb +47 -0
  192. data/spec/lib/immutable/set/find_spec.rb +35 -0
  193. data/spec/lib/immutable/set/first_spec.rb +28 -0
  194. data/spec/lib/immutable/set/flatten_spec.rb +46 -0
  195. data/spec/lib/immutable/set/grep_spec.rb +57 -0
  196. data/spec/lib/immutable/set/group_by_spec.rb +59 -0
  197. data/spec/lib/immutable/set/hash_spec.rb +22 -0
  198. data/spec/lib/immutable/set/include_spec.rb +60 -0
  199. data/spec/lib/immutable/set/inspect_spec.rb +47 -0
  200. data/spec/lib/immutable/set/intersect_spec.rb +25 -0
  201. data/spec/lib/immutable/set/intersection_spec.rb +52 -0
  202. data/spec/lib/immutable/set/join_spec.rb +64 -0
  203. data/spec/lib/immutable/set/map_spec.rb +59 -0
  204. data/spec/lib/immutable/set/marshal_spec.rb +28 -0
  205. data/spec/lib/immutable/set/maximum_spec.rb +36 -0
  206. data/spec/lib/immutable/set/minimum_spec.rb +36 -0
  207. data/spec/lib/immutable/set/new_spec.rb +53 -0
  208. data/spec/lib/immutable/set/none_spec.rb +47 -0
  209. data/spec/lib/immutable/set/one_spec.rb +47 -0
  210. data/spec/lib/immutable/set/partition_spec.rb +52 -0
  211. data/spec/lib/immutable/set/product_spec.rb +23 -0
  212. data/spec/lib/immutable/set/reduce_spec.rb +55 -0
  213. data/spec/lib/immutable/set/reject_spec.rb +50 -0
  214. data/spec/lib/immutable/set/reverse_each_spec.rb +38 -0
  215. data/spec/lib/immutable/set/sample_spec.rb +13 -0
  216. data/spec/lib/immutable/set/select_spec.rb +73 -0
  217. data/spec/lib/immutable/set/size_spec.rb +17 -0
  218. data/spec/lib/immutable/set/sorting_spec.rb +59 -0
  219. data/spec/lib/immutable/set/subset_spec.rb +51 -0
  220. data/spec/lib/immutable/set/sum_spec.rb +23 -0
  221. data/spec/lib/immutable/set/superset_spec.rb +51 -0
  222. data/spec/lib/immutable/set/to_a_spec.rb +30 -0
  223. data/spec/lib/immutable/set/to_list_spec.rb +35 -0
  224. data/spec/lib/immutable/set/to_set_spec.rb +19 -0
  225. data/spec/lib/immutable/set/union_spec.rb +63 -0
  226. data/spec/lib/immutable/sorted_set/above_spec.rb +51 -0
  227. data/spec/lib/immutable/sorted_set/add_spec.rb +62 -0
  228. data/spec/lib/immutable/sorted_set/at_spec.rb +24 -0
  229. data/spec/lib/immutable/sorted_set/below_spec.rb +51 -0
  230. data/spec/lib/immutable/sorted_set/between_spec.rb +51 -0
  231. data/spec/lib/immutable/sorted_set/clear_spec.rb +43 -0
  232. data/spec/lib/immutable/sorted_set/copying_spec.rb +20 -0
  233. data/spec/lib/immutable/sorted_set/delete_at_spec.rb +18 -0
  234. data/spec/lib/immutable/sorted_set/delete_spec.rb +89 -0
  235. data/spec/lib/immutable/sorted_set/difference_spec.rb +22 -0
  236. data/spec/lib/immutable/sorted_set/disjoint_spec.rb +25 -0
  237. data/spec/lib/immutable/sorted_set/drop_spec.rb +55 -0
  238. data/spec/lib/immutable/sorted_set/drop_while_spec.rb +34 -0
  239. data/spec/lib/immutable/sorted_set/each_spec.rb +28 -0
  240. data/spec/lib/immutable/sorted_set/empty_spec.rb +34 -0
  241. data/spec/lib/immutable/sorted_set/eql_spec.rb +120 -0
  242. data/spec/lib/immutable/sorted_set/exclusion_spec.rb +22 -0
  243. data/spec/lib/immutable/sorted_set/fetch_spec.rb +64 -0
  244. data/spec/lib/immutable/sorted_set/find_index_spec.rb +40 -0
  245. data/spec/lib/immutable/sorted_set/first_spec.rb +18 -0
  246. data/spec/lib/immutable/sorted_set/from_spec.rb +51 -0
  247. data/spec/lib/immutable/sorted_set/group_by_spec.rb +57 -0
  248. data/spec/lib/immutable/sorted_set/include_spec.rb +23 -0
  249. data/spec/lib/immutable/sorted_set/inspect_spec.rb +37 -0
  250. data/spec/lib/immutable/sorted_set/intersect_spec.rb +25 -0
  251. data/spec/lib/immutable/sorted_set/intersection_spec.rb +28 -0
  252. data/spec/lib/immutable/sorted_set/last_spec.rb +36 -0
  253. data/spec/lib/immutable/sorted_set/map_spec.rb +43 -0
  254. data/spec/lib/immutable/sorted_set/marshal_spec.rb +36 -0
  255. data/spec/lib/immutable/sorted_set/maximum_spec.rb +36 -0
  256. data/spec/lib/immutable/sorted_set/minimum_spec.rb +19 -0
  257. data/spec/lib/immutable/sorted_set/new_spec.rb +71 -0
  258. data/spec/lib/immutable/sorted_set/reverse_each_spec.rb +28 -0
  259. data/spec/lib/immutable/sorted_set/sample_spec.rb +13 -0
  260. data/spec/lib/immutable/sorted_set/select_spec.rb +61 -0
  261. data/spec/lib/immutable/sorted_set/size_spec.rb +17 -0
  262. data/spec/lib/immutable/sorted_set/slice_spec.rb +256 -0
  263. data/spec/lib/immutable/sorted_set/sorting_spec.rb +44 -0
  264. data/spec/lib/immutable/sorted_set/subset_spec.rb +47 -0
  265. data/spec/lib/immutable/sorted_set/superset_spec.rb +47 -0
  266. data/spec/lib/immutable/sorted_set/take_spec.rb +54 -0
  267. data/spec/lib/immutable/sorted_set/take_while_spec.rb +33 -0
  268. data/spec/lib/immutable/sorted_set/to_set_spec.rb +17 -0
  269. data/spec/lib/immutable/sorted_set/union_spec.rb +27 -0
  270. data/spec/lib/immutable/sorted_set/up_to_spec.rb +52 -0
  271. data/spec/lib/immutable/sorted_set/values_at_spec.rb +33 -0
  272. data/spec/lib/immutable/vector/add_spec.rb +67 -0
  273. data/spec/lib/immutable/vector/any_spec.rb +69 -0
  274. data/spec/lib/immutable/vector/assoc_spec.rb +45 -0
  275. data/spec/lib/immutable/vector/bsearch_spec.rb +65 -0
  276. data/spec/lib/immutable/vector/clear_spec.rb +33 -0
  277. data/spec/lib/immutable/vector/combination_spec.rb +81 -0
  278. data/spec/lib/immutable/vector/compact_spec.rb +29 -0
  279. data/spec/lib/immutable/vector/compare_spec.rb +31 -0
  280. data/spec/lib/immutable/vector/concat_spec.rb +34 -0
  281. data/spec/lib/immutable/vector/copying_spec.rb +20 -0
  282. data/spec/lib/immutable/vector/count_spec.rb +17 -0
  283. data/spec/lib/immutable/vector/delete_at_spec.rb +53 -0
  284. data/spec/lib/immutable/vector/delete_spec.rb +30 -0
  285. data/spec/lib/immutable/vector/drop_spec.rb +41 -0
  286. data/spec/lib/immutable/vector/drop_while_spec.rb +54 -0
  287. data/spec/lib/immutable/vector/each_index_spec.rb +40 -0
  288. data/spec/lib/immutable/vector/each_spec.rb +44 -0
  289. data/spec/lib/immutable/vector/each_with_index_spec.rb +39 -0
  290. data/spec/lib/immutable/vector/empty_spec.rb +41 -0
  291. data/spec/lib/immutable/vector/eql_spec.rb +76 -0
  292. data/spec/lib/immutable/vector/fetch_spec.rb +64 -0
  293. data/spec/lib/immutable/vector/fill_spec.rb +88 -0
  294. data/spec/lib/immutable/vector/first_spec.rb +18 -0
  295. data/spec/lib/immutable/vector/flat_map_spec.rb +50 -0
  296. data/spec/lib/immutable/vector/flatten_spec.rb +58 -0
  297. data/spec/lib/immutable/vector/get_spec.rb +74 -0
  298. data/spec/lib/immutable/vector/group_by_spec.rb +57 -0
  299. data/spec/lib/immutable/vector/include_spec.rb +30 -0
  300. data/spec/lib/immutable/vector/insert_spec.rb +68 -0
  301. data/spec/lib/immutable/vector/inspect_spec.rb +49 -0
  302. data/spec/lib/immutable/vector/join_spec.rb +58 -0
  303. data/spec/lib/immutable/vector/last_spec.rb +45 -0
  304. data/spec/lib/immutable/vector/length_spec.rb +45 -0
  305. data/spec/lib/immutable/vector/ltlt_spec.rb +65 -0
  306. data/spec/lib/immutable/vector/map_spec.rb +51 -0
  307. data/spec/lib/immutable/vector/marshal_spec.rb +31 -0
  308. data/spec/lib/immutable/vector/maximum_spec.rb +33 -0
  309. data/spec/lib/immutable/vector/minimum_spec.rb +33 -0
  310. data/spec/lib/immutable/vector/multiply_spec.rb +47 -0
  311. data/spec/lib/immutable/vector/new_spec.rb +50 -0
  312. data/spec/lib/immutable/vector/partition_spec.rb +52 -0
  313. data/spec/lib/immutable/vector/permutation_spec.rb +91 -0
  314. data/spec/lib/immutable/vector/pop_spec.rb +26 -0
  315. data/spec/lib/immutable/vector/product_spec.rb +70 -0
  316. data/spec/lib/immutable/vector/reduce_spec.rb +55 -0
  317. data/spec/lib/immutable/vector/reject_spec.rb +43 -0
  318. data/spec/lib/immutable/vector/repeated_combination_spec.rb +77 -0
  319. data/spec/lib/immutable/vector/repeated_permutation_spec.rb +93 -0
  320. data/spec/lib/immutable/vector/reverse_each_spec.rb +31 -0
  321. data/spec/lib/immutable/vector/reverse_spec.rb +21 -0
  322. data/spec/lib/immutable/vector/rindex_spec.rb +36 -0
  323. data/spec/lib/immutable/vector/rotate_spec.rb +73 -0
  324. data/spec/lib/immutable/vector/sample_spec.rb +13 -0
  325. data/spec/lib/immutable/vector/select_spec.rb +63 -0
  326. data/spec/lib/immutable/vector/set_spec.rb +174 -0
  327. data/spec/lib/immutable/vector/shift_spec.rb +27 -0
  328. data/spec/lib/immutable/vector/shuffle_spec.rb +43 -0
  329. data/spec/lib/immutable/vector/slice_spec.rb +240 -0
  330. data/spec/lib/immutable/vector/sorting_spec.rb +56 -0
  331. data/spec/lib/immutable/vector/sum_spec.rb +17 -0
  332. data/spec/lib/immutable/vector/take_spec.rb +42 -0
  333. data/spec/lib/immutable/vector/take_while_spec.rb +34 -0
  334. data/spec/lib/immutable/vector/to_a_spec.rb +41 -0
  335. data/spec/lib/immutable/vector/to_ary_spec.rb +34 -0
  336. data/spec/lib/immutable/vector/to_list_spec.rb +30 -0
  337. data/spec/lib/immutable/vector/to_set_spec.rb +21 -0
  338. data/spec/lib/immutable/vector/transpose_spec.rb +48 -0
  339. data/spec/lib/immutable/vector/uniq_spec.rb +76 -0
  340. data/spec/lib/immutable/vector/unshift_spec.rb +28 -0
  341. data/spec/lib/immutable/vector/update_in_spec.rb +82 -0
  342. data/spec/lib/immutable/vector/values_at_spec.rb +33 -0
  343. data/spec/lib/immutable/vector/zip_spec.rb +57 -0
  344. data/spec/lib/load_spec.rb +42 -0
  345. data/spec/spec_helper.rb +92 -0
  346. metadata +830 -0
@@ -0,0 +1,45 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ [:map, :collect].each do |method|
5
+ describe "##{method}" do
6
+ context "when empty" do
7
+ it "returns self" do
8
+ H.empty.send(method) {}.should equal(H.empty)
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
+ let(:mapped) { hash.send(method) { |key, value| [key.downcase, value.upcase] }}
17
+
18
+ it "preserves the original values" do
19
+ mapped
20
+ hash.should eql(H["A" => "aye", "B" => "bee", "C" => "see"])
21
+ end
22
+
23
+ it "returns a new hash with the mapped values" do
24
+ mapped.should eql(H["a" => "AYE", "b" => "BEE", "c" => "SEE"])
25
+ end
26
+ end
27
+
28
+ context "with no block" do
29
+ it "returns an Enumerator" do
30
+ hash.send(method).class.should be(Enumerator)
31
+ hash.send(method).each { |k,v| [k.downcase, v] }.should == hash.map { |k,v| [k.downcase, v] }
32
+ end
33
+ end
34
+ end
35
+
36
+ context "from a subclass" do
37
+ it "returns an instance of the subclass" do
38
+ subclass = Class.new(Immutable::Hash)
39
+ instance = subclass.new('a' => 'aye', 'b' => 'bee')
40
+ instance.map { |k,v| [k, v.upcase] }.class.should be(subclass)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,28 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#marshal_dump/#marshal_load" do
5
+ let(:ruby) do
6
+ File.join(RbConfig::CONFIG["bindir"], RbConfig::CONFIG["ruby_install_name"])
7
+ end
8
+ let(:child_cmd) do
9
+ %Q|#{ruby} -I lib -r immutable -e 'dict = Immutable::Hash[existing_key: 42, other_thing: "data"]; $stdout.write(Marshal.dump(dict))'|
10
+ end
11
+
12
+ let(:reloaded_hash) do
13
+ IO.popen(child_cmd, "r+") do |child|
14
+ reloaded_hash = Marshal.load(child)
15
+ child.close
16
+ reloaded_hash
17
+ end
18
+ end
19
+
20
+ it "can survive dumping and loading into a new process" do
21
+ expect(reloaded_hash).to eql(H[existing_key: 42, other_thing: "data"])
22
+ end
23
+
24
+ it "is still possible to find items by key after loading" do
25
+ expect(reloaded_hash[:existing_key]).to eq(42)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,82 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#merge" do
5
+ [
6
+ [{}, {}, {}],
7
+ [{"A" => "aye"}, {}, {"A" => "aye"}],
8
+ [{"A" => "aye"}, {"A" => "bee"}, {"A" => "bee"}],
9
+ [{"A" => "aye"}, {"B" => "bee"}, {"A" => "aye", "B" => "bee"}],
10
+ [(1..300).zip(1..300), (150..450).zip(150..450), (1..450).zip(1..450)]
11
+ ].each do |a, b, expected|
12
+ context "for #{a.inspect} and #{b.inspect}" do
13
+ let(:hash_a) { H[a] }
14
+ let(:hash_b) { H[b] }
15
+ let(:result) { hash_a.merge(hash_b) }
16
+
17
+ it "returns #{expected.inspect} when passed an Immutable::Hash" do
18
+ result.should eql(H[expected])
19
+ end
20
+
21
+ it "returns #{expected.inspect} when passed a Ruby Hash" do
22
+ H[a].merge(::Hash[b]).should eql(H[expected])
23
+ end
24
+
25
+ it "doesn't change the original Hashes" do
26
+ result
27
+ hash_a.should eql(H[a])
28
+ hash_b.should eql(H[b])
29
+ end
30
+ end
31
+ end
32
+
33
+ context "when merging with an empty Hash" do
34
+ it "returns self" do
35
+ hash = H[a: 1, b: 2]
36
+ hash.merge(H.empty).should be(hash)
37
+ end
38
+ end
39
+
40
+ context "when merging with subset Hash" do
41
+ it "returns self" do
42
+ big_hash = H[(1..300).zip(1..300)]
43
+ small_hash = H[(1..200).zip(1..200)]
44
+ big_hash.merge(small_hash).should be(big_hash)
45
+ end
46
+ end
47
+
48
+ context "when called on a subclass" do
49
+ it "returns an instance of the subclass" do
50
+ subclass = Class.new(Immutable::Hash)
51
+ instance = subclass.new(a: 1, b: 2)
52
+ instance.merge(c: 3, d: 4).class.should be(subclass)
53
+ end
54
+ end
55
+
56
+ it "sets any duplicate key to the value of block if passed a block" do
57
+ h1 = H[a: 2, b: 1, d: 5]
58
+ h2 = H[a: -2, b: 4, c: -3]
59
+ r = h1.merge(h2) { |k,x,y| nil }
60
+ r.should eql(H[a: nil, b: nil, c: -3, d: 5])
61
+
62
+ r = h1.merge(h2) { |k,x,y| "#{k}:#{x+2*y}" }
63
+ r.should eql(H[a: "a:-2", b: "b:9", c: -3, d: 5])
64
+
65
+ lambda {
66
+ h1.merge(h2) { |k, x, y| raise(IndexError) }
67
+ }.should raise_error(IndexError)
68
+
69
+ r = h1.merge(h1) { |k,x,y| :x }
70
+ r.should eql(H[a: :x, b: :x, d: :x])
71
+ end
72
+
73
+ it "yields key/value pairs in the same order as #each" do
74
+ hash = H[a: 1, b: 2, c: 3]
75
+ each_pairs = []
76
+ merge_pairs = []
77
+ hash.each { |k, v| each_pairs << [k, v] }
78
+ hash.merge(hash) { |k, v1, v2| merge_pairs << [k, v1] }
79
+ each_pairs.should == merge_pairs
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,45 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ let(:hash) { H["a" => 3, "b" => 2, "c" => 1] }
5
+
6
+ describe "#min" do
7
+ it "returns the smallest key/val pair" do
8
+ hash.min.should == ["a", 3]
9
+ end
10
+ end
11
+
12
+ describe "#max" do
13
+ it "returns the largest key/val pair" do
14
+ hash.max.should == ["c", 1]
15
+ end
16
+ end
17
+
18
+ describe "#min_by" do
19
+ it "returns the smallest key/val pair (after passing it through a key function)" do
20
+ hash.min_by { |k,v| v }.should == ["c", 1]
21
+ end
22
+
23
+ it "returns the first key/val pair yielded by #each in case of a tie" do
24
+ hash.min_by { 0 }.should == hash.each.first
25
+ end
26
+
27
+ it "returns nil if the hash is empty" do
28
+ H.empty.min_by { |k,v| v }.should be_nil
29
+ end
30
+ end
31
+
32
+ describe "#max_by" do
33
+ it "returns the largest key/val pair (after passing it through a key function)" do
34
+ hash.max_by { |k,v| v }.should == ["a", 3]
35
+ end
36
+
37
+ it "returns the first key/val pair yielded by #each in case of a tie" do
38
+ hash.max_by { 0 }.should == hash.each.first
39
+ end
40
+
41
+ it "returns nil if the hash is empty" do
42
+ H.empty.max_by { |k,v| v }.should be_nil
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,70 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe ".new" do
5
+ it "is amenable to overriding of #initialize" do
6
+ class SnazzyHash < Immutable::Hash
7
+ def initialize
8
+ super({'snazzy?' => 'oh yeah'})
9
+ end
10
+ end
11
+
12
+ SnazzyHash.new['snazzy?'].should == 'oh yeah'
13
+ end
14
+
15
+ context "from a subclass" do
16
+ it "returns a frozen instance of the subclass" do
17
+ subclass = Class.new(Immutable::Hash)
18
+ instance = subclass.new("some" => "values")
19
+ instance.class.should be(subclass)
20
+ instance.frozen?.should be true
21
+ end
22
+ end
23
+
24
+ it "accepts an array as initializer" do
25
+ H.new([['a', 'b'], ['c', 'd']]).should eql(H['a' => 'b', 'c' => 'd'])
26
+ end
27
+
28
+ it "returns a Hash which doesn't change even if initializer is mutated" do
29
+ rbhash = {a: 1, b: 2}
30
+ hash = H.new(rbhash)
31
+ rbhash[:a] = 'BAD'
32
+ hash.should eql(H[a: 1, b: 2])
33
+ end
34
+ end
35
+
36
+ describe ".[]" do
37
+ it "accepts a Ruby Hash as initializer" do
38
+ hash = H[a: 1, b: 2]
39
+ hash.class.should be(Immutable::Hash)
40
+ hash.size.should == 2
41
+ hash.key?(:a).should == true
42
+ hash.key?(:b).should == true
43
+ end
44
+
45
+ it "accepts a Immutable::Hash as initializer" do
46
+ hash = H[H.new(a: 1, b: 2)]
47
+ hash.class.should be(Immutable::Hash)
48
+ hash.size.should == 2
49
+ hash.key?(:a).should == true
50
+ hash.key?(:b).should == true
51
+ end
52
+
53
+ it "accepts an array as initializer" do
54
+ hash = H[[[:a, 1], [:b, 2]]]
55
+ hash.class.should be(Immutable::Hash)
56
+ hash.size.should == 2
57
+ hash.key?(:a).should == true
58
+ hash.key?(:b).should == true
59
+ end
60
+
61
+ it "can be used with a subclass of Immutable::Hash" do
62
+ subclass = Class.new(Immutable::Hash)
63
+ instance = subclass[a: 1, b: 2]
64
+ instance.class.should be(subclass)
65
+ instance.size.should == 2
66
+ instance.key?(:a).should == true
67
+ instance.key?(:b).should == true
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,48 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#none?" do
5
+ context "when empty" do
6
+ it "with a block returns true" do
7
+ H.empty.none? {}.should == true
8
+ end
9
+
10
+ it "with no block returns true" do
11
+ H.empty.none?.should == true
12
+ end
13
+ end
14
+
15
+ context "when not empty" do
16
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see", nil => "NIL"] }
17
+
18
+ context "with a block" do
19
+ [
20
+ %w[A aye],
21
+ %w[B bee],
22
+ %w[C see],
23
+ [nil, "NIL"],
24
+ ].each do |pair|
25
+ it "returns false if the block ever returns true (#{pair.inspect})" do
26
+ hash.none? { |key, value| key == pair.first && value == pair.last }.should == false
27
+ end
28
+
29
+ it "returns true if the block always returns false" do
30
+ hash.none? { |key, value| key == "D" && value == "dee" }.should == true
31
+ end
32
+
33
+ it "stops iterating as soon as the block returns true" do
34
+ yielded = []
35
+ hash.none? { |k,v| yielded << k; true }
36
+ yielded.size.should == 1
37
+ end
38
+ end
39
+ end
40
+
41
+ context "with no block" do
42
+ it "returns false" do
43
+ hash.none?.should == false
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,35 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ let(:hash) { H["a" => 1, "b" => 2, "c" => 3, "d" => 4] }
5
+ let(:partition) { hash.partition { |k,v| v % 2 == 0 }}
6
+
7
+ describe "#partition" do
8
+ it "returns a pair of Immutable::Hashes" do
9
+ partition.each { |h| h.class.should be(Immutable::Hash) }
10
+ partition.should be_frozen
11
+ end
12
+
13
+ it "returns key/val pairs for which predicate is true in first Hash" do
14
+ partition[0].should == {"b" => 2, "d" => 4}
15
+ end
16
+
17
+ it "returns key/val pairs for which predicate is false in second Hash" do
18
+ partition[1].should == {"a" => 1, "c" => 3}
19
+ end
20
+
21
+ it "doesn't modify the original Hash" do
22
+ partition
23
+ hash.should eql(H["a" => 1, "b" => 2, "c" => 3, "d" => 4])
24
+ end
25
+
26
+ context "from a subclass" do
27
+ it "should return instances of the subclass" do
28
+ subclass = Class.new(Immutable::Hash)
29
+ instance = subclass.new("a" => 1, "b" => 2, "c" => 3, "d" => 4)
30
+ partition = instance.partition { |k,v| v % 2 == 0 }
31
+ partition.each { |h| h.class.should be(subclass) }
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,34 @@
1
+ require "spec_helper"
2
+ require "pp"
3
+ require "stringio"
4
+
5
+ describe Immutable::Hash do
6
+ describe "#pretty_print" do
7
+ let(:hash) { Immutable::Hash.new(DeterministicHash.new(1,1) => "tin", DeterministicHash.new(2,2) => "earwax", DeterministicHash.new(3,3) => "neanderthal") }
8
+ let(:stringio) { StringIO.new }
9
+
10
+
11
+ it "prints the whole Hash on one line if it fits" do
12
+ PP.pp(hash, stringio, 80)
13
+ stringio.string.chomp.should == 'Immutable::Hash[1 => "tin", 2 => "earwax", 3 => "neanderthal"]'
14
+ end
15
+
16
+ it "prints each key/val pair on its own line, if not" do
17
+ PP.pp(hash, stringio, 20)
18
+ stringio.string.chomp.should == 'Immutable::Hash[
19
+ 1 => "tin",
20
+ 2 => "earwax",
21
+ 3 => "neanderthal"]'
22
+ end
23
+
24
+ it "prints keys and vals on separate lines, if space is very tight" do
25
+ PP.pp(hash, stringio, 15)
26
+ # the trailing space after "3 =>" below is needed, don't remove it
27
+ stringio.string.chomp.should == 'Immutable::Hash[
28
+ 1 => "tin",
29
+ 2 => "earwax",
30
+ 3 =>
31
+ "neanderthal"]'
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,102 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#put" do
5
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
6
+
7
+ context "with a block" do
8
+ it "passes the value to the block" do
9
+ hash.put("A") { |value| value.should == "aye" }
10
+ end
11
+
12
+ it "replaces the value with the result of the block" do
13
+ result = hash.put("A") { |value| "FLIBBLE" }
14
+ result.get("A").should == "FLIBBLE"
15
+ end
16
+
17
+ it "supports to_proc methods" do
18
+ result = hash.put("A", &:upcase)
19
+ result.get("A").should == "AYE"
20
+ end
21
+
22
+ context "if there is no existing association" do
23
+ it "passes nil to the block" do
24
+ hash.put("D") { |value| value.should be_nil }
25
+ end
26
+
27
+ it "stores the result of the block as the new value" do
28
+ result = hash.put("D") { |value| "FLIBBLE" }
29
+ result.get("D").should == "FLIBBLE"
30
+ end
31
+ end
32
+ end
33
+
34
+ context "with a unique key" do
35
+ let(:result) { hash.put("D", "dee") }
36
+
37
+ it "preserves the original" do
38
+ result
39
+ hash.should eql(H["A" => "aye", "B" => "bee", "C" => "see"])
40
+ end
41
+
42
+ it "returns a copy with the superset of key/value pairs" do
43
+ result.should eql(H["A" => "aye", "B" => "bee", "C" => "see", "D" => "dee"])
44
+ end
45
+ end
46
+
47
+ context "with a duplicate key" do
48
+ let(:result) { hash.put("C", "sea") }
49
+
50
+ it "preserves the original" do
51
+ result
52
+ hash.should eql(H["A" => "aye", "B" => "bee", "C" => "see"])
53
+ end
54
+
55
+ it "returns a copy with the superset of key/value pairs" do
56
+ result.should eql(H["A" => "aye", "B" => "bee", "C" => "sea"])
57
+ end
58
+ end
59
+
60
+ context "with duplicate key and identical value" do
61
+ let(:hash) { H["X" => 1, "Y" => 2] }
62
+ let(:result) { hash.put("X", 1) }
63
+
64
+ it "returns the original hash unmodified" do
65
+ result.should be(hash)
66
+ end
67
+
68
+ context "with big hash (force nested tries)" do
69
+ let(:keys) { (0..99).map(&:to_s) }
70
+ let(:values) { (100..199).to_a }
71
+ let(:hash) { H[keys.zip(values)] }
72
+
73
+ it "returns the original hash unmodified for all changes" do
74
+ keys.each_with_index do |key, index|
75
+ result = hash.put(key, values[index])
76
+ result.should be(hash)
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ context "with unequal keys which hash to the same value" do
83
+ let(:hash) { H[DeterministicHash.new('a', 1) => 'aye'] }
84
+
85
+ it "stores and can retrieve both" do
86
+ result = hash.put(DeterministicHash.new('b', 1), 'bee')
87
+ result.get(DeterministicHash.new('a', 1)).should eql('aye')
88
+ result.get(DeterministicHash.new('b', 1)).should eql('bee')
89
+ end
90
+ end
91
+
92
+ context "when a String is inserted as key and then mutated" do
93
+ it "is not affected" do
94
+ string = "a string!"
95
+ hash = H.empty.put(string, 'a value!')
96
+ string.upcase!
97
+ hash['a string!'].should == 'a value!'
98
+ hash['A STRING!'].should be_nil
99
+ end
100
+ end
101
+ end
102
+ end