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,21 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ [:to_hash, :to_h].each do |method|
5
+ describe "##{method}" do
6
+ it "converts an empty Immutable::Hash to an empty Ruby Hash" do
7
+ H.empty.send(method).should eql({})
8
+ end
9
+
10
+ it "converts a non-empty Immutable::Hash to a Hash with the same keys and values" do
11
+ H[a: 1, b: 2].send(method).should eql({a: 1, b: 2})
12
+ end
13
+
14
+ it "doesn't modify the receiver" do
15
+ hash = H[a: 1, b: 2]
16
+ hash.send(method)
17
+ hash.should eql(H[a: 1, b: 2])
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,79 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#update_in" do
5
+ let(:hash) {
6
+ Immutable::Hash[
7
+ "A" => "aye",
8
+ "B" => Immutable::Hash["C" => "see", "D" => Immutable::Hash["E" => "eee"]],
9
+ "F" => Immutable::Vector["G", Immutable::Hash["H" => "eitch"], "I"]
10
+ ]
11
+ }
12
+
13
+ context "with one level on existing key" do
14
+ it "passes the value to the block" do
15
+ hash.update_in("A") { |value| value.should == "aye" }
16
+ end
17
+
18
+ it "replaces the value with the result of the block" do
19
+ result = hash.update_in("A") { |value| "FLIBBLE" }
20
+ result.get("A").should == "FLIBBLE"
21
+ end
22
+
23
+ it "should preserve the original" do
24
+ result = hash.update_in("A") { |value| "FLIBBLE" }
25
+ hash.get("A").should == "aye"
26
+ end
27
+ end
28
+
29
+ context "with multi-level on existing keys" do
30
+ it "passes the value to the block" do
31
+ hash.update_in("B", "D", "E") { |value| value.should == "eee" }
32
+ end
33
+
34
+ it "replaces the value with the result of the block" do
35
+ result = hash.update_in("B", "D", "E") { |value| "FLIBBLE" }
36
+ result["B"]["D"]["E"].should == "FLIBBLE"
37
+ end
38
+
39
+ it "should preserve the original" do
40
+ result = hash.update_in("B", "D", "E") { |value| "FLIBBLE" }
41
+ hash["B"]["D"]["E"].should == "eee"
42
+ end
43
+ end
44
+
45
+ context "with multi-level creating sub-hashes when keys don't exist" do
46
+ it "passes nil to the block" do
47
+ hash.update_in("B", "X", "Y") { |value| value.should be_nil }
48
+ end
49
+
50
+ it "creates subhashes on the way to set the value" do
51
+ result = hash.update_in("B", "X", "Y") { |value| "NEWVALUE" }
52
+ result["B"]["X"]["Y"].should == "NEWVALUE"
53
+ result["B"]["D"]["E"].should == "eee"
54
+ end
55
+ end
56
+
57
+ context "with multi-level including vector with existing keys" do
58
+ it "passes the value to the block" do
59
+ hash.update_in("F", 1, "H") { |value| value.should == "eitch" }
60
+ end
61
+
62
+ it "replaces the value with the result of the block" do
63
+ result = hash.update_in("F", 1, "H") { |value| "FLIBBLE" }
64
+ result["F"][1]["H"].should == "FLIBBLE"
65
+ end
66
+
67
+ it "should preserve the original" do
68
+ result = hash.update_in("F", 1, "H") { |value| "FLIBBLE" }
69
+ hash["F"][1]["H"].should == "eitch"
70
+ end
71
+ end
72
+
73
+ context "with empty key_path" do
74
+ it "raises ArguemntError" do
75
+ expect { hash.update_in() { |v| 42 } }.to raise_error(ArgumentError)
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#values_at" do
5
+ it "returns a vector of values for the given keys" do
6
+ h = H[:a => 9, :b => 'a', :c => -10, :d => nil]
7
+ h.values_at.should be_kind_of(Immutable::Vector)
8
+ h.values_at.should eql(V.empty)
9
+ h.values_at(:a, :d, :b).should be_kind_of(Immutable::Vector)
10
+ h.values_at(:a, :d, :b).should eql(V[9, nil, 'a'])
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Hash do
4
+ describe "#values" do
5
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
6
+ let(:result) { hash.values }
7
+
8
+ it "returns the keys as a Vector" do
9
+ result.should be_a Immutable::Vector
10
+ result.to_a.sort.should == %w(aye bee see)
11
+ end
12
+
13
+ context "with duplicates" do
14
+ let(:hash) { H[:A => 15, :B => 19, :C => 15] }
15
+ let(:result) { hash.values }
16
+
17
+ it "returns the keys as a Vector" do
18
+ result.class.should be(Immutable::Vector)
19
+ result.to_a.sort.should == [15, 15, 19]
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::List do
4
+ describe "#add" do
5
+ [
6
+ [[], "A", ["A"]],
7
+ [["A"], "B", %w[B A]],
8
+ [["A"], "A", %w[A A]],
9
+ [%w[A B C], "D", %w[D A B C]],
10
+ ].each do |values, new_value, expected|
11
+ context "on #{values.inspect} with #{new_value.inspect}" do
12
+ let(:list) { L[*values] }
13
+
14
+ it "preserves the original" do
15
+ list.add(new_value)
16
+ list.should eql(L[*values])
17
+ end
18
+
19
+ it "returns #{expected.inspect}" do
20
+ list.add(new_value).should eql(L[*expected])
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,57 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::List do
4
+ describe "#all?" do
5
+ context "on a really big list" do
6
+ let(:list) { Immutable.interval(0, STACK_OVERFLOW_DEPTH) }
7
+
8
+ it "doesn't run out of stack" do
9
+ -> { list.all? }.should_not raise_error
10
+ end
11
+ end
12
+
13
+ context "when empty" do
14
+ it "with a block returns true" do
15
+ L.empty.all? {}.should == true
16
+ end
17
+
18
+ it "with no block returns true" do
19
+ L.empty.all?.should == true
20
+ end
21
+ end
22
+
23
+ context "when not empty" do
24
+ context "with a block" do
25
+ let(:list) { L["A", "B", "C"] }
26
+
27
+ context "if the block always returns true" do
28
+ it "returns true" do
29
+ list.all? { |item| true }.should == true
30
+ end
31
+ end
32
+
33
+ context "if the block ever returns false" do
34
+ it "returns false" do
35
+ list.all? { |item| item == "D" }.should == false
36
+ end
37
+ end
38
+ end
39
+
40
+ context "with no block" do
41
+ context "if all values are truthy" do
42
+ it "returns true" do
43
+ L[true, "A"].all?.should == true
44
+ end
45
+ end
46
+
47
+ [nil, false].each do |value|
48
+ context "if any value is #{value.inspect}" do
49
+ it "returns false" do
50
+ L[value, true, "A"].all?.should == false
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,49 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::List do
4
+ describe "#any?" do
5
+ context "on a really big list" do
6
+ let(:list) { Immutable.interval(0, STACK_OVERFLOW_DEPTH) }
7
+
8
+ it "doesn't run out of stack" do
9
+ -> { list.any? { false } }.should_not raise_error
10
+ end
11
+ end
12
+
13
+ context "when empty" do
14
+ it "with a block returns false" do
15
+ L.empty.any? {}.should == false
16
+ end
17
+
18
+ it "with no block returns false" do
19
+ L.empty.any?.should == false
20
+ end
21
+ end
22
+
23
+ context "when not empty" do
24
+ context "with a block" do
25
+ let(:list) { L["A", "B", "C", nil] }
26
+
27
+ ["A", "B", "C", nil].each do |value|
28
+ it "returns true if the block ever returns true (#{value.inspect})" do
29
+ list.any? { |item| item == value }.should == true
30
+ end
31
+ end
32
+
33
+ it "returns false if the block always returns false" do
34
+ list.any? { |item| item == "D" }.should == false
35
+ end
36
+ end
37
+
38
+ context "with no block" do
39
+ it "returns true if any value is truthy" do
40
+ L[nil, false, "A", true].any?.should == true
41
+ end
42
+
43
+ it "returns false if all values are falsey" do
44
+ L[nil, false].any?.should == false
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,38 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::List do
4
+ [:append, :concat, :+].each do |method|
5
+ describe "##{method}" do
6
+ it "is lazy" do
7
+ -> { Immutable.stream { fail }.append(Immutable.stream { fail }) }.should_not raise_error
8
+ end
9
+
10
+ [
11
+ [[], [], []],
12
+ [["A"], [], ["A"]],
13
+ [[], ["A"], ["A"]],
14
+ [%w[A B], %w[C D], %w[A B C D]],
15
+ ].each do |left_values, right_values, expected|
16
+ context "on #{left_values.inspect} and #{right_values.inspect}" do
17
+ let(:left) { L[*left_values] }
18
+ let(:right) { L[*right_values] }
19
+ let(:result) { left.append(right) }
20
+
21
+ it "preserves the left" do
22
+ result
23
+ left.should eql(L[*left_values])
24
+ end
25
+
26
+ it "preserves the right" do
27
+ result
28
+ right.should eql(L[*right_values])
29
+ end
30
+
31
+ it "returns #{expected.inspect}" do
32
+ result.should eql(L[*expected])
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,29 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::List do
4
+ describe "#at" do
5
+ context "on a really big list" do
6
+ let(:list) { Immutable.interval(0, STACK_OVERFLOW_DEPTH) }
7
+
8
+ it "doesn't run out of stack" do
9
+ -> { list.at(STACK_OVERFLOW_DEPTH) }.should_not raise_error
10
+ end
11
+ end
12
+
13
+ [
14
+ [[], 10, nil],
15
+ [["A"], 10, nil],
16
+ [%w[A B C], 0, "A"],
17
+ [%w[A B C], 2, "C"],
18
+ [%w[A B C], -1, "C"],
19
+ [%w[A B C], -2, "B"],
20
+ [%w[A B C], -4, nil]
21
+ ].each do |values, number, expected|
22
+ describe "#{values.inspect} with #{number}" do
23
+ it "returns #{expected.inspect}" do
24
+ L[*values].at(number).should == expected
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,69 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::List do
4
+ describe "#break" do
5
+ it "is lazy" do
6
+ -> { Immutable.stream { fail }.break { |item| false } }.should_not raise_error
7
+ end
8
+
9
+ [
10
+ [[], [], []],
11
+ [[1], [1], []],
12
+ [[1, 2], [1, 2], []],
13
+ [[1, 2, 3], [1, 2], [3]],
14
+ [[1, 2, 3, 4], [1, 2], [3, 4]],
15
+ [[2, 3, 4], [2], [3, 4]],
16
+ [[3, 4], [], [3, 4]],
17
+ [[4], [], [4]],
18
+ ].each do |values, expected_prefix, expected_remainder|
19
+ context "on #{values.inspect}" do
20
+ let(:list) { L[*values] }
21
+
22
+ context "with a block" do
23
+ let(:result) { list.break { |item| item > 2 }}
24
+ let(:prefix) { result.first }
25
+ let(:remainder) { result.last }
26
+
27
+ it "preserves the original" do
28
+ result
29
+ list.should eql(L[*values])
30
+ end
31
+
32
+ it "returns a frozen array with two items" do
33
+ result.class.should be(Array)
34
+ result.should be_frozen
35
+ result.size.should be(2)
36
+ end
37
+
38
+ it "correctly identifies the prefix" do
39
+ prefix.should eql(L[*expected_prefix])
40
+ end
41
+
42
+ it "correctly identifies the remainder" do
43
+ remainder.should eql(L[*expected_remainder])
44
+ end
45
+ end
46
+
47
+ context "without a block" do
48
+ let(:result) { list.break }
49
+ let(:prefix) { result.first }
50
+ let(:remainder) { result.last }
51
+
52
+ it "returns a frozen array with two items" do
53
+ result.class.should be(Array)
54
+ result.should be_frozen
55
+ result.size.should be(2)
56
+ end
57
+
58
+ it "returns self as the prefix" do
59
+ prefix.should equal(list)
60
+ end
61
+
62
+ it "leaves the remainder empty" do
63
+ remainder.should be_empty
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,38 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::List do
4
+ [
5
+ [[], :car, nil],
6
+ [["A"], :car, "A"],
7
+ [%w[A B C], :car, "A"],
8
+ [%w[A B C], :cadr, "B"],
9
+ [%w[A B C], :caddr, "C"],
10
+ [%w[A B C], :cadddr, nil],
11
+ [%w[A B C], :caddddr, nil],
12
+ [[], :cdr, L.empty],
13
+ [["A"], :cdr, L.empty],
14
+ [%w[A B C], :cdr, L["B", "C"]],
15
+ [%w[A B C], :cddr, L["C"]],
16
+ [%w[A B C], :cdddr, L.empty],
17
+ [%w[A B C], :cddddr, L.empty],
18
+ ].each do |values, method, expected|
19
+ describe "##{method}" do
20
+ it "is responded to" do
21
+ L.empty.respond_to?(method).should == true
22
+ end
23
+
24
+ context "on #{values.inspect}" do
25
+ let(:list) { L[*values] }
26
+
27
+ it "preserves the original" do
28
+ list.send(method)
29
+ list.should eql(L[*values])
30
+ end
31
+
32
+ it "returns #{expected.inspect}" do
33
+ list.send(method).should == expected
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end