hamster 1.0.1.pre.rc3 → 2.0.0

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 (358) hide show
  1. checksums.yaml +4 -4
  2. data/lib/hamster.rb +2 -0
  3. data/lib/hamster/associable.rb +49 -0
  4. data/lib/hamster/core_ext/enumerable.rb +3 -13
  5. data/lib/hamster/core_ext/io.rb +1 -1
  6. data/lib/hamster/core_ext/struct.rb +9 -0
  7. data/lib/hamster/deque.rb +57 -38
  8. data/lib/hamster/enumerable.rb +14 -41
  9. data/lib/hamster/experimental/mutable_queue.rb +5 -8
  10. data/lib/hamster/experimental/mutable_set.rb +6 -7
  11. data/lib/hamster/hash.rb +301 -110
  12. data/lib/hamster/immutable.rb +1 -1
  13. data/lib/hamster/list.rb +479 -194
  14. data/lib/hamster/mutable_hash.rb +6 -7
  15. data/lib/hamster/nested.rb +78 -0
  16. data/lib/hamster/read_copy_update.rb +1 -1
  17. data/lib/hamster/set.rb +198 -88
  18. data/lib/hamster/sorted_set.rb +706 -261
  19. data/lib/hamster/trie.rb +134 -15
  20. data/lib/hamster/vector.rb +571 -140
  21. data/lib/hamster/version.rb +3 -1
  22. data/spec/lib/hamster/associable/associable_spec.rb +150 -0
  23. data/spec/lib/hamster/core_ext/array_spec.rb +1 -1
  24. data/spec/lib/hamster/core_ext/enumerable_spec.rb +2 -2
  25. data/spec/lib/hamster/core_ext/io_spec.rb +1 -1
  26. data/spec/lib/hamster/deque/clear_spec.rb +3 -3
  27. data/spec/lib/hamster/deque/construction_spec.rb +8 -8
  28. data/spec/lib/hamster/deque/copying_spec.rb +1 -1
  29. data/spec/lib/hamster/deque/dequeue_spec.rb +12 -4
  30. data/spec/lib/hamster/deque/empty_spec.rb +14 -16
  31. data/spec/lib/hamster/deque/enqueue_spec.rb +4 -4
  32. data/spec/lib/hamster/deque/first_spec.rb +18 -0
  33. data/spec/lib/hamster/deque/inspect_spec.rb +1 -1
  34. data/spec/lib/hamster/deque/last_spec.rb +9 -11
  35. data/spec/lib/hamster/deque/marshal_spec.rb +6 -6
  36. data/spec/lib/hamster/deque/new_spec.rb +5 -5
  37. data/spec/lib/hamster/deque/pop_spec.rb +15 -3
  38. data/spec/lib/hamster/deque/pretty_print_spec.rb +24 -0
  39. data/spec/lib/hamster/deque/push_spec.rb +37 -0
  40. data/spec/lib/hamster/deque/shift_spec.rb +30 -0
  41. data/spec/lib/hamster/deque/size_spec.rb +1 -1
  42. data/spec/lib/hamster/deque/to_a_spec.rb +2 -2
  43. data/spec/lib/hamster/deque/to_ary_spec.rb +1 -1
  44. data/spec/lib/hamster/deque/to_list_spec.rb +3 -3
  45. data/spec/lib/hamster/deque/unshift_spec.rb +8 -3
  46. data/spec/lib/hamster/experimental/mutable_set/add_qm_spec.rb +3 -3
  47. data/spec/lib/hamster/experimental/mutable_set/add_spec.rb +3 -3
  48. data/spec/lib/hamster/experimental/mutable_set/delete_qm_spec.rb +3 -3
  49. data/spec/lib/hamster/experimental/mutable_set/delete_spec.rb +3 -3
  50. data/spec/lib/hamster/hash/all_spec.rb +32 -34
  51. data/spec/lib/hamster/hash/any_spec.rb +34 -36
  52. data/spec/lib/hamster/hash/assoc_spec.rb +3 -3
  53. data/spec/lib/hamster/hash/clear_spec.rb +4 -4
  54. data/spec/lib/hamster/hash/construction_spec.rb +8 -8
  55. data/spec/lib/hamster/hash/copying_spec.rb +1 -1
  56. data/spec/lib/hamster/hash/default_proc_spec.rb +3 -3
  57. data/spec/lib/hamster/hash/delete_spec.rb +4 -4
  58. data/spec/lib/hamster/hash/each_spec.rb +3 -3
  59. data/spec/lib/hamster/hash/each_with_index_spec.rb +1 -1
  60. data/spec/lib/hamster/hash/empty_spec.rb +13 -15
  61. data/spec/lib/hamster/hash/eql_spec.rb +4 -4
  62. data/spec/lib/hamster/hash/except_spec.rb +7 -7
  63. data/spec/lib/hamster/hash/fetch_spec.rb +10 -10
  64. data/spec/lib/hamster/hash/find_spec.rb +2 -2
  65. data/spec/lib/hamster/hash/flat_map_spec.rb +4 -4
  66. data/spec/lib/hamster/hash/flatten_spec.rb +13 -13
  67. data/spec/lib/hamster/hash/get_spec.rb +7 -7
  68. data/spec/lib/hamster/hash/has_key_spec.rb +3 -3
  69. data/spec/lib/hamster/hash/has_value_spec.rb +4 -4
  70. data/spec/lib/hamster/hash/hash_spec.rb +5 -5
  71. data/spec/lib/hamster/hash/inspect_spec.rb +2 -2
  72. data/spec/lib/hamster/hash/invert_spec.rb +6 -6
  73. data/spec/lib/hamster/hash/key_spec.rb +2 -2
  74. data/spec/lib/hamster/hash/keys_spec.rb +2 -2
  75. data/spec/lib/hamster/hash/map_spec.rb +4 -4
  76. data/spec/lib/hamster/hash/marshal_spec.rb +2 -2
  77. data/spec/lib/hamster/hash/merge_spec.rb +62 -56
  78. data/spec/lib/hamster/hash/min_max_spec.rb +9 -13
  79. data/spec/lib/hamster/hash/new_spec.rb +6 -6
  80. data/spec/lib/hamster/hash/none_spec.rb +3 -3
  81. data/spec/lib/hamster/hash/partition_spec.rb +2 -2
  82. data/spec/lib/hamster/hash/put_spec.rb +29 -7
  83. data/spec/lib/hamster/hash/reduce_spec.rb +4 -4
  84. data/spec/lib/hamster/hash/{remove_spec.rb → reject_spec.rb} +7 -7
  85. data/spec/lib/hamster/hash/reverse_each_spec.rb +1 -1
  86. data/spec/lib/hamster/hash/{filter_spec.rb → select_spec.rb} +6 -6
  87. data/spec/lib/hamster/hash/size_spec.rb +3 -3
  88. data/spec/lib/hamster/hash/slice_spec.rb +4 -4
  89. data/spec/lib/hamster/hash/sort_spec.rb +2 -2
  90. data/spec/lib/hamster/hash/store_spec.rb +29 -7
  91. data/spec/lib/hamster/hash/take_spec.rb +2 -2
  92. data/spec/lib/hamster/hash/to_a_spec.rb +1 -1
  93. data/spec/lib/hamster/hash/to_hash_spec.rb +4 -4
  94. data/spec/lib/hamster/hash/values_at_spec.rb +3 -3
  95. data/spec/lib/hamster/hash/values_spec.rb +2 -2
  96. data/spec/lib/hamster/immutable/new_spec.rb +14 -0
  97. data/spec/lib/hamster/list/add_spec.rb +16 -10
  98. data/spec/lib/hamster/list/all_spec.rb +33 -35
  99. data/spec/lib/hamster/list/any_spec.rb +29 -31
  100. data/spec/lib/hamster/list/append_spec.rb +6 -6
  101. data/spec/lib/hamster/list/at_spec.rb +1 -1
  102. data/spec/lib/hamster/list/break_spec.rb +4 -4
  103. data/spec/lib/hamster/list/cadr_spec.rb +9 -9
  104. data/spec/lib/hamster/list/chunk_spec.rb +5 -5
  105. data/spec/lib/hamster/list/clear_spec.rb +3 -3
  106. data/spec/lib/hamster/list/combination_spec.rb +3 -3
  107. data/spec/lib/hamster/list/compact_spec.rb +3 -3
  108. data/spec/lib/hamster/list/compare_spec.rb +3 -3
  109. data/spec/lib/hamster/list/cons_spec.rb +15 -17
  110. data/spec/lib/hamster/list/construction_spec.rb +20 -27
  111. data/spec/lib/hamster/list/copying_spec.rb +1 -1
  112. data/spec/lib/hamster/list/count_spec.rb +1 -1
  113. data/spec/lib/hamster/list/cycle_spec.rb +4 -4
  114. data/spec/lib/hamster/list/delete_at_spec.rb +4 -4
  115. data/spec/lib/hamster/list/drop_spec.rb +3 -3
  116. data/spec/lib/hamster/list/drop_while_spec.rb +3 -3
  117. data/spec/lib/hamster/list/each_slice_spec.rb +5 -5
  118. data/spec/lib/hamster/list/each_spec.rb +26 -28
  119. data/spec/lib/hamster/list/each_with_index_spec.rb +1 -1
  120. data/spec/lib/hamster/list/empty_spec.rb +13 -15
  121. data/spec/lib/hamster/list/eql_spec.rb +21 -21
  122. data/spec/lib/hamster/list/fill_spec.rb +8 -8
  123. data/spec/lib/hamster/list/find_all_spec.rb +3 -3
  124. data/spec/lib/hamster/list/find_index_spec.rb +1 -1
  125. data/spec/lib/hamster/list/find_spec.rb +1 -1
  126. data/spec/lib/hamster/list/flat_map_spec.rb +2 -2
  127. data/spec/lib/hamster/list/flatten_spec.rb +5 -5
  128. data/spec/lib/hamster/list/grep_spec.rb +4 -4
  129. data/spec/lib/hamster/list/group_by_spec.rb +6 -6
  130. data/spec/lib/hamster/list/hash_spec.rb +2 -2
  131. data/spec/lib/hamster/list/head_spec.rb +1 -1
  132. data/spec/lib/hamster/list/include_spec.rb +2 -2
  133. data/spec/lib/hamster/list/index_spec.rb +38 -0
  134. data/spec/lib/hamster/list/indices_spec.rb +62 -0
  135. data/spec/lib/hamster/list/init_spec.rb +3 -3
  136. data/spec/lib/hamster/list/inits_spec.rb +3 -3
  137. data/spec/lib/hamster/list/insert_spec.rb +1 -1
  138. data/spec/lib/hamster/list/inspect_spec.rb +1 -1
  139. data/spec/lib/hamster/list/intersperse_spec.rb +3 -3
  140. data/spec/lib/hamster/list/join_spec.rb +5 -5
  141. data/spec/lib/hamster/list/last_spec.rb +1 -1
  142. data/spec/lib/hamster/list/ltlt_spec.rb +20 -0
  143. data/spec/lib/hamster/list/map_spec.rb +4 -4
  144. data/spec/lib/hamster/list/maximum_spec.rb +24 -26
  145. data/spec/lib/hamster/list/merge_by_spec.rb +10 -10
  146. data/spec/lib/hamster/list/merge_spec.rb +10 -10
  147. data/spec/lib/hamster/list/minimum_spec.rb +24 -26
  148. data/spec/lib/hamster/list/multithreading_spec.rb +6 -6
  149. data/spec/lib/hamster/list/none_spec.rb +5 -5
  150. data/spec/lib/hamster/list/one_spec.rb +5 -5
  151. data/spec/lib/hamster/list/partition_spec.rb +8 -8
  152. data/spec/lib/hamster/list/permutation_spec.rb +8 -8
  153. data/spec/lib/hamster/list/pop_spec.rb +3 -3
  154. data/spec/lib/hamster/list/product_spec.rb +1 -1
  155. data/spec/lib/hamster/list/reduce_spec.rb +5 -48
  156. data/spec/lib/hamster/list/{remove_spec.rb → reject_spec.rb} +4 -4
  157. data/spec/lib/hamster/list/reverse_spec.rb +3 -3
  158. data/spec/lib/hamster/list/rotate_spec.rb +7 -7
  159. data/spec/lib/hamster/list/sample_spec.rb +1 -1
  160. data/spec/lib/hamster/list/select_spec.rb +3 -3
  161. data/spec/lib/hamster/list/size_spec.rb +1 -1
  162. data/spec/lib/hamster/list/slice_spec.rb +123 -123
  163. data/spec/lib/hamster/list/sorting_spec.rb +5 -5
  164. data/spec/lib/hamster/list/span_spec.rb +5 -5
  165. data/spec/lib/hamster/list/split_at_spec.rb +4 -4
  166. data/spec/lib/hamster/list/subsequences_spec.rb +1 -1
  167. data/spec/lib/hamster/list/sum_spec.rb +1 -1
  168. data/spec/lib/hamster/list/tail_spec.rb +4 -4
  169. data/spec/lib/hamster/list/tails_spec.rb +3 -3
  170. data/spec/lib/hamster/list/take_spec.rb +3 -3
  171. data/spec/lib/hamster/list/take_while_spec.rb +4 -4
  172. data/spec/lib/hamster/list/to_a_spec.rb +2 -2
  173. data/spec/lib/hamster/list/to_ary_spec.rb +1 -1
  174. data/spec/lib/hamster/list/to_list_spec.rb +1 -1
  175. data/spec/lib/hamster/list/to_set_spec.rb +1 -1
  176. data/spec/lib/hamster/list/union_spec.rb +4 -4
  177. data/spec/lib/hamster/list/uniq_spec.rb +23 -19
  178. data/spec/lib/hamster/list/zip_spec.rb +5 -5
  179. data/spec/lib/hamster/nested/construction_spec.rb +103 -0
  180. data/spec/lib/hamster/set/add_spec.rb +13 -11
  181. data/spec/lib/hamster/set/all_spec.rb +32 -34
  182. data/spec/lib/hamster/set/any_spec.rb +32 -34
  183. data/spec/lib/hamster/set/clear_spec.rb +3 -3
  184. data/spec/lib/hamster/set/compact_spec.rb +3 -3
  185. data/spec/lib/hamster/set/construction_spec.rb +3 -3
  186. data/spec/lib/hamster/set/copying_spec.rb +1 -1
  187. data/spec/lib/hamster/set/count_spec.rb +1 -1
  188. data/spec/lib/hamster/set/delete_spec.rb +8 -8
  189. data/spec/lib/hamster/set/difference_spec.rb +8 -8
  190. data/spec/lib/hamster/set/disjoint_spec.rb +1 -1
  191. data/spec/lib/hamster/set/each_spec.rb +2 -2
  192. data/spec/lib/hamster/set/empty_spec.rb +15 -17
  193. data/spec/lib/hamster/set/eqeq_spec.rb +3 -3
  194. data/spec/lib/hamster/set/eql_spec.rb +3 -3
  195. data/spec/lib/hamster/set/exclusion_spec.rb +7 -7
  196. data/spec/lib/hamster/set/find_spec.rb +2 -2
  197. data/spec/lib/hamster/set/first_spec.rb +29 -0
  198. data/spec/lib/hamster/set/flatten_spec.rb +9 -9
  199. data/spec/lib/hamster/set/grep_spec.rb +1 -1
  200. data/spec/lib/hamster/set/group_by_spec.rb +12 -12
  201. data/spec/lib/hamster/set/hash_spec.rb +3 -3
  202. data/spec/lib/hamster/set/include_spec.rb +8 -8
  203. data/spec/lib/hamster/set/inspect_spec.rb +2 -2
  204. data/spec/lib/hamster/set/intersect_spec.rb +1 -1
  205. data/spec/lib/hamster/set/intersection_spec.rb +13 -13
  206. data/spec/lib/hamster/set/join_spec.rb +6 -6
  207. data/spec/lib/hamster/set/map_spec.rb +7 -7
  208. data/spec/lib/hamster/set/marshal_spec.rb +2 -2
  209. data/spec/lib/hamster/set/maximum_spec.rb +22 -24
  210. data/spec/lib/hamster/set/minimum_spec.rb +22 -24
  211. data/spec/lib/hamster/set/new_spec.rb +5 -5
  212. data/spec/lib/hamster/set/none_spec.rb +5 -5
  213. data/spec/lib/hamster/set/one_spec.rb +6 -6
  214. data/spec/lib/hamster/set/partition_spec.rb +5 -5
  215. data/spec/lib/hamster/set/product_spec.rb +2 -2
  216. data/spec/lib/hamster/set/reduce_spec.rb +5 -5
  217. data/spec/lib/hamster/set/{remove_spec.rb → reject_spec.rb} +6 -6
  218. data/spec/lib/hamster/set/reverse_each_spec.rb +1 -1
  219. data/spec/lib/hamster/set/sample_spec.rb +1 -1
  220. data/spec/lib/hamster/set/{filter_spec.rb → select_spec.rb} +11 -11
  221. data/spec/lib/hamster/set/size_spec.rb +1 -1
  222. data/spec/lib/hamster/set/sorting_spec.rb +16 -5
  223. data/spec/lib/hamster/set/subset_spec.rb +2 -2
  224. data/spec/lib/hamster/set/sum_spec.rb +2 -2
  225. data/spec/lib/hamster/set/superset_spec.rb +2 -2
  226. data/spec/lib/hamster/set/to_a_spec.rb +2 -2
  227. data/spec/lib/hamster/set/to_list_spec.rb +2 -2
  228. data/spec/lib/hamster/set/to_set_spec.rb +1 -1
  229. data/spec/lib/hamster/set/union_spec.rb +23 -14
  230. data/spec/lib/hamster/sorted_set/above_spec.rb +11 -11
  231. data/spec/lib/hamster/sorted_set/add_spec.rb +8 -8
  232. data/spec/lib/hamster/sorted_set/at_spec.rb +1 -1
  233. data/spec/lib/hamster/sorted_set/below_spec.rb +11 -11
  234. data/spec/lib/hamster/sorted_set/between_spec.rb +11 -11
  235. data/spec/lib/hamster/sorted_set/clear_spec.rb +11 -2
  236. data/spec/lib/hamster/sorted_set/copying_spec.rb +21 -0
  237. data/spec/lib/hamster/sorted_set/delete_at_spec.rb +4 -4
  238. data/spec/lib/hamster/sorted_set/delete_spec.rb +21 -12
  239. data/spec/lib/hamster/sorted_set/difference_spec.rb +2 -2
  240. data/spec/lib/hamster/sorted_set/disjoint_spec.rb +1 -1
  241. data/spec/lib/hamster/sorted_set/drop_spec.rb +30 -3
  242. data/spec/lib/hamster/sorted_set/drop_while_spec.rb +4 -4
  243. data/spec/lib/hamster/sorted_set/each_spec.rb +16 -18
  244. data/spec/lib/hamster/sorted_set/empty_spec.rb +12 -14
  245. data/spec/lib/hamster/sorted_set/eql_spec.rb +5 -5
  246. data/spec/lib/hamster/sorted_set/exclusion_spec.rb +1 -1
  247. data/spec/lib/hamster/sorted_set/fetch_spec.rb +1 -1
  248. data/spec/lib/hamster/sorted_set/find_index_spec.rb +10 -2
  249. data/spec/lib/hamster/sorted_set/first_spec.rb +10 -12
  250. data/spec/lib/hamster/sorted_set/from_spec.rb +11 -11
  251. data/spec/lib/hamster/sorted_set/group_by_spec.rb +10 -10
  252. data/spec/lib/hamster/sorted_set/include_spec.rb +2 -2
  253. data/spec/lib/hamster/sorted_set/inspect_spec.rb +1 -1
  254. data/spec/lib/hamster/sorted_set/intersect_spec.rb +1 -1
  255. data/spec/lib/hamster/sorted_set/intersection_spec.rb +3 -3
  256. data/spec/lib/hamster/sorted_set/last_spec.rb +1 -1
  257. data/spec/lib/hamster/sorted_set/map_spec.rb +13 -5
  258. data/spec/lib/hamster/sorted_set/marshal_spec.rb +3 -3
  259. data/spec/lib/hamster/sorted_set/maximum_spec.rb +37 -0
  260. data/spec/lib/hamster/sorted_set/minimum_spec.rb +11 -13
  261. data/spec/lib/hamster/sorted_set/new_spec.rb +23 -3
  262. data/spec/lib/hamster/sorted_set/reverse_each_spec.rb +2 -2
  263. data/spec/lib/hamster/sorted_set/{filter_spec.rb → select_spec.rb} +10 -10
  264. data/spec/lib/hamster/sorted_set/size_spec.rb +1 -1
  265. data/spec/lib/hamster/sorted_set/slice_spec.rb +158 -142
  266. data/spec/lib/hamster/sorted_set/sorting_spec.rb +3 -3
  267. data/spec/lib/hamster/sorted_set/subset_spec.rb +2 -2
  268. data/spec/lib/hamster/sorted_set/superset_spec.rb +2 -2
  269. data/spec/lib/hamster/sorted_set/take_spec.rb +32 -3
  270. data/spec/lib/hamster/sorted_set/take_while_spec.rb +4 -4
  271. data/spec/lib/hamster/sorted_set/to_set_spec.rb +1 -1
  272. data/spec/lib/hamster/sorted_set/union_spec.rb +2 -2
  273. data/spec/lib/hamster/sorted_set/up_to_spec.rb +12 -11
  274. data/spec/lib/hamster/sorted_set/values_at_spec.rb +6 -6
  275. data/spec/lib/hamster/vector/add_spec.rb +3 -3
  276. data/spec/lib/hamster/vector/any_spec.rb +1 -1
  277. data/spec/lib/hamster/vector/assoc_spec.rb +11 -1
  278. data/spec/lib/hamster/vector/bsearch_spec.rb +10 -2
  279. data/spec/lib/hamster/vector/clear_spec.rb +3 -3
  280. data/spec/lib/hamster/vector/combination_spec.rb +4 -4
  281. data/spec/lib/hamster/vector/compact_spec.rb +2 -2
  282. data/spec/lib/hamster/vector/compare_spec.rb +3 -3
  283. data/spec/lib/hamster/vector/concat_spec.rb +2 -2
  284. data/spec/lib/hamster/vector/copying_spec.rb +1 -1
  285. data/spec/lib/hamster/vector/delete_at_spec.rb +8 -8
  286. data/spec/lib/hamster/vector/delete_spec.rb +2 -2
  287. data/spec/lib/hamster/vector/drop_spec.rb +10 -3
  288. data/spec/lib/hamster/vector/drop_while_spec.rb +5 -5
  289. data/spec/lib/hamster/vector/each_index_spec.rb +2 -2
  290. data/spec/lib/hamster/vector/each_spec.rb +27 -29
  291. data/spec/lib/hamster/vector/each_with_index_spec.rb +2 -2
  292. data/spec/lib/hamster/vector/empty_spec.rb +11 -13
  293. data/spec/lib/hamster/vector/eql_spec.rb +6 -6
  294. data/spec/lib/hamster/vector/fetch_spec.rb +1 -1
  295. data/spec/lib/hamster/vector/fill_spec.rb +9 -9
  296. data/spec/lib/hamster/vector/first_spec.rb +10 -12
  297. data/spec/lib/hamster/vector/flat_map_spec.rb +51 -0
  298. data/spec/lib/hamster/vector/flatten_spec.rb +15 -0
  299. data/spec/lib/hamster/vector/get_spec.rb +4 -4
  300. data/spec/lib/hamster/vector/group_by_spec.rb +12 -12
  301. data/spec/lib/hamster/vector/include_spec.rb +2 -2
  302. data/spec/lib/hamster/vector/insert_spec.rb +2 -2
  303. data/spec/lib/hamster/vector/inspect_spec.rb +1 -1
  304. data/spec/lib/hamster/vector/join_spec.rb +5 -5
  305. data/spec/lib/hamster/vector/last_spec.rb +1 -1
  306. data/spec/lib/hamster/vector/length_spec.rb +1 -1
  307. data/spec/lib/hamster/vector/ltlt_spec.rb +2 -2
  308. data/spec/lib/hamster/vector/map_spec.rb +5 -5
  309. data/spec/lib/hamster/vector/marshal_spec.rb +2 -2
  310. data/spec/lib/hamster/vector/maximum_spec.rb +20 -22
  311. data/spec/lib/hamster/vector/minimum_spec.rb +20 -22
  312. data/spec/lib/hamster/vector/multiply_spec.rb +4 -4
  313. data/spec/lib/hamster/vector/partition_spec.rb +5 -5
  314. data/spec/lib/hamster/vector/permutation_spec.rb +4 -4
  315. data/spec/lib/hamster/vector/pop_spec.rb +3 -3
  316. data/spec/lib/hamster/vector/product_spec.rb +10 -10
  317. data/spec/lib/hamster/vector/put_spec.rb +175 -0
  318. data/spec/lib/hamster/vector/reduce_spec.rb +5 -57
  319. data/spec/lib/hamster/vector/{remove_spec.rb → reject_spec.rb} +4 -4
  320. data/spec/lib/hamster/vector/repeated_combination_spec.rb +4 -4
  321. data/spec/lib/hamster/vector/repeated_permutation_spec.rb +6 -6
  322. data/spec/lib/hamster/vector/reverse_each_spec.rb +1 -1
  323. data/spec/lib/hamster/vector/reverse_spec.rb +1 -1
  324. data/spec/lib/hamster/vector/rindex_spec.rb +1 -1
  325. data/spec/lib/hamster/vector/rotate_spec.rb +9 -9
  326. data/spec/lib/hamster/vector/sample_spec.rb +1 -1
  327. data/spec/lib/hamster/vector/{filter_spec.rb → select_spec.rb} +8 -8
  328. data/spec/lib/hamster/vector/set_spec.rb +12 -141
  329. data/spec/lib/hamster/vector/shift_spec.rb +3 -3
  330. data/spec/lib/hamster/vector/shuffle_spec.rb +2 -2
  331. data/spec/lib/hamster/vector/slice_spec.rb +137 -137
  332. data/spec/lib/hamster/vector/sorting_spec.rb +5 -5
  333. data/spec/lib/hamster/vector/sum_spec.rb +1 -1
  334. data/spec/lib/hamster/vector/take_spec.rb +17 -3
  335. data/spec/lib/hamster/vector/take_while_spec.rb +4 -4
  336. data/spec/lib/hamster/vector/to_a_spec.rb +1 -1
  337. data/spec/lib/hamster/vector/to_ary_spec.rb +1 -1
  338. data/spec/lib/hamster/vector/to_list_spec.rb +2 -1
  339. data/spec/lib/hamster/vector/to_set_spec.rb +1 -1
  340. data/spec/lib/hamster/vector/uniq_spec.rb +27 -6
  341. data/spec/lib/hamster/vector/unshift_spec.rb +3 -3
  342. data/spec/lib/hamster/vector/values_at_spec.rb +6 -6
  343. data/spec/lib/hamster/vector/zip_spec.rb +2 -2
  344. data/spec/lib/load_spec.rb +42 -0
  345. data/spec/spec_helper.rb +25 -0
  346. metadata +85 -48
  347. data/spec/lib/hamster/deque/head_spec.rb +0 -20
  348. data/spec/lib/hamster/hash/uniq_spec.rb +0 -14
  349. data/spec/lib/hamster/list/elem_index_spec.rb +0 -36
  350. data/spec/lib/hamster/list/elem_indices_spec.rb +0 -31
  351. data/spec/lib/hamster/list/filter_spec.rb +0 -71
  352. data/spec/lib/hamster/list/find_indices_spec.rb +0 -37
  353. data/spec/lib/hamster/set/foreach_spec.rb +0 -40
  354. data/spec/lib/hamster/set/head_spec.rb +0 -31
  355. data/spec/lib/hamster/set/uniq_spec.rb +0 -14
  356. data/spec/lib/hamster/sorted_set/construction_spec.rb +0 -29
  357. data/spec/lib/hamster/vector/exist_spec.rb +0 -70
  358. data/spec/lib/hamster/vector/exists_spec.rb +0 -70
@@ -23,20 +23,20 @@ describe Hamster::Hash do
23
23
  end
24
24
 
25
25
  it "accepts an array as initializer" do
26
- Hamster::Hash.new([['a', 'b'], ['c', 'd']]).should eql(Hamster.hash('a' => 'b', 'c' => 'd'))
26
+ H.new([['a', 'b'], ['c', 'd']]).should eql(H['a' => 'b', 'c' => 'd'])
27
27
  end
28
28
 
29
29
  it "returns a Hash which doesn't change even if initializer is mutated" do
30
30
  rbhash = {a: 1, b: 2}
31
- hash = Hamster::Hash.new(rbhash)
31
+ hash = H.new(rbhash)
32
32
  rbhash[:a] = 'BAD'
33
- hash.should eql(Hamster.hash(a: 1, b: 2))
33
+ hash.should eql(H[a: 1, b: 2])
34
34
  end
35
35
  end
36
36
 
37
37
  describe ".[]" do
38
38
  it "accepts a Ruby Hash as initializer" do
39
- hash = Hamster::Hash[a: 1, b: 2]
39
+ hash = H[a: 1, b: 2]
40
40
  hash.class.should be(Hamster::Hash)
41
41
  hash.size.should == 2
42
42
  hash.key?(:a).should == true
@@ -44,7 +44,7 @@ describe Hamster::Hash do
44
44
  end
45
45
 
46
46
  it "accepts a Hamster::Hash as initializer" do
47
- hash = Hamster::Hash[Hamster.hash(a: 1, b: 2)]
47
+ hash = H[H.new(a: 1, b: 2)]
48
48
  hash.class.should be(Hamster::Hash)
49
49
  hash.size.should == 2
50
50
  hash.key?(:a).should == true
@@ -52,7 +52,7 @@ describe Hamster::Hash do
52
52
  end
53
53
 
54
54
  it "accepts an array as initializer" do
55
- hash = Hamster::Hash[[[:a, 1], [:b, 2]]]
55
+ hash = H[[[:a, 1], [:b, 2]]]
56
56
  hash.class.should be(Hamster::Hash)
57
57
  hash.size.should == 2
58
58
  hash.key?(:a).should == true
@@ -5,16 +5,16 @@ describe Hamster::Hash do
5
5
  describe "#none?" do
6
6
  context "when empty" do
7
7
  it "with a block returns true" do
8
- Hamster.hash.none? {}.should == true
8
+ H.empty.none? {}.should == true
9
9
  end
10
10
 
11
11
  it "with no block returns true" do
12
- Hamster.hash.none?.should == true
12
+ H.empty.none?.should == true
13
13
  end
14
14
  end
15
15
 
16
16
  context "when not empty" do
17
- let(:hash) { Hamster.hash("A" => "aye", "B" => "bee", "C" => "see", nil => "NIL") }
17
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see", nil => "NIL"] }
18
18
 
19
19
  context "with a block" do
20
20
  [
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
  require "hamster/hash"
3
3
 
4
4
  describe Hamster::Hash do
5
- let(:hash) { Hamster.hash("a" => 1, "b" => 2, "c" => 3, "d" => 4) }
5
+ let(:hash) { H["a" => 1, "b" => 2, "c" => 3, "d" => 4] }
6
6
  let(:partition) { hash.partition { |k,v| v % 2 == 0 }}
7
7
 
8
8
  describe "#partition" do
@@ -21,7 +21,7 @@ describe Hamster::Hash do
21
21
 
22
22
  it "doesn't modify the original Hash" do
23
23
  partition
24
- hash.should eql(Hamster.hash("a" => 1, "b" => 2, "c" => 3, "d" => 4))
24
+ hash.should eql(H["a" => 1, "b" => 2, "c" => 3, "d" => 4])
25
25
  end
26
26
 
27
27
  context "from a subclass" do
@@ -3,7 +3,7 @@ require "hamster/hash"
3
3
 
4
4
  describe Hamster::Hash do
5
5
  describe "#put" do
6
- let(:hash) { Hamster.hash("A" => "aye", "B" => "bee", "C" => "see") }
6
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
7
7
 
8
8
  context "with a block" do
9
9
  it "passes the value to the block" do
@@ -37,11 +37,11 @@ describe Hamster::Hash do
37
37
 
38
38
  it "preserves the original" do
39
39
  result
40
- hash.should eql(Hamster.hash("A" => "aye", "B" => "bee", "C" => "see"))
40
+ hash.should eql(H["A" => "aye", "B" => "bee", "C" => "see"])
41
41
  end
42
42
 
43
43
  it "returns a copy with the superset of key/value pairs" do
44
- result.should eql(Hamster.hash("A" => "aye", "B" => "bee", "C" => "see", "D" => "dee"))
44
+ result.should eql(H["A" => "aye", "B" => "bee", "C" => "see", "D" => "dee"])
45
45
  end
46
46
  end
47
47
 
@@ -50,16 +50,38 @@ describe Hamster::Hash do
50
50
 
51
51
  it "preserves the original" do
52
52
  result
53
- hash.should eql(Hamster.hash("A" => "aye", "B" => "bee", "C" => "see"))
53
+ hash.should eql(H["A" => "aye", "B" => "bee", "C" => "see"])
54
54
  end
55
55
 
56
56
  it "returns a copy with the superset of key/value pairs" do
57
- result.should eql(Hamster.hash("A" => "aye", "B" => "bee", "C" => "sea"))
57
+ result.should eql(H["A" => "aye", "B" => "bee", "C" => "sea"])
58
+ end
59
+ end
60
+
61
+ context "with duplicate key and identical value" do
62
+ let(:hash) { H["X" => 1, "Y" => 2] }
63
+ let(:result) { hash.put("X", 1) }
64
+
65
+ it "returns the original hash unmodified" do
66
+ result.should be(hash)
67
+ end
68
+
69
+ context "with big hash (force nested tries)" do
70
+ let(:keys) { (0..99).map(&:to_s) }
71
+ let(:values) { (100..199).to_a }
72
+ let(:hash) { H[keys.zip(values)] }
73
+
74
+ it "returns the original hash unmodified for all changes" do
75
+ keys.each_with_index do |key, index|
76
+ result = hash.put(key, values[index])
77
+ result.should be(hash)
78
+ end
79
+ end
58
80
  end
59
81
  end
60
82
 
61
83
  context "with unequal keys which hash to the same value" do
62
- let(:hash) { Hamster.hash(DeterministicHash.new('a', 1) => 'aye') }
84
+ let(:hash) { H[DeterministicHash.new('a', 1) => 'aye'] }
63
85
 
64
86
  it "stores and can retrieve both" do
65
87
  result = hash.put(DeterministicHash.new('b', 1), 'bee')
@@ -71,7 +93,7 @@ describe Hamster::Hash do
71
93
  context "when a String is inserted as key and then mutated" do
72
94
  it "is not affected" do
73
95
  string = "a string!"
74
- hash = Hamster.hash.put(string, 'a value!')
96
+ hash = H.empty.put(string, 'a value!')
75
97
  string.upcase!
76
98
  hash['a string!'].should == 'a value!'
77
99
  hash['A STRING!'].should be_nil
@@ -2,16 +2,16 @@ require "spec_helper"
2
2
  require "hamster/hash"
3
3
 
4
4
  describe Hamster::Hash do
5
- [:reduce, :inject, :fold, :foldr].each do |method|
5
+ [:reduce, :inject].each do |method|
6
6
  describe "##{method}" do
7
7
  context "when empty" do
8
8
  it "returns the memo" do
9
- Hamster.hash.send(method, "ABC") {}.should == "ABC"
9
+ H.empty.send(method, "ABC") {}.should == "ABC"
10
10
  end
11
11
  end
12
12
 
13
13
  context "when not empty" do
14
- let(:hash) { Hamster.hash("A" => "aye", "B" => "bee", "C" => "see") }
14
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
15
15
 
16
16
  context "with a block" do
17
17
  it "returns the final memo" do
@@ -20,7 +20,7 @@ describe Hamster::Hash do
20
20
  end
21
21
 
22
22
  context "with no block" do
23
- let(:hash) { Hamster.hash(a: 1, b: 2) }
23
+ let(:hash) { H[a: 1, b: 2] }
24
24
 
25
25
  it "uses a passed string as the name of a method to use instead" do
26
26
  [[:a, 1, :b, 2], [:b, 2, :a, 1]].include?(hash.send(method, "+")).should == true
@@ -2,9 +2,9 @@ require "spec_helper"
2
2
  require "hamster/hash"
3
3
 
4
4
  describe Hamster::Hash do
5
- [:remove, :reject, :delete_if].each do |method|
5
+ [:reject, :delete_if].each do |method|
6
6
  describe "##{method}" do
7
- let(:hash) { Hamster.hash("A" => "aye", "B" => "bee", "C" => "see") }
7
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
8
8
 
9
9
  context "when nothing matches" do
10
10
  it "returns self" do
@@ -18,11 +18,11 @@ describe Hamster::Hash do
18
18
 
19
19
  it "preserves the original" do
20
20
  result
21
- hash.should eql(Hamster.hash("A" => "aye", "B" => "bee", "C" => "see"))
21
+ hash.should eql(H["A" => "aye", "B" => "bee", "C" => "see"])
22
22
  end
23
23
 
24
24
  it "returns a set with the matching values" do
25
- result.should eql(Hamster.hash("B" => "bee", "C" => "see"))
25
+ result.should eql(H["B" => "bee", "C" => "see"])
26
26
  end
27
27
 
28
28
  it "yields entries in the same order as #each" do
@@ -38,14 +38,14 @@ describe Hamster::Hash do
38
38
  it "returns an Enumerator" do
39
39
  hash.send(method).class.should be(Enumerator)
40
40
  hash.send(method).to_a.sort.should == [['A', 'aye'], ['B', 'bee'], ['C', 'see']]
41
- hash.send(method).each { true }.should eql(Hamster.hash)
41
+ hash.send(method).each { true }.should eql(H.empty)
42
42
  end
43
43
  end
44
44
 
45
45
  context "on a large hash, with many combinations of input" do
46
46
  it "still works" do
47
47
  array = 1000.times.collect { |n| [n, n] }
48
- hash = Hamster::Hash.new(array)
48
+ hash = H.new(array)
49
49
  [0, 10, 100, 200, 500, 800, 900, 999, 1000].each do |threshold|
50
50
  result = hash.send(method) { |k,v| k >= threshold}
51
51
  result.size.should == threshold
@@ -53,7 +53,7 @@ describe Hamster::Hash do
53
53
  threshold.upto(1000) { |n| result.key?(n).should == false }
54
54
  end
55
55
  # shouldn't have changed
56
- hash.should eql(Hamster::Hash.new(1000.times.collect { |n| [n, n] }))
56
+ hash.should eql(H.new(1000.times.collect { |n| [n, n] }))
57
57
  end
58
58
  end
59
59
  end
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
  require "hamster/hash"
3
3
 
4
4
  describe Hamster::Hash do
5
- let(:hash) { Hamster.hash("A" => "aye", "B" => "bee", "C" => "see") }
5
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
6
6
 
7
7
  describe "#reverse_each" do
8
8
  context "with a block" do
@@ -2,9 +2,9 @@ require "spec_helper"
2
2
  require "hamster/hash"
3
3
 
4
4
  describe Hamster::Hash do
5
- [:filter, :select, :find_all, :keep_if].each do |method|
5
+ [:select, :find_all, :keep_if].each do |method|
6
6
  describe "##{method}" do
7
- let(:original) { Hamster.hash("A" => "aye", "B" => "bee", "C" => "see") }
7
+ let(:original) { H["A" => "aye", "B" => "bee", "C" => "see"] }
8
8
 
9
9
  context "when everything matches" do
10
10
  it "returns self" do
@@ -17,11 +17,11 @@ describe Hamster::Hash do
17
17
  let(:result) { original.send(method) { |key, value| key == "A" && value == "aye" }}
18
18
 
19
19
  it "preserves the original" do
20
- original.should eql(Hamster.hash("A" => "aye", "B" => "bee", "C" => "see"))
20
+ original.should eql(H["A" => "aye", "B" => "bee", "C" => "see"])
21
21
  end
22
22
 
23
23
  it "returns a set with the matching values" do
24
- result.should eql(Hamster.hash("A" => "aye"))
24
+ result.should eql(H["A" => "aye"])
25
25
  end
26
26
  end
27
27
 
@@ -43,7 +43,7 @@ describe Hamster::Hash do
43
43
 
44
44
  it "works on a large hash, with many combinations of input" do
45
45
  keys = (1..1000).to_a
46
- original = Hamster::Hash.new(keys.zip(2..1001))
46
+ original = H.new(keys.zip(2..1001))
47
47
  25.times do
48
48
  threshold = rand(1000)
49
49
  result = original.send(method) { |k,v| k <= threshold }
@@ -51,7 +51,7 @@ describe Hamster::Hash do
51
51
  result.each_key { |k| k.should <= threshold }
52
52
  (threshold+1).upto(1000) { |k| result.key?(k).should == false }
53
53
  end
54
- original.should eql(Hamster::Hash.new(keys.zip(2..1001))) # shouldn't have changed
54
+ original.should eql(H.new(keys.zip(2..1001))) # shouldn't have changed
55
55
  end
56
56
  end
57
57
  end
@@ -11,7 +11,7 @@ describe Hamster::Hash do
11
11
  ].each do |values, result|
12
12
 
13
13
  it "returns #{result} for #{values.inspect}" do
14
- Hamster.hash(*values).send(method).should == result
14
+ H[*values].send(method).should == result
15
15
  end
16
16
  end
17
17
 
@@ -20,7 +20,7 @@ describe Hamster::Hash do
20
20
  random_things = (lots + lots).sort_by { |x|rand }
21
21
 
22
22
  it "has the correct size after adding lots of things with colliding keys and such" do
23
- h = Hamster.hash
23
+ h = H.empty
24
24
  random_things.each do |thing|
25
25
  h = h.put(thing, thing * 2)
26
26
  end
@@ -37,7 +37,7 @@ describe Hamster::Hash do
37
37
  h
38
38
  end.size
39
39
  it "has the correct size after lots of addings and removings" do
40
- h = Hamster.hash
40
+ h = H.empty
41
41
  random_actions.each do |(act, ob)|
42
42
  if act == :add
43
43
  h = h.put(ob, ob * 3)
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
  require "hamster/hash"
3
3
 
4
4
  describe Hamster::Hash do
5
- let(:hash) { Hamster::Hash.new("A" => "aye", "B" => "bee", "C" => "see", nil => "NIL") }
5
+ let(:hash) { H.new("A" => "aye", "B" => "bee", "C" => "see", nil => "NIL") }
6
6
 
7
7
  describe "#slice" do
8
8
  let(:slice) { hash.slice(*values) }
@@ -16,7 +16,7 @@ describe Hamster::Hash do
16
16
 
17
17
  it "doesn't modify the original Hash" do
18
18
  slice
19
- hash.should eql(Hamster::Hash.new("A" => "aye", "B" => "bee", "C" => "see", nil => "NIL"))
19
+ hash.should eql(H.new("A" => "aye", "B" => "bee", "C" => "see", nil => "NIL"))
20
20
  end
21
21
  end
22
22
 
@@ -29,12 +29,12 @@ describe Hamster::Hash do
29
29
 
30
30
  it "doesn't modify the original Hash" do
31
31
  slice
32
- hash.should eql(Hamster::Hash.new("A" => "aye", "B" => "bee", "C" => "see", nil => "NIL"))
32
+ hash.should eql(H.new("A" => "aye", "B" => "bee", "C" => "see", nil => "NIL"))
33
33
  end
34
34
  end
35
35
 
36
36
  context "on a Hash with a default block" do
37
- let(:hash) { Hamster.hash('A' => 'aye', 'B' => 'bee') { 'nothing' }}
37
+ let(:hash) { H.new('A' => 'aye', 'B' => 'bee') { 'nothing' }}
38
38
  let(:values) { ["B", nil] }
39
39
 
40
40
  it "maintains the default block" do
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
  require "hamster/hash"
3
3
 
4
4
  describe Hamster::Hash do
5
- let(:hash) { Hamster.hash(a: 3, b: 2, c: 1) }
5
+ let(:hash) { H[a: 3, b: 2, c: 1] }
6
6
 
7
7
  describe "#sort" do
8
8
  it "returns a Vector of sorted key/val pairs" do
@@ -11,7 +11,7 @@ describe Hamster::Hash do
11
11
 
12
12
  it "works on large hashes" do
13
13
  array = (1..1000).map { |n| [n,n] }
14
- Hamster::Hash.new(array.shuffle).sort.should eql(Hamster::Vector.new(array))
14
+ H.new(array.shuffle).sort.should eql(V.new(array))
15
15
  end
16
16
 
17
17
  it "uses block as comparator to sort if passed a block" do
@@ -3,18 +3,18 @@ require "hamster/hash"
3
3
 
4
4
  describe Hamster::Hash do
5
5
  describe "#store" do
6
- let(:hash) { Hamster.hash("A" => "aye", "B" => "bee", "C" => "see") }
6
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
7
7
 
8
8
  context "with a unique key" do
9
9
  let(:result) { hash.store("D", "dee") }
10
10
 
11
11
  it "preserves the original" do
12
12
  result
13
- hash.should eql(Hamster.hash("A" => "aye", "B" => "bee", "C" => "see"))
13
+ hash.should eql(H["A" => "aye", "B" => "bee", "C" => "see"])
14
14
  end
15
15
 
16
16
  it "returns a copy with the superset of key/value pairs" do
17
- result.should eql(Hamster.hash("A" => "aye", "B" => "bee", "C" => "see", "D" => "dee"))
17
+ result.should eql(H["A" => "aye", "B" => "bee", "C" => "see", "D" => "dee"])
18
18
  end
19
19
  end
20
20
 
@@ -23,16 +23,38 @@ describe Hamster::Hash do
23
23
 
24
24
  it "preserves the original" do
25
25
  result
26
- hash.should eql(Hamster.hash("A" => "aye", "B" => "bee", "C" => "see"))
26
+ hash.should eql(H["A" => "aye", "B" => "bee", "C" => "see"])
27
27
  end
28
28
 
29
29
  it "returns a copy with the superset of key/value pairs" do
30
- result.should eql(Hamster.hash("A" => "aye", "B" => "bee", "C" => "sea"))
30
+ result.should eql(H["A" => "aye", "B" => "bee", "C" => "sea"])
31
+ end
32
+ end
33
+
34
+ context "with duplicate key and identical value" do
35
+ let(:hash) { H["X" => 1, "Y" => 2] }
36
+ let(:result) { hash.store("X", 1) }
37
+
38
+ it "returns the original hash unmodified" do
39
+ result.should be(hash)
40
+ end
41
+
42
+ context "with big hash (force nested tries)" do
43
+ let(:keys) { (0..99).map(&:to_s) }
44
+ let(:values) { (100..199).to_a }
45
+ let(:hash) { H[keys.zip(values)] }
46
+
47
+ it "returns the original hash unmodified for all changes" do
48
+ keys.each_with_index do |key, index|
49
+ result = hash.store(key, values[index])
50
+ result.should be(hash)
51
+ end
52
+ end
31
53
  end
32
54
  end
33
55
 
34
56
  context "with unequal keys which hash to the same value" do
35
- let(:hash) { Hamster.hash(DeterministicHash.new('a', 1) => 'aye') }
57
+ let(:hash) { H[DeterministicHash.new('a', 1) => 'aye'] }
36
58
 
37
59
  it "stores and can retrieve both" do
38
60
  result = hash.store(DeterministicHash.new('b', 1), 'bee')
@@ -44,7 +66,7 @@ describe Hamster::Hash do
44
66
  context "when a String is inserted as key and then mutated" do
45
67
  it "is not affected" do
46
68
  string = "a string!"
47
- hash = Hamster.hash.store(string, 'a value!')
69
+ hash = H.empty.store(string, 'a value!')
48
70
  string.upcase!
49
71
  hash['a string!'].should == 'a value!'
50
72
  hash['A STRING!'].should be_nil
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
  require "hamster/hash"
3
3
 
4
4
  describe Hamster::Hash do
5
- let(:hash) { Hamster.hash("A" => "aye", "B" => "bee", "C" => "see") }
5
+ let(:hash) { H["A" => "aye", "B" => "bee", "C" => "see"] }
6
6
 
7
7
  describe "#take" do
8
8
  it "returns the first N key/val pairs from hash" do
@@ -29,7 +29,7 @@ describe Hamster::Hash do
29
29
 
30
30
  it "passes all elements if the block never returns nil/false" do
31
31
  passed = []
32
- hash.take_while { |pair| passed << pair; true }.should == hash.to_a
32
+ hash.take_while { |k,v| passed << [k, v]; true }.should == hash.to_a
33
33
  passed.sort.should == [['A', 'aye'], ['B', 'bee'], ['C', 'see']]
34
34
  end
35
35
  end