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,38 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe ".hash" do
5
+ context "with nothing" do
6
+ it "returns the canonical empty hash" do
7
+ H.empty.should be_empty
8
+ H.empty.should equal(Immutable::EmptyHash)
9
+ end
10
+ end
11
+
12
+ context "with an implicit hash" do
13
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
14
+
15
+ it "is equivalent to repeatedly using #put" do
16
+ hash.should eql(H.empty.put("A", "aye").put("B", "bee").put("C", "see"))
17
+ hash.size.should == 3
18
+ end
19
+ end
20
+
21
+ context "with an array of pairs" do
22
+ let(:hash) { H[[[:a, 1], [:b, 2]]] }
23
+
24
+ it "initializes a new Hash" do
25
+ hash.should eql(H[a: 1, b: 2])
26
+ end
27
+ end
28
+
29
+ context "with an Immutable::Hash" do
30
+ let(:hash) { H[a: 1, b: 2] }
31
+ let(:other) { H[hash] }
32
+
33
+ it "initializes an equivalent Hash" do
34
+ hash.should eql(other)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
5
+
6
+ [:dup, :clone].each do |method|
7
+ describe "##{method}" do
8
+ it "returns self" do
9
+ hash.send(method).should equal(hash)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,72 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#default_proc" do
5
+ let(:hash) { H.new(1 => 2, 2 => 4) { |k| k * 2 } }
6
+
7
+ it "returns the default block given when the Hash was created" do
8
+ hash.default_proc.class.should be(Proc)
9
+ hash.default_proc.call(3).should == 6
10
+ end
11
+
12
+ it "returns nil if no default block was given" do
13
+ H.empty.default_proc.should be_nil
14
+ end
15
+
16
+ context "after a key/val pair are inserted" do
17
+ it "doesn't change" do
18
+ other = hash.put(3, 6)
19
+ other.default_proc.should be(hash.default_proc)
20
+ other.default_proc.call(4).should == 8
21
+ end
22
+ end
23
+
24
+ context "after all key/val pairs are filtered out" do
25
+ it "doesn't change" do
26
+ other = hash.reject { true }
27
+ other.default_proc.should be(hash.default_proc)
28
+ other.default_proc.call(4).should == 8
29
+ end
30
+ end
31
+
32
+ context "after Hash is inverted" do
33
+ it "doesn't change" do
34
+ other = hash.invert
35
+ other.default_proc.should be(hash.default_proc)
36
+ other.default_proc.call(4).should == 8
37
+ end
38
+ end
39
+
40
+ context "when a slice is taken" do
41
+ it "doesn't change" do
42
+ other = hash.slice(1)
43
+ other.default_proc.should be(hash.default_proc)
44
+ other.default_proc.call(5).should == 10
45
+ end
46
+ end
47
+
48
+ context "when keys are removed with #except" do
49
+ it "doesn't change" do
50
+ other = hash.except(1, 2)
51
+ other.default_proc.should be(hash.default_proc)
52
+ other.default_proc.call(5).should == 10
53
+ end
54
+ end
55
+
56
+ context "when Hash is mapped" do
57
+ it "doesn't change" do
58
+ other = hash.map { |k,v| [k + 10, v] }
59
+ other.default_proc.should be(hash.default_proc)
60
+ other.default_proc.call(5).should == 10
61
+ end
62
+ end
63
+
64
+ context "when another Hash is merged in" do
65
+ it "doesn't change" do
66
+ other = hash.merge(3 => 6, 4 => 8)
67
+ other.default_proc.should be(hash.default_proc)
68
+ other.default_proc.call(5).should == 10
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#delete" do
5
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
6
+
7
+ context "with an existing key" do
8
+ let(:result) { hash.delete("B") }
9
+
10
+ it "preserves the original" do
11
+ hash.should eql(H["A" => "aye", "B" => "bee", "C" => "see"])
12
+ end
13
+
14
+ it "returns a copy with the remaining key/value pairs" do
15
+ result.should eql(H["A" => "aye", "C" => "see"])
16
+ end
17
+ end
18
+
19
+ context "with a non-existing key" do
20
+ let(:result) { hash.delete("D") }
21
+
22
+ it "preserves the original values" do
23
+ hash.should eql(H["A" => "aye", "B" => "bee", "C" => "see"])
24
+ end
25
+
26
+ it "returns self" do
27
+ result.should equal(hash)
28
+ end
29
+ end
30
+
31
+ context "when removing the last key" do
32
+ context "from a Hash with no default block" do
33
+ it "returns the canonical empty Hash" do
34
+ hash.delete('A').delete('B').delete('C').should be(Immutable::EmptyHash)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,77 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
5
+
6
+ [:each, :each_pair].each do |method|
7
+ describe "##{method}" do
8
+ context "with a block (internal iteration)" do
9
+ it "returns self" do
10
+ hash.send(method) {}.should be(hash)
11
+ end
12
+
13
+ it "yields all key/value pairs" do
14
+ actual_pairs = {}
15
+ hash.send(method) { |key, value| actual_pairs[key] = value }
16
+ actual_pairs.should == { "A" => "aye", "B" => "bee", "C" => "see" }
17
+ end
18
+
19
+ it "yields key/value pairs in the same order as #each_key and #each_value" do
20
+ hash.each.to_a.should eql(hash.each_key.zip(hash.each_value))
21
+ end
22
+
23
+ it "yields both of a pair of colliding keys" do
24
+ yielded = []
25
+ hash = H[DeterministicHash.new('a', 1) => 1, DeterministicHash.new('b', 1) => 1]
26
+ hash.each { |k,v| yielded << k }
27
+ yielded.size.should == 2
28
+ yielded.map { |x| x.value }.sort.should == ['a', 'b']
29
+ end
30
+
31
+ it "yields only the key to a block expecting |key,|" do
32
+ keys = []
33
+ hash.each { |key,| keys << key }
34
+ keys.sort.should == ["A", "B", "C"]
35
+ end
36
+ end
37
+
38
+ context "with no block" do
39
+ it "returns an Enumerator" do
40
+ @result = hash.send(method)
41
+ @result.class.should be(Enumerator)
42
+ @result.to_a.should == hash.to_a
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ describe "#each_key" do
49
+ it "yields all keys" do
50
+ keys = []
51
+ hash.each_key { |k| keys << k }
52
+ keys.sort.should == ['A', 'B', 'C']
53
+ end
54
+
55
+ context "with no block" do
56
+ it "returns an Enumerator" do
57
+ hash.each_key.class.should be(Enumerator)
58
+ hash.each_key.to_a.sort.should == ['A', 'B', 'C']
59
+ end
60
+ end
61
+ end
62
+
63
+ describe "#each_value" do
64
+ it "yields all values" do
65
+ values = []
66
+ hash.each_value { |v| values << v }
67
+ values.sort.should == ['aye', 'bee', 'see']
68
+ end
69
+
70
+ context "with no block" do
71
+ it "returns an Enumerator" do
72
+ hash.each_value.class.should be(Enumerator)
73
+ hash.each_value.to_a.sort.should == ['aye', 'bee', 'see']
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,29 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#each_with_index" do
5
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
6
+
7
+ describe "with a block (internal iteration)" do
8
+ it "returns self" do
9
+ hash.each_with_index {}.should be(hash)
10
+ end
11
+
12
+ it "yields all key/value pairs with numeric indexes" do
13
+ actual_pairs = {}
14
+ indexes = []
15
+ hash.each_with_index { |(key, value), index| actual_pairs[key] = value; indexes << index }
16
+ actual_pairs.should == { "A" => "aye", "B" => "bee", "C" => "see" }
17
+ indexes.sort.should == [0, 1, 2]
18
+ end
19
+ end
20
+
21
+ describe "with no block" do
22
+ it "returns an Enumerator" do
23
+ hash.each_with_index.should be_kind_of(Enumerator)
24
+ hash.each_with_index.to_a.map(&:first).sort.should eql([["A", "aye"], ["B", "bee"], ["C", "see"]])
25
+ hash.each_with_index.to_a.map(&:last).should eql([0,1,2])
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,43 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#empty?" do
5
+ [
6
+ [[], true],
7
+ [["A" => "aye"], false],
8
+ [["A" => "aye", "B" => "bee", "C" => "see"], false],
9
+ ].each do |pairs, result|
10
+ it "returns #{result} for #{pairs.inspect}" do
11
+ H[*pairs].empty?.should == result
12
+ end
13
+ end
14
+
15
+ it "returns true for empty hashes which have a default block" do
16
+ H.new { 'default' }.empty?.should == true
17
+ end
18
+ end
19
+
20
+ describe ".empty" do
21
+ it "returns the canonical empty Hash" do
22
+ H.empty.should be_empty
23
+ H.empty.should be(Immutable::EmptyHash)
24
+ end
25
+
26
+ context "from a subclass" do
27
+ it "returns an empty instance of the subclass" do
28
+ subclass = Class.new(Immutable::Hash)
29
+ subclass.empty.class.should be subclass
30
+ subclass.empty.should be_empty
31
+ end
32
+
33
+ it "calls overridden #initialize when creating empty Hash" do
34
+ subclass = Class.new(Immutable::Hash) do
35
+ def initialize
36
+ @variable = 'value'
37
+ end
38
+ end
39
+ subclass.empty.instance_variable_get(:@variable).should == 'value'
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,69 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
5
+
6
+ describe "#eql?" do
7
+ it "returns false when comparing with a standard hash" do
8
+ hash.eql?("A" => "aye", "B" => "bee", "C" => "see").should == false
9
+ end
10
+
11
+ it "returns false when comparing with an arbitrary object" do
12
+ hash.eql?(Object.new).should == false
13
+ end
14
+
15
+ it "returns false when comparing with a subclass of Immutable::Hash" do
16
+ subclass = Class.new(Immutable::Hash)
17
+ instance = subclass.new("A" => "aye", "B" => "bee", "C" => "see")
18
+ hash.eql?(instance).should == false
19
+ end
20
+ end
21
+
22
+ describe "#==" do
23
+ it "returns true when comparing with a standard hash" do
24
+ (hash == {"A" => "aye", "B" => "bee", "C" => "see"}).should == true
25
+ end
26
+
27
+ it "returns false when comparing with an arbitrary object" do
28
+ (hash == Object.new).should == false
29
+ end
30
+
31
+ it "returns true when comparing with a subclass of Immutable::Hash" do
32
+ subclass = Class.new(Immutable::Hash)
33
+ instance = subclass.new("A" => "aye", "B" => "bee", "C" => "see")
34
+ (hash == instance).should == true
35
+ end
36
+ end
37
+
38
+ [:eql?, :==].each do |method|
39
+ describe "##{method}" do
40
+ [
41
+ [{}, {}, true],
42
+ [{ "A" => "aye" }, {}, false],
43
+ [{}, { "A" => "aye" }, false],
44
+ [{ "A" => "aye" }, { "A" => "aye" }, true],
45
+ [{ "A" => "aye" }, { "B" => "bee" }, false],
46
+ [{ "A" => "aye", "B" => "bee" }, { "A" => "aye" }, false],
47
+ [{ "A" => "aye" }, { "A" => "aye", "B" => "bee" }, false],
48
+ [{ "A" => "aye", "B" => "bee", "C" => "see" }, { "A" => "aye", "B" => "bee", "C" => "see" }, true],
49
+ [{ "C" => "see", "A" => "aye", "B" => "bee" }, { "A" => "aye", "B" => "bee", "C" => "see" }, true],
50
+ ].each do |a, b, expected|
51
+ describe "returns #{expected.inspect}" do
52
+ it "for #{a.inspect} and #{b.inspect}" do
53
+ H[a].send(method, H[b]).should == expected
54
+ end
55
+
56
+ it "for #{b.inspect} and #{a.inspect}" do
57
+ H[b].send(method, H[a]).should == expected
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ it "returns true on a large hash which is modified and then modified back again" do
65
+ hash = H.new((1..1000).zip(2..1001))
66
+ hash.put('a', 1).delete('a').should == hash
67
+ hash.put('b', 2).delete('b').should eql(hash)
68
+ end
69
+ end
@@ -0,0 +1,42 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#except" do
5
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see", nil => "NIL"] }
6
+
7
+ context "with only keys that the Hash has" do
8
+ it "returns a Hash without those values" do
9
+ hash.except("B", nil).should eql(H["A" => "aye", "C" => "see"])
10
+ end
11
+
12
+ it "doesn't change the original Hash" do
13
+ hash.except("B", nil)
14
+ hash.should eql(H["A" => "aye", "B" => "bee", "C" => "see", nil => "NIL"])
15
+ end
16
+ end
17
+
18
+ context "with keys that the Hash doesn't have" do
19
+ it "returns a Hash without the values that it had keys for" do
20
+ hash.except("B", "A", 3).should eql(H["C" => "see", nil => "NIL"])
21
+ end
22
+
23
+ it "doesn't change the original Hash" do
24
+ hash.except("B", "A", 3)
25
+ hash.should eql(H["A" => "aye", "B" => "bee", "C" => "see", nil => "NIL"])
26
+ end
27
+ end
28
+
29
+ it "works on a large Hash, with many combinations of input" do
30
+ keys = (1..1000).to_a
31
+ original = H.new(keys.zip(2..1001))
32
+ 100.times do
33
+ to_remove = rand(100).times.collect { keys.sample }
34
+ result = original.except(*to_remove)
35
+ result.size.should == original.size - to_remove.uniq.size
36
+ to_remove.each { |key| result.key?(key).should == false }
37
+ (keys.sample(100) - to_remove).each { |key| result.key?(key).should == true }
38
+ end
39
+ original.should eql(H.new(keys.zip(2..1001))) # shouldn't have changed
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,57 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#fetch" do
5
+ context "with no default provided" do
6
+ context "when the key exists" do
7
+ it "returns the value associated with the key" do
8
+ H["A" => "aye"].fetch("A").should == "aye"
9
+ end
10
+ end
11
+
12
+ context "when the key does not exist" do
13
+ it "raises a KeyError" do
14
+ -> { H["A" => "aye"].fetch("B") }.should raise_error(KeyError)
15
+ end
16
+ end
17
+ end
18
+
19
+ context "with a default value" do
20
+ context "when the key exists" do
21
+ it "returns the value associated with the key" do
22
+ H["A" => "aye"].fetch("A", "default").should == "aye"
23
+ end
24
+ end
25
+
26
+ context "when the key does not exist" do
27
+ it "returns the default value" do
28
+ H["A" => "aye"].fetch("B", "default").should == "default"
29
+ end
30
+ end
31
+ end
32
+
33
+ context "with a default block" do
34
+ context "when the key exists" do
35
+ it "returns the value associated with the key" do
36
+ H["A" => "aye"].fetch("A") { "default".upcase }.should == "aye"
37
+ end
38
+ end
39
+
40
+ context "when the key does not exist" do
41
+ it "invokes the default block with the missing key as paramter" do
42
+ H["A" => "aye"].fetch("B") { |key| key.should == "B" }
43
+ H["A" => "aye"].fetch("B") { "default".upcase }.should == "DEFAULT"
44
+ end
45
+ end
46
+ end
47
+
48
+ it "gives precedence to default block over default argument if passed both" do
49
+ H["A" => "aye"].fetch("B", 'one') { 'two' }.should == 'two'
50
+ end
51
+
52
+ it "raises an ArgumentError when not passed one or 2 arguments" do
53
+ -> { H.empty.fetch }.should raise_error(ArgumentError)
54
+ -> { H.empty.fetch(1, 2, 3) }.should raise_error(ArgumentError)
55
+ end
56
+ end
57
+ end