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,43 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ [:find, :detect].each do |method|
5
+ describe "##{method}" do
6
+ [
7
+ [[], "A", nil],
8
+ [[], nil, nil],
9
+ [["A" => "aye"], "A", ["A", "aye"]],
10
+ [["A" => "aye"], "B", nil],
11
+ [["A" => "aye"], nil, nil],
12
+ [["A" => "aye", "B" => "bee", nil => "NIL"], "A", ["A", "aye"]],
13
+ [["A" => "aye", "B" => "bee", nil => "NIL"], "B", ["B", "bee"]],
14
+ [["A" => "aye", "B" => "bee", nil => "NIL"], nil, [nil, "NIL"]],
15
+ [["A" => "aye", "B" => "bee", nil => "NIL"], "C", nil],
16
+ ].each do |values, key, expected|
17
+ describe "on #{values.inspect}" do
18
+ let(:hash) { H[*values] }
19
+
20
+ describe "with a block" do
21
+ it "returns #{expected.inspect}" do
22
+ hash.send(method) { |k, v| k == key }.should == expected
23
+ end
24
+ end
25
+
26
+ describe "without a block" do
27
+ it "returns an Enumerator" do
28
+ result = hash.send(method)
29
+ result.class.should be(Enumerator)
30
+ result.each { |k,v| k == key }.should == expected
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ it "stops iterating when the block returns true" do
37
+ yielded = []
38
+ H[a: 1, b: 2].find { |k,v| yielded << k; true }
39
+ yielded.size.should == 1
40
+ end
41
+ end
42
+ end
43
+ 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 "#flat_map" do
7
+ it "yields each key/val pair" do
8
+ passed = []
9
+ hash.flat_map { |pair| passed << pair }
10
+ passed.sort.should == [['A', 'aye'], ['B', 'bee'], ['C', 'see']]
11
+ end
12
+
13
+ it "returns the concatenation of block return values" do
14
+ hash.flat_map { |k,v| [k,v] }.sort.should == ['A', 'B', 'C', 'aye', 'bee', 'see']
15
+ hash.flat_map { |k,v| L[k,v] }.sort.should == ['A', 'B', 'C', 'aye', 'bee', 'see']
16
+ hash.flat_map { |k,v| V[k,v] }.sort.should == ['A', 'B', 'C', 'aye', 'bee', 'see']
17
+ end
18
+
19
+ it "doesn't change the receiver" do
20
+ hash.flat_map { |k,v| [k,v] }
21
+ hash.should eql(H["A" => "aye", "B" => "bee", "C" => "see"])
22
+ end
23
+
24
+ context "with no block" do
25
+ it "returns an Enumerator" do
26
+ hash.flat_map.class.should be(Enumerator)
27
+ hash.flat_map.each { |k,v| [k] }.sort.should == ['A', 'B', 'C']
28
+ end
29
+ end
30
+
31
+ it "returns an empty array if only empty arrays are returned by block" do
32
+ hash.flat_map { [] }.should eql([])
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,98 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#flatten" do
5
+ context "with flatten depth of zero" do
6
+ it "returns a vector of keys/value" do
7
+ hash = H[a: 1, b: 2]
8
+ hash.flatten(0).sort.should eql(V[[:a, 1], [:b, 2]])
9
+ end
10
+ end
11
+
12
+ context "without array keys or values" do
13
+ it "returns a vector of keys and values" do
14
+ hash = H[a: 1, b: 2, c: 3]
15
+ possibilities = [[:a, 1, :b, 2, :c, 3],
16
+ [:a, 1, :c, 3, :b, 2],
17
+ [:b, 2, :a, 1, :c, 3],
18
+ [:b, 2, :c, 3, :a, 1],
19
+ [:c, 3, :a, 1, :b, 2],
20
+ [:c, 3, :b, 2, :a, 1]]
21
+ possibilities.include?(hash.flatten).should == true
22
+ possibilities.include?(hash.flatten(1)).should == true
23
+ possibilities.include?(hash.flatten(2)).should == true
24
+ hash.flatten(2).class.should be(Immutable::Vector)
25
+ possibilities.include?(hash.flatten(10)).should == true
26
+ end
27
+
28
+ it "doesn't modify the receiver" do
29
+ hash = H[a: 1, b: 2, c: 3]
30
+ hash.flatten(1)
31
+ hash.flatten(2)
32
+ hash.should eql(H[a: 1, b: 2, c: 3])
33
+ end
34
+ end
35
+
36
+ context "on an empty Hash" do
37
+ it "returns an empty Vector" do
38
+ H.empty.flatten.should eql(V.empty)
39
+ end
40
+ end
41
+
42
+ context "with array keys" do
43
+ it "flattens array keys into returned vector if flatten depth is sufficient" do
44
+ hash = H[[1, 2] => 3, [4, 5] => 6]
45
+ [[[1, 2], 3, [4, 5], 6], [[4, 5], 6, [1, 2], 3]].include?(hash.flatten(1)).should == true
46
+ [[[1, 2], 3, [4, 5], 6], [[4, 5], 6, [1, 2], 3]].include?(hash.flatten).should == true
47
+ hash.flatten(1).class.should be(Immutable::Vector)
48
+ [[1, 2, 3, 4, 5, 6], [4, 5, 6, 1, 2, 3]].include?(hash.flatten(2)).should == true
49
+ [[1, 2, 3, 4, 5, 6], [4, 5, 6, 1, 2, 3]].include?(hash.flatten(3)).should == true
50
+ end
51
+
52
+ it "doesn't modify the receiver (or its contents)" do
53
+ hash = H[[1, 2] => 3, [4, 5] => 6]
54
+ hash.flatten(1)
55
+ hash.flatten(2)
56
+ hash.should eql(H[[1, 2] => 3, [4, 5] => 6])
57
+ end
58
+ end
59
+
60
+ context "with array values" do
61
+ it "flattens array values into returned vector if flatten depth is sufficient" do
62
+ hash = H[1 => [2, 3], 4 => [5, 6]]
63
+ [[1, [2, 3], 4, [5, 6]], [4, [5, 6], 1, [2, 3]]].include?(hash.flatten(1)).should == true
64
+ [[1, [2, 3], 4, [5, 6]], [4, [5, 6], 1, [2, 3]]].include?(hash.flatten).should == true
65
+ [[1, 2, 3, 4, 5, 6], [4, 5, 6, 1, 2, 3]].include?(hash.flatten(2)).should == true
66
+ [[1, 2, 3, 4, 5, 6], [4, 5, 6, 1, 2, 3]].include?(hash.flatten(3)).should == true
67
+ hash.flatten(3).class.should be(Immutable::Vector)
68
+ end
69
+
70
+ it "doesn't modify the receiver (or its contents)" do
71
+ hash = H[1 => [2, 3], 4 => [5, 6]]
72
+ hash.flatten(1)
73
+ hash.flatten(2)
74
+ hash.should eql(H[1 => [2, 3], 4 => [5, 6]])
75
+ end
76
+ end
77
+
78
+ context "with vector keys" do
79
+ it "flattens vector keys into returned vector if flatten depth is sufficient" do
80
+ hash = H[V[1, 2] => 3, V[4, 5] => 6]
81
+ [[V[1, 2], 3, V[4, 5], 6], [V[4, 5], 6, V[1, 2], 3]].include?(hash.flatten).should == true
82
+ [[V[1, 2], 3, V[4, 5], 6], [V[4, 5], 6, V[1, 2], 3]].include?(hash.flatten(1)).should == true
83
+ [[1, 2, 3, 4, 5, 6], [4, 5, 6, 1, 2, 3]].include?(hash.flatten(2)).should == true
84
+ [[1, 2, 3, 4, 5, 6], [4, 5, 6, 1, 2, 3]].include?(hash.flatten(3)).should == true
85
+ end
86
+ end
87
+
88
+ context "with vector values" do
89
+ it "flattens vector values into returned vector if flatten depth is sufficient" do
90
+ hash = H[1 => V[2, 3], 4 => V[5, 6]]
91
+ [[1, V[2, 3], 4, V[5, 6]], [4, V[5, 6], 1, V[2, 3]]].include?(hash.flatten(1)).should == true
92
+ [[1, V[2, 3], 4, V[5, 6]], [4, V[5, 6], 1, V[2, 3]]].include?(hash.flatten).should == true
93
+ [[1, 2, 3, 4, 5, 6], [4, 5, 6, 1, 2, 3]].include?(hash.flatten(2)).should == true
94
+ [[1, 2, 3, 4, 5, 6], [4, 5, 6, 1, 2, 3]].include?(hash.flatten(3)).should == true
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,79 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ [:get, :[]].each do |method|
5
+ describe "##{method}" do
6
+ context "with a default block" do
7
+ let(:hash) { H.new("A" => "aye") { |key| fail }}
8
+
9
+ context "when the key exists" do
10
+ it "returns the value associated with the key" do
11
+ hash.send(method, "A").should == "aye"
12
+ end
13
+
14
+ it "does not call the default block even if the key is 'nil'" do
15
+ H.new(nil => 'something') { fail }.send(method, nil)
16
+ end
17
+ end
18
+
19
+ context "when the key does not exist" do
20
+ let(:hash) do
21
+ H.new("A" => "aye") do |key|
22
+ expect(key).to eq("B")
23
+ "bee"
24
+ end
25
+ end
26
+
27
+ it "returns the value from the default block" do
28
+ hash.send(method, "B").should == "bee"
29
+ end
30
+ end
31
+ end
32
+
33
+ context "with no default block" do
34
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see", nil => "NIL"] }
35
+
36
+ [
37
+ %w[A aye],
38
+ %w[B bee],
39
+ %w[C see],
40
+ [nil, "NIL"]
41
+ ].each do |key, value|
42
+ it "returns the value (#{value.inspect}) for an existing key (#{key.inspect})" do
43
+ hash.send(method, key).should == value
44
+ end
45
+ end
46
+
47
+ it "returns nil for a non-existing key" do
48
+ hash.send(method, "D").should be_nil
49
+ end
50
+ end
51
+
52
+ it "uses #hash to look up keys" do
53
+ x = double('0')
54
+ x.should_receive(:hash).and_return(0)
55
+ H[foo: :bar].send(method, x).should be_nil
56
+ end
57
+
58
+ it "uses #eql? to compare keys with the same hash code" do
59
+ x = double('x', hash: 42)
60
+ x.should_not_receive(:eql?)
61
+
62
+ y = double('y', hash: 42)
63
+ y.should_receive(:eql?).and_return(true)
64
+
65
+ H[y => 1][x].should == 1
66
+ end
67
+
68
+ it "does not use #eql? to compare keys with different hash codes" do
69
+ x = double('x', hash: 0)
70
+ x.should_not_receive(:eql?)
71
+
72
+ y = double('y', hash: 1)
73
+ y.should_not_receive(:eql?)
74
+
75
+ H[y => 1][x].should be_nil
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ [:key?, :has_key?, :include?, :member?].each do |method|
5
+ describe "##{method}" do
6
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see", nil => "NIL", 2.0 => "two"] }
7
+
8
+ ["A", "B", "C", nil, 2.0].each do |key|
9
+ it "returns true for an existing key (#{key.inspect})" do
10
+ hash.send(method, key).should == true
11
+ end
12
+ end
13
+
14
+ it "returns false for a non-existing key" do
15
+ hash.send(method, "D").should == false
16
+ end
17
+
18
+ it "uses #eql? for equality" do
19
+ hash.send(method, 2).should == false
20
+ end
21
+
22
+ it "returns true if the key is found and maps to nil" do
23
+ H["A" => nil].send(method, "A").should == true
24
+ end
25
+
26
+ it "returns true if the key is found and maps to false" do
27
+ H["A" => false].send(method, "A").should == true
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ let(:hash) { H[toast: 'buttered', jam: 'strawberry'] }
5
+
6
+ [:value?, :has_value?].each do |method|
7
+ describe "##{method}" do
8
+ it "returns true if any key/val pair in Hash has the same value" do
9
+ hash.send(method, 'strawberry').should == true
10
+ end
11
+
12
+ it "returns false if no key/val pair in Hash has the same value" do
13
+ hash.send(method, 'marmalade').should == false
14
+ end
15
+
16
+ it "uses #== to check equality" do
17
+ H[a: EqualNotEql.new].send(method, EqualNotEql.new).should == true
18
+ H[a: EqlNotEqual.new].send(method, EqlNotEqual.new).should == false
19
+ end
20
+
21
+ it "works on a large hash" do
22
+ large = H.new((1..1000).zip(2..1001))
23
+ [2, 100, 200, 500, 900, 1000, 1001].each { |n| large.value?(n).should == true }
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,29 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#hash" do
5
+ it "values are sufficiently distributed" do
6
+ (1..4000).each_slice(4).map { |ka, va, kb, vb| H[ka => va, kb => vb].hash }.uniq.size.should == 1000
7
+ end
8
+
9
+ it "differs given the same keys and different values" do
10
+ H["ka" => "va"].hash.should_not == H["ka" => "vb"].hash
11
+ end
12
+
13
+ it "differs given the same values and different keys" do
14
+ H["ka" => "va"].hash.should_not == H["kb" => "va"].hash
15
+ end
16
+
17
+ it "generates the same hash value for a hash regardless of the order things were added to it" do
18
+ key1 = DeterministicHash.new('abc', 1)
19
+ key2 = DeterministicHash.new('xyz', 1)
20
+ H.empty.put(key1, nil).put(key2, nil).hash.should == H.empty.put(key2, nil).put(key1, nil).hash
21
+ end
22
+
23
+ describe "on an empty hash" do
24
+ it "returns 0" do
25
+ H.empty.hash.should == 0
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#inspect" do
5
+ [
6
+ [[], 'Immutable::Hash[]'],
7
+ [["A" => "aye"], 'Immutable::Hash["A" => "aye"]'],
8
+ [[DeterministicHash.new("A", 1) => "aye", DeterministicHash.new("B", 2) => "bee", DeterministicHash.new("C", 3) => "see"], 'Immutable::Hash["A" => "aye", "B" => "bee", "C" => "see"]']
9
+ ].each do |values, expected|
10
+ describe "on #{values.inspect}" do
11
+ it "returns #{expected.inspect}" do
12
+ H[*values].inspect.should == expected
13
+ end
14
+ end
15
+ end
16
+
17
+ [
18
+ {},
19
+ {"A" => "aye"},
20
+ {a: "aye", b: "bee", c: "see"}
21
+ ].each do |values|
22
+ describe "on #{values.inspect}" do
23
+ it "returns a string which can be eval'd to get an equivalent object" do
24
+ original = H.new(values)
25
+ eval(original.inspect).should eql(original)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#invert" do
5
+ let(:hash) { H[a: 3, b: 2, c: 1] }
6
+
7
+ it "uses the existing keys as values and values as keys" do
8
+ hash.invert.should eql(H[3 => :a, 2 => :b, 1 => :c])
9
+ end
10
+
11
+ it "will select one key/value pair among multiple which have same value" do
12
+ [H[1 => :a],
13
+ H[1 => :b],
14
+ H[1 => :c]].include?(H[a: 1, b: 1, c: 1].invert).should == true
15
+ end
16
+
17
+ it "doesn't change the original Hash" do
18
+ hash.invert
19
+ hash.should eql(H[a: 3, b: 2, c: 1])
20
+ end
21
+
22
+ context "from a subclass of Hash" do
23
+ it "returns an instance of the subclass" do
24
+ subclass = Class.new(Immutable::Hash)
25
+ instance = subclass.new(a: 1, b: 2)
26
+ instance.invert.class.should be(subclass)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#key" do
5
+ let(:hash) { H[a: 1, b: 1, c: 2, d: 3] }
6
+
7
+ it "returns a key associated with the given value, if there is one" do
8
+ [:a, :b].include?(hash.key(1)).should == true
9
+ hash.key(2).should be(:c)
10
+ hash.key(3).should be(:d)
11
+ end
12
+
13
+ it "returns nil if there is no key associated with the given value" do
14
+ hash.key(5).should be_nil
15
+ hash.key(0).should be_nil
16
+ end
17
+
18
+ it "uses #== to compare values for equality" do
19
+ hash.key(EqualNotEql.new).should_not be_nil
20
+ hash.key(EqlNotEqual.new).should be_nil
21
+ end
22
+
23
+ it "doesn't use default block if value is not found" do
24
+ H.new(a: 1) { fail }.key(2).should be_nil
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#keys" do
5
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
6
+
7
+ it "returns the keys as a set" do
8
+ hash.keys.should eql(S["A", "B", "C"])
9
+ end
10
+
11
+ it "returns frozen String keys" do
12
+ hash.keys.each { |s| s.should be_frozen }
13
+ end
14
+ end
15
+ end