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,28 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Set do
4
+ describe "#first" do
5
+ context "on an empty set" do
6
+ it "returns nil" do
7
+ S.empty.first.should be_nil
8
+ end
9
+ end
10
+
11
+ context "on a non-empty set" do
12
+ it "returns an arbitrary value from the set" do
13
+ %w[A B C].include?(S["A", "B", "C"].first).should == true
14
+ end
15
+ end
16
+
17
+ it "returns nil if only member of set is nil" do
18
+ S[nil].first.should be(nil)
19
+ end
20
+
21
+ it "returns the first item yielded by #each" do
22
+ 10.times do
23
+ set = S.new((rand(10)+1).times.collect { rand(10000 )})
24
+ set.each { |item| break item }.should be(set.first)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,46 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable do
4
+ describe "#flatten" do
5
+ [
6
+ [["A"], ["A"]],
7
+ [%w[A B C], %w[A B C]],
8
+ [["A", S["B"], "C"], %w[A B C]],
9
+ [[S["A"], S["B"], S["C"]], %w[A B C]],
10
+ ].each do |values, expected|
11
+ describe "on #{values}" do
12
+ let(:set) { S[*values] }
13
+
14
+ it "preserves the original" do
15
+ set.flatten
16
+ set.should eql(S[*values])
17
+ end
18
+
19
+ it "returns the inlined values" do
20
+ set.flatten.should eql(S[*expected])
21
+ end
22
+ end
23
+ end
24
+
25
+ context "on an empty set" do
26
+ it "returns an empty set" do
27
+ S.empty.flatten.should equal(S.empty)
28
+ end
29
+ end
30
+
31
+ context "on a set with multiple levels of nesting" do
32
+ it "inlines lower levels of nesting" do
33
+ set = S[S[S[1]], S[S[2]]]
34
+ set.flatten.should eql(S[1, 2])
35
+ end
36
+ end
37
+
38
+ context "from a subclass" do
39
+ it "returns an instance of the subclass" do
40
+ subclass = Class.new(Immutable::Set)
41
+ subclass.new.flatten.class.should be(subclass)
42
+ subclass.new([S[1], S[2]]).flatten.class.should be(subclass)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,57 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Set do
4
+ let(:set) { S[*values] }
5
+
6
+ describe "#grep" do
7
+ let(:grep) { set.grep(String, &block) }
8
+
9
+ shared_examples "check filtered values" do
10
+ it "returns the filtered values" do
11
+ expect(grep).to eq(filtered)
12
+ end
13
+ end
14
+
15
+ shared_examples "check different types of inputs" do
16
+ context "with an empty array" do
17
+ let(:values) { [] }
18
+ let(:filtered) { [] }
19
+
20
+ shared_examples "check filtered values"
21
+ end
22
+
23
+ context "with a single item array" do
24
+ let(:values) { ["A"] }
25
+ let(:filtered) { ["A"] }
26
+
27
+ shared_examples "check filtered values"
28
+ end
29
+
30
+ context "with a single item array that doesn't contain match" do
31
+ let(:values) { [1] }
32
+ let(:filtered) { [] }
33
+
34
+ shared_examples "check filtered values"
35
+ end
36
+
37
+ context "with a multi-item array where one isn't a match" do
38
+ let(:values) { ["A", 2, "C"] }
39
+ let(:filtered) { %w[A C] }
40
+
41
+ shared_examples "check filtered values"
42
+ end
43
+ end
44
+
45
+ context "without a block" do
46
+ let(:block) { nil }
47
+
48
+ include_examples "check different types of inputs"
49
+ end
50
+
51
+ describe "with a block" do
52
+ let(:block) { ->(item) { item.downcase }}
53
+
54
+ include_examples "check different types of inputs"
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,59 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Set do
4
+ [:group_by, :group, :classify].each do |method|
5
+ describe "##{method}" do
6
+ context "with a block" do
7
+ [
8
+ [[], []],
9
+ [[1], [true => S[1]]],
10
+ [[1, 2, 3, 4], [true => S[3, 1], false => S[4, 2]]],
11
+ ].each do |values, expected|
12
+ context "on #{values.inspect}" do
13
+ let(:set) { S[*values] }
14
+
15
+ it "returns #{expected.inspect}" do
16
+ set.send(method, &:odd?).should eql(H[*expected])
17
+ set.should eql(S.new(values)) # make sure it hasn't changed
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ context "without a block" do
24
+ [
25
+ [[], []],
26
+ [[1], [1 => S[1]]],
27
+ [[1, 2, 3, 4], [1 => S[1], 2 => S[2], 3 => S[3], 4 => S[4]]],
28
+ ].each do |values, expected|
29
+ context "on #{values.inspect}" do
30
+ let(:set) { S[*values] }
31
+
32
+ it "returns #{expected.inspect}" do
33
+ set.group_by.should eql(H[*expected])
34
+ set.should eql(S.new(values)) # make sure it hasn't changed
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ context "on an empty set" do
41
+ it "returns an empty hash" do
42
+ S.empty.group_by { |x| x }.should eql(H.empty)
43
+ end
44
+ end
45
+
46
+ it "returns a hash without default proc" do
47
+ S[1,2,3].group_by { |x| x }.default_proc.should be_nil
48
+ end
49
+
50
+ context "from a subclass" do
51
+ it "returns an Hash whose values are instances of the subclass" do
52
+ subclass = Class.new(Immutable::Set)
53
+ instance = subclass.new([1, 'string', :symbol])
54
+ instance.group_by { |x| x.class }.values.each { |v| v.class.should be(subclass) }
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,22 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Set do
4
+ describe "#hash" do
5
+ context "on an empty set" do
6
+ it "returns 0" do
7
+ S.empty.hash.should == 0
8
+ end
9
+ end
10
+
11
+ it "generates the same hash value for a set regardless of the order things were added to it" do
12
+ item1 = DeterministicHash.new('a', 121)
13
+ item2 = DeterministicHash.new('b', 474)
14
+ item3 = DeterministicHash.new('c', 121)
15
+ S.empty.add(item1).add(item2).add(item3).hash.should == S.empty.add(item3).add(item2).add(item1).hash
16
+ end
17
+
18
+ it "values are sufficiently distributed" do
19
+ (1..4000).each_slice(4).map { |a, b, c, d| S[a, b, c, d].hash }.uniq.size.should == 1000
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,60 @@
1
+ require "spec_helper"
2
+ require 'set'
3
+
4
+ describe Immutable::Set do
5
+ [:include?, :member?].each do |method|
6
+ describe "##{method}" do
7
+ let(:set) { S["A", "B", "C", 2.0, nil] }
8
+
9
+ ["A", "B", "C", 2.0, nil].each do |value|
10
+ it "returns true for an existing value (#{value.inspect})" do
11
+ set.send(method, value).should == true
12
+ end
13
+ end
14
+
15
+ it "returns false for a non-existing value" do
16
+ set.send(method, "D").should == false
17
+ end
18
+
19
+ it "returns true even if existing value is nil" do
20
+ S[nil].include?(nil).should == true
21
+ end
22
+
23
+ it "returns true even if existing value is false" do
24
+ S[false].include?(false).should == true
25
+ end
26
+
27
+ it "returns false for a mutable item which is mutated after adding" do
28
+ item = ['mutable']
29
+ item = [rand(1000000)] while (item.hash.abs & 31 == [item[0], 'HOSED!'].hash.abs & 31)
30
+ set = S[item]
31
+ item.push('HOSED!')
32
+ set.include?(item).should == false
33
+ end
34
+
35
+ it "uses #eql? for equality" do
36
+ set.send(method, 2).should == false
37
+ end
38
+
39
+ it "returns the right answers after a lot of addings and removings" do
40
+ array, set, rb_set = [], S.new, ::Set.new
41
+
42
+ 1000.times do
43
+ if rand(2) == 0
44
+ array << (item = rand(10000))
45
+ rb_set.add(item)
46
+ set = set.add(item)
47
+ set.include?(item).should == true
48
+ else
49
+ item = array.sample
50
+ rb_set.delete(item)
51
+ set = set.delete(item)
52
+ set.include?(item).should == false
53
+ end
54
+ end
55
+
56
+ array.each { |item| set.include?(item).should == rb_set.include?(item) }
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,47 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Set do
4
+ describe "#inspect" do
5
+ [
6
+ [[], "Immutable::Set[]"],
7
+ [["A"], 'Immutable::Set["A"]'],
8
+ ].each do |values, expected|
9
+ describe "on #{values.inspect}" do
10
+ let(:set) { S[*values] }
11
+
12
+ it "returns #{expected.inspect}" do
13
+ set.inspect.should == expected
14
+ end
15
+
16
+ it "returns a string which can be eval'd to get an equivalent set" do
17
+ eval(set.inspect).should eql(set)
18
+ end
19
+ end
20
+ end
21
+
22
+ describe 'on ["A", "B", "C"]' do
23
+ let(:set) { S["A", "B", "C"] }
24
+
25
+ it "returns a programmer-readable representation of the set contents" do
26
+ set.inspect.should match(/^Immutable::Set\["[A-C]", "[A-C]", "[A-C]"\]$/)
27
+ end
28
+
29
+ it "returns a string which can be eval'd to get an equivalent set" do
30
+ eval(set.inspect).should eql(set)
31
+ end
32
+ end
33
+
34
+ context "from a subclass" do
35
+ MySet = Class.new(Immutable::Set)
36
+ let(:set) { MySet[1, 2] }
37
+
38
+ it "returns a programmer-readable representation of the set contents" do
39
+ set.inspect.should match(/^MySet\[[1-2], [1-2]\]$/)
40
+ end
41
+
42
+ it "returns a string which can be eval'd to get an equivalent set" do
43
+ eval(set.inspect).should eql(set)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Set do
4
+ describe "#intersect?" do
5
+ [
6
+ [[], [], false],
7
+ [["A"], [], false],
8
+ [[], ["A"], false],
9
+ [["A"], ["A"], true],
10
+ [%w[A B C], ["B"], true],
11
+ [["B"], %w[A B C], true],
12
+ [%w[A B C], %w[D E], false],
13
+ [%w[F G H I], %w[A B C], false],
14
+ [%w[A B C], %w[A B C], true],
15
+ [%w[A B C], %w[A B C D], true],
16
+ [%w[D E F G], %w[A B C], false],
17
+ ].each do |a, b, expected|
18
+ describe "for #{a.inspect} and #{b.inspect}" do
19
+ it "returns #{expected}" do
20
+ S[*a].intersect?(S[*b]).should be(expected)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,52 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Set do
4
+ [:intersection, :&].each do |method|
5
+ describe "##{method}" do
6
+ [
7
+ [[], [], []],
8
+ [["A"], [], []],
9
+ [["A"], ["A"], ["A"]],
10
+ [%w[A B C], ["B"], ["B"]],
11
+ [%w[A B C], %w[A C], %w[A C]],
12
+ ].each do |a, b, expected|
13
+ context "for #{a.inspect} and #{b.inspect}" do
14
+ let(:set_a) { S[*a] }
15
+ let(:set_b) { S[*b] }
16
+
17
+ it "returns #{expected.inspect}, without changing the original Sets" do
18
+ set_a.send(method, set_b).should eql(S[*expected])
19
+ set_a.should eql(S.new(a))
20
+ set_b.should eql(S.new(b))
21
+ end
22
+ end
23
+
24
+ context "for #{b.inspect} and #{a.inspect}" do
25
+ let(:set_a) { S[*a] }
26
+ let(:set_b) { S[*b] }
27
+
28
+ it "returns #{expected.inspect}, without changing the original Sets" do
29
+ set_b.send(method, set_a).should eql(S[*expected])
30
+ set_a.should eql(S.new(a))
31
+ set_b.should eql(S.new(b))
32
+ end
33
+ end
34
+
35
+ context "when passed a Ruby Array" do
36
+ it "returns the expected Set" do
37
+ S[*a].send(method, b.freeze).should eql(S[*expected])
38
+ end
39
+ end
40
+ end
41
+
42
+ it "returns results consistent with Array#&" do
43
+ 50.times do
44
+ array1 = rand(100).times.map { rand(1000000).to_s(16) }
45
+ array2 = rand(100).times.map { rand(1000000).to_s(16) }
46
+ result = S.new(array1).send(method, S.new(array2))
47
+ result.to_a.sort.should eql((array1 & array2).sort)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,64 @@
1
+ require "spec_helper"
2
+
3
+ describe Immutable::Set do
4
+ describe "#join" do
5
+ context "with a separator" do
6
+ [
7
+ [[], ""],
8
+ [["A"], "A"],
9
+ [[DeterministicHash.new("A", 1), DeterministicHash.new("B", 2), DeterministicHash.new("C", 3)], "A|B|C"]
10
+ ].each do |values, expected|
11
+ context "on #{values.inspect}" do
12
+ let(:set) { S[*values] }
13
+
14
+ it "preserves the original" do
15
+ set.join("|")
16
+ set.should eql(S[*values])
17
+ end
18
+
19
+ it "returns #{expected.inspect}" do
20
+ set.join("|").should eql(expected)
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ context "without a separator" do
27
+ [
28
+ [[], ""],
29
+ [["A"], "A"],
30
+ [[DeterministicHash.new("A", 1), DeterministicHash.new("B", 2), DeterministicHash.new("C", 3)], "ABC"]
31
+ ].each do |values, expected|
32
+ context "on #{values.inspect}" do
33
+ let(:set) { S[*values] }
34
+
35
+ it "preserves the original" do
36
+ set.join
37
+ set.should eql(S[*values])
38
+ end
39
+
40
+ it "returns #{expected.inspect}" do
41
+ set.join.should eql(expected)
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ context "without a separator (with global default separator set)" do
48
+ before { $, = '**' }
49
+ let(:set) { S[DeterministicHash.new("A", 1), DeterministicHash.new("B", 2), DeterministicHash.new("C", 3)] }
50
+ after { $, = nil }
51
+
52
+ context "on ['A', 'B', 'C']" do
53
+ it "preserves the original" do
54
+ set.join
55
+ set.should eql(S[DeterministicHash.new("A", 1), DeterministicHash.new("B", 2), DeterministicHash.new("C", 3)])
56
+ end
57
+
58
+ it "returns #{@expected.inspect}" do
59
+ set.join.should == "A**B**C"
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end