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,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: de7204bc2220b5743b2d8b3344d562377bd692a9
4
+ data.tar.gz: 965f9782b7d7a5b803f2ee76c3ef10d5f1203a2b
5
+ SHA512:
6
+ metadata.gz: 3e7a5faa17dfdbbcbf86ba190a30537cf9b52c7b571cee68158fed8bfa69be547aeb8af91d9f91efd875a7b21462a1f84efce0edab1283fd132b9e8e819122c2
7
+ data.tar.gz: b06f1d17c9f1159433c2db10a2a30788a02cf379f093da86b24e77ccefe04323582beef964dcf7d220e5c3e54ac7e98e40f794e87a408da07f9c2b38da59951b
@@ -0,0 +1,9 @@
1
+ require "immutable/core_ext"
2
+ require "immutable/list"
3
+ require "immutable/deque"
4
+ require "immutable/hash"
5
+ require "immutable/set"
6
+ require "immutable/vector"
7
+ require "immutable/sorted_set"
8
+ require "immutable/nested"
9
+ require "immutable/version"
@@ -0,0 +1,2 @@
1
+ require "immutable/core_ext/enumerable"
2
+ require "immutable/core_ext/io"
@@ -0,0 +1,11 @@
1
+ require "immutable/list"
2
+
3
+ # Monkey-patches to Ruby's built-in `Enumerable` module.
4
+ # @see http://www.ruby-doc.org/core/Enumerable.html
5
+ module Enumerable
6
+ # Return a new {Immutable::List} populated with the items in this `Enumerable` object.
7
+ # @return [List]
8
+ def to_list
9
+ Immutable::List.from_enum(self)
10
+ end
11
+ end
@@ -0,0 +1,21 @@
1
+ require "immutable/list"
2
+
3
+ # Monkey-patches to Ruby's built-in `IO` class.
4
+ # @see http://www.ruby-doc.org/core/IO.html
5
+ class IO
6
+ # Return a lazy list of "records" read from this IO stream.
7
+ # "Records" are delimited by `$/`, the global input record separator string.
8
+ # By default, it is `"\n"`, a newline.
9
+ #
10
+ # @return [List]
11
+ def to_list(sep = $/) # global input record separator
12
+ Immutable::LazyList.new do
13
+ line = gets(sep)
14
+ if line
15
+ Immutable::Cons.new(line, to_list)
16
+ else
17
+ EmptyList
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,254 @@
1
+ require "immutable/list"
2
+
3
+ module Immutable
4
+
5
+ # A `Deque` (or double-ended queue) is an ordered, sequential collection of
6
+ # objects, which allows elements to be retrieved, added and removed at the
7
+ # front and end of the sequence in constant time. This makes `Deque` perfect
8
+ # for use as an immutable queue or stack.
9
+ #
10
+ # A `Deque` differs from a {Vector} in that vectors allow indexed access to
11
+ # any element in the collection. `Deque`s only allow access to the first and
12
+ # last element. But adding and removing from the ends of a `Deque` is faster
13
+ # than adding and removing from the ends of a {Vector}.
14
+ #
15
+ # To create a new `Deque`:
16
+ #
17
+ # Immutable::Deque.new([:first, :second, :third])
18
+ # Immutable::Deque[1, 2, 3, 4, 5]
19
+ #
20
+ # Or you can start with an empty deque and build it up:
21
+ #
22
+ # Immutable::Deque.empty.push('b').push('c').unshift('a')
23
+ #
24
+ # Like all `immutable-ruby` collections, `Deque` is immutable. The four basic
25
+ # operations that "modify" deques ({#push}, {#pop}, {#shift}, and
26
+ # {#unshift}) all return a new collection and leave the existing one
27
+ # unchanged.
28
+ #
29
+ # @example
30
+ # deque = Immutable::Deque.empty # => Immutable::Deque[]
31
+ # deque = deque.push('a').push('b').push('c') # => Immutable::Deque['a', 'b', 'c']
32
+ # deque.first # => 'a'
33
+ # deque.last # => 'c'
34
+ # deque = deque.shift # => Immutable::Deque['b', 'c']
35
+ #
36
+ # @see http://en.wikipedia.org/wiki/Deque "Deque" on Wikipedia
37
+ #
38
+ class Deque
39
+ class << self
40
+ # Create a new `Deque` populated with the given items.
41
+ # @return [Deque]
42
+ def [](*items)
43
+ items.empty? ? empty : new(items)
44
+ end
45
+
46
+ # Return an empty `Deque`. If used on a subclass, returns an empty instance
47
+ # of that class.
48
+ #
49
+ # @return [Deque]
50
+ def empty
51
+ @empty ||= self.new
52
+ end
53
+
54
+ # "Raw" allocation of a new `Deque`. Used internally to create a new
55
+ # instance quickly after consing onto the front/rear lists or taking their
56
+ # tails.
57
+ #
58
+ # @return [Deque]
59
+ # @private
60
+ def alloc(front, rear)
61
+ result = allocate
62
+ result.instance_variable_set(:@front, front)
63
+ result.instance_variable_set(:@rear, rear)
64
+ result.freeze
65
+ end
66
+ end
67
+
68
+ def initialize(items=[])
69
+ @front = List.from_enum(items)
70
+ @rear = EmptyList
71
+ freeze
72
+ end
73
+
74
+ # Return `true` if this `Deque` contains no items.
75
+ # @return [Boolean]
76
+ def empty?
77
+ @front.empty? && @rear.empty?
78
+ end
79
+
80
+ # Return the number of items in this `Deque`.
81
+ #
82
+ # @example
83
+ # Immutable::Deque["A", "B", "C"].size # => 3
84
+ #
85
+ # @return [Integer]
86
+ def size
87
+ @front.size + @rear.size
88
+ end
89
+ alias :length :size
90
+
91
+ # Return the first item in the `Deque`. If the deque is empty, return `nil`.
92
+ #
93
+ # @example
94
+ # Immutable::Deque["A", "B", "C"].first # => "A"
95
+ #
96
+ # @return [Object]
97
+ def first
98
+ return @front.head unless @front.empty?
99
+ @rear.last # memoize?
100
+ end
101
+
102
+ # Return the last item in the `Deque`. If the deque is empty, return `nil`.
103
+ #
104
+ # @example
105
+ # Immutable::Deque["A", "B", "C"].last # => "C"
106
+ #
107
+ # @return [Object]
108
+ def last
109
+ return @rear.head unless @rear.empty?
110
+ @front.last # memoize?
111
+ end
112
+
113
+ # Return a new `Deque` with `item` added at the end.
114
+ #
115
+ # @example
116
+ # Immutable::Deque["A", "B", "C"].add("Z")
117
+ # # => Immutable::Deque["A", "B", "C", "Z"]
118
+ #
119
+ # @param item [Object] The item to add
120
+ # @return [Deque]
121
+ def push(item)
122
+ self.class.alloc(@front, @rear.cons(item))
123
+ end
124
+ alias :enqueue :push
125
+
126
+ # Return a new `Deque` with the last item removed.
127
+ #
128
+ # @example
129
+ # Immutable::Deque["A", "B", "C"].pop
130
+ # # => Immutable::Deque["A", "B"]
131
+ #
132
+ # @return [Deque]
133
+ def pop
134
+ front, rear = @front, @rear
135
+
136
+ if rear.empty?
137
+ return self.class.empty if front.empty?
138
+ front, rear = EmptyList, front.reverse
139
+ end
140
+
141
+ self.class.alloc(front, rear.tail)
142
+ end
143
+
144
+ # Return a new `Deque` with `item` added at the front.
145
+ #
146
+ # @example
147
+ # Immutable::Deque["A", "B", "C"].unshift("Z")
148
+ # # => Immutable::Deque["Z", "A", "B", "C"]
149
+ #
150
+ # @param item [Object] The item to add
151
+ # @return [Deque]
152
+ def unshift(item)
153
+ self.class.alloc(@front.cons(item), @rear)
154
+ end
155
+
156
+ # Return a new `Deque` with the first item removed.
157
+ #
158
+ # @example
159
+ # Immutable::Deque["A", "B", "C"].shift
160
+ # # => Immutable::Deque["B", "C"]
161
+ #
162
+ # @return [Deque]
163
+ def shift
164
+ front, rear = @front, @rear
165
+
166
+ if front.empty?
167
+ return self.class.empty if rear.empty?
168
+ front, rear = rear.reverse, EmptyList
169
+ end
170
+
171
+ self.class.alloc(front.tail, rear)
172
+ end
173
+ alias :dequeue :shift
174
+
175
+ # Return an empty `Deque` instance, of the same class as this one. Useful if you
176
+ # have multiple subclasses of `Deque` and want to treat them polymorphically.
177
+ #
178
+ # @return [Deque]
179
+ def clear
180
+ self.class.empty
181
+ end
182
+
183
+ # Return true if `other` has the same type and contents as this `Deque`.
184
+ #
185
+ # @param other [Object] The collection to compare with
186
+ # @return [Boolean]
187
+ def eql?(other)
188
+ return true if other.equal?(self)
189
+ instance_of?(other.class) && to_ary.eql?(other.to_ary)
190
+ end
191
+ alias :== :eql?
192
+
193
+ # Return an `Array` with the same elements, in the same order.
194
+ # @return [Array]
195
+ def to_a
196
+ @front.to_a.concat(@rear.to_a.tap { |a| a.reverse! })
197
+ end
198
+ alias :entries :to_a
199
+ alias :to_ary :to_a
200
+
201
+ # Return a {List} with the same elements, in the same order.
202
+ # @return [Immutable::List]
203
+ def to_list
204
+ @front.append(@rear.reverse)
205
+ end
206
+
207
+ # Return the contents of this `Deque` as a programmer-readable `String`. If all the
208
+ # items in the deque are serializable as Ruby literal strings, the returned string can
209
+ # be passed to `eval` to reconstitute an equivalent `Deque`.
210
+ #
211
+ # @return [String]
212
+ def inspect
213
+ result = "#{self.class}["
214
+ i = 0
215
+ @front.each { |obj| result << ', ' if i > 0; result << obj.inspect; i += 1 }
216
+ @rear.to_a.tap { |a| a.reverse! }.each { |obj| result << ', ' if i > 0; result << obj.inspect; i += 1 }
217
+ result << "]"
218
+ end
219
+
220
+ # Return `self`. Since this is an immutable object duplicates are
221
+ # equivalent.
222
+ # @return [Deque]
223
+ def dup
224
+ self
225
+ end
226
+ alias :clone :dup
227
+
228
+ # @private
229
+ def pretty_print(pp)
230
+ pp.group(1, "#{self.class}[", "]") do
231
+ pp.breakable ''
232
+ pp.seplist(self.to_a) { |obj| obj.pretty_print(pp) }
233
+ end
234
+ end
235
+
236
+ # @return [::Array]
237
+ # @private
238
+ def marshal_dump
239
+ to_a
240
+ end
241
+
242
+ # @private
243
+ def marshal_load(array)
244
+ initialize(array)
245
+ end
246
+ end
247
+
248
+ # The canonical empty `Deque`. Returned by `Deque[]` when
249
+ # invoked with no arguments; also returned by `Deque.empty`. Prefer using this
250
+ # one rather than creating many empty deques using `Deque.new`.
251
+ #
252
+ # @private
253
+ EmptyDeque = Immutable::Deque.empty
254
+ end
@@ -0,0 +1,152 @@
1
+ module Immutable
2
+
3
+ # Helper module for immutable-ruby's sequential collections
4
+ #
5
+ # Classes including `Immutable::Enumerable` must implement:
6
+ #
7
+ # - `#each` (just like `::Enumerable`).
8
+ # - `#select`, which takes a block, and returns an instance of the same class
9
+ # with only the items for which the block returns a true value
10
+ module Enumerable
11
+ include ::Enumerable
12
+
13
+ # Return a new collection with all the elements for which the block returns false.
14
+ def reject
15
+ return enum_for(:reject) if not block_given?
16
+ select { |item| !yield(item) }
17
+ end
18
+ alias :delete_if :reject
19
+
20
+ # Return a new collection with all `nil` elements removed.
21
+ def compact
22
+ select { |item| !item.nil? }
23
+ end
24
+
25
+ # Search the collection for elements which are `#===` to `item`. Yield them to
26
+ # the optional code block if provided, and return them as a new collection.
27
+ def grep(pattern, &block)
28
+ result = select { |item| pattern === item }
29
+ result = result.map(&block) if block_given?
30
+ result
31
+ end
32
+
33
+ # Yield all integers from 0 up to, but not including, the number of items in
34
+ # this collection. For collections which provide indexed access, these are all
35
+ # the valid, non-negative indices into the collection.
36
+ def each_index(&block)
37
+ return enum_for(:each_index) unless block_given?
38
+ 0.upto(size-1, &block)
39
+ self
40
+ end
41
+
42
+ # Multiply all the items (presumably numeric) in this collection together.
43
+ def product
44
+ reduce(1, &:*)
45
+ end
46
+
47
+ # Add up all the items (presumably numeric) in this collection.
48
+ def sum
49
+ reduce(0, &:+)
50
+ end
51
+
52
+ # Return 2 collections, the first containing all the elements for which the block
53
+ # evaluates to true, the second containing the rest.
54
+ def partition
55
+ return enum_for(:partition) if not block_given?
56
+ a,b = super
57
+ [self.class.new(a), self.class.new(b)].freeze
58
+ end
59
+
60
+ # Groups the collection into sub-collections by the result of yielding them to
61
+ # the block. Returns a {Hash} where the keys are return values from the block,
62
+ # and the values are sub-collections. All the sub-collections are built up from
63
+ # `empty_group`, which should respond to `#add` by returning a new collection
64
+ # with an added element.
65
+ def group_by_with(empty_group, &block)
66
+ block ||= lambda { |item| item }
67
+ reduce(Immutable::EmptyHash) do |hash, item|
68
+ key = block.call(item)
69
+ group = hash.get(key) || empty_group
70
+ hash.put(key, group.add(item))
71
+ end
72
+ end
73
+ protected :group_by_with
74
+
75
+ # Groups the collection into sub-collections by the result of yielding them to
76
+ # the block. Returns a {Hash} where the keys are return values from the block,
77
+ # and the values are sub-collections (of the same type as this one).
78
+ def group_by(&block)
79
+ group_by_with(self.class.empty, &block)
80
+ end
81
+
82
+ # Compare with `other`, and return 0, 1, or -1 if it is (respectively) equal to,
83
+ # greater than, or less than this collection.
84
+ def <=>(other)
85
+ return 0 if self.equal?(other)
86
+ enum1, enum2 = self.to_enum, other.to_enum
87
+ loop do
88
+ item1 = enum1.next
89
+ item2 = enum2.next
90
+ comp = (item1 <=> item2)
91
+ return comp if comp != 0
92
+ end
93
+ size1, size2 = self.size, other.size
94
+ return 0 if size1 == size2
95
+ size1 > size2 ? 1 : -1
96
+ end
97
+
98
+ # Return true if `other` contains the same elements, in the same order.
99
+ # @return [Boolean]
100
+ def ==(other)
101
+ self.eql?(other) || other.respond_to?(:to_ary) && to_ary.eql?(other.to_ary)
102
+ end
103
+
104
+ # Convert all the elements into strings and join them together, separated by
105
+ # `separator`. By default, the `separator` is `$,`, the global default string
106
+ # separator, which is normally `nil`.
107
+ def join(separator = $,)
108
+ result = ""
109
+ if separator
110
+ each_with_index { |obj, i| result << separator if i > 0; result << obj.to_s }
111
+ else
112
+ each { |obj| result << obj.to_s }
113
+ end
114
+ result
115
+ end
116
+
117
+ # Convert this collection to a {Set}.
118
+ def to_set
119
+ Immutable::Set.new(self)
120
+ end
121
+
122
+ # Convert this collection to a programmer-readable `String` representation.
123
+ def inspect
124
+ result = "#{self.class}["
125
+ each_with_index { |obj, i| result << ', ' if i > 0; result << obj.inspect }
126
+ result << "]"
127
+ end
128
+
129
+ # @private
130
+ def pretty_print(pp)
131
+ pp.group(1, "#{self.class}[", "]") do
132
+ pp.breakable ''
133
+ pp.seplist(self) { |obj| obj.pretty_print(pp) }
134
+ end
135
+ end
136
+
137
+ alias :to_ary :to_a
138
+ alias :index :find_index
139
+
140
+ ## Compatibility fixes
141
+
142
+ if RUBY_ENGINE == 'rbx'
143
+ # Rubinius implements Enumerable#sort_by using Enumerable#map
144
+ # Because we do our own, custom implementations of #map, that doesn't work well
145
+ # @private
146
+ def sort_by(&block)
147
+ result = to_a
148
+ result.frozen? ? result.sort_by(&block) : result.sort_by!(&block)
149
+ end
150
+ end
151
+ end
152
+ end