stupidedi 1.1.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 (500) hide show
  1. data/README.md +215 -0
  2. data/Rakefile +108 -0
  3. data/bin/edi-ed +71 -0
  4. data/bin/edi-pp +81 -0
  5. data/doc/Defining.md +0 -0
  6. data/doc/Generating.md +321 -0
  7. data/doc/LICENSE.md +0 -0
  8. data/doc/Navigating.md +645 -0
  9. data/doc/Parsing.md +0 -0
  10. data/doc/Serializing.md +7 -0
  11. data/doc/Tokenizing.md +0 -0
  12. data/doc/Validating.md +0 -0
  13. data/doc/design/Parser.md +0 -0
  14. data/doc/design/Reader.md +0 -0
  15. data/lib/ruby/array.rb +164 -0
  16. data/lib/ruby/blank.rb +67 -0
  17. data/lib/ruby/enumerable.rb +35 -0
  18. data/lib/ruby/exception.rb +33 -0
  19. data/lib/ruby/hash.rb +4 -0
  20. data/lib/ruby/instance_exec.rb +26 -0
  21. data/lib/ruby/module.rb +79 -0
  22. data/lib/ruby/object.rb +63 -0
  23. data/lib/ruby/string.rb +73 -0
  24. data/lib/ruby/symbol.rb +24 -0
  25. data/lib/ruby/to_d.rb +81 -0
  26. data/lib/ruby/to_date.rb +33 -0
  27. data/lib/ruby/to_time.rb +24 -0
  28. data/lib/ruby/try.rb +43 -0
  29. data/lib/stupidedi/blank_slate.rb +11 -0
  30. data/lib/stupidedi/builder/builder_dsl.rb +281 -0
  31. data/lib/stupidedi/builder/constraint_table.rb +418 -0
  32. data/lib/stupidedi/builder/generation.rb +112 -0
  33. data/lib/stupidedi/builder/instruction.rb +102 -0
  34. data/lib/stupidedi/builder/instruction_table.rb +204 -0
  35. data/lib/stupidedi/builder/navigation.rb +655 -0
  36. data/lib/stupidedi/builder/state_machine.rb +55 -0
  37. data/lib/stupidedi/builder/states/abstract_state.rb +332 -0
  38. data/lib/stupidedi/builder/states/failure_state.rb +69 -0
  39. data/lib/stupidedi/builder/states/functional_group_state.rb +97 -0
  40. data/lib/stupidedi/builder/states/initial_state.rb +63 -0
  41. data/lib/stupidedi/builder/states/interchange_state.rb +94 -0
  42. data/lib/stupidedi/builder/states/loop_state.rb +79 -0
  43. data/lib/stupidedi/builder/states/table_state.rb +96 -0
  44. data/lib/stupidedi/builder/states/transaction_set_state.rb +112 -0
  45. data/lib/stupidedi/builder/states/transmission_state.rb +59 -0
  46. data/lib/stupidedi/builder/tokenization.rb +196 -0
  47. data/lib/stupidedi/builder.rb +23 -0
  48. data/lib/stupidedi/color.rb +93 -0
  49. data/lib/stupidedi/config/code_list_config.rb +42 -0
  50. data/lib/stupidedi/config/editor_config.rb +51 -0
  51. data/lib/stupidedi/config/functional_group_config.rb +62 -0
  52. data/lib/stupidedi/config/interchange_config.rb +79 -0
  53. data/lib/stupidedi/config/transaction_set_config.rb +91 -0
  54. data/lib/stupidedi/config.rb +101 -0
  55. data/lib/stupidedi/editor/00501.rb +341 -0
  56. data/lib/stupidedi/editor/005010/N2.rb +0 -0
  57. data/lib/stupidedi/editor/005010/N3.rb +0 -0
  58. data/lib/stupidedi/editor/005010/N4.rb +63 -0
  59. data/lib/stupidedi/editor/005010/NM1.rb +0 -0
  60. data/lib/stupidedi/editor/005010.rb +469 -0
  61. data/lib/stupidedi/editor/X222-HC837.rb +195 -0
  62. data/lib/stupidedi/editor/abstract_ed.rb +36 -0
  63. data/lib/stupidedi/editor/claim_ack.rb +9 -0
  64. data/lib/stupidedi/editor/implementation_ack.rb +213 -0
  65. data/lib/stupidedi/editor/interchange_ack.rb +9 -0
  66. data/lib/stupidedi/editor/result.rb +100 -0
  67. data/lib/stupidedi/editor/result_set.rb +69 -0
  68. data/lib/stupidedi/editor/transaction_set_ed.rb +275 -0
  69. data/lib/stupidedi/editor/transmission_ed.rb +90 -0
  70. data/lib/stupidedi/editor.rb +37 -0
  71. data/lib/stupidedi/either.rb +287 -0
  72. data/lib/stupidedi/exceptions/invalid_element_error.rb +8 -0
  73. data/lib/stupidedi/exceptions/invalid_schema_error.rb +8 -0
  74. data/lib/stupidedi/exceptions/output_error.rb +8 -0
  75. data/lib/stupidedi/exceptions/parse_error.rb +8 -0
  76. data/lib/stupidedi/exceptions/stupidedi_error.rb +8 -0
  77. data/lib/stupidedi/exceptions/tokenize_error.rb +8 -0
  78. data/lib/stupidedi/exceptions/zipper_error.rb +8 -0
  79. data/lib/stupidedi/exceptions.rb +11 -0
  80. data/lib/stupidedi/guides/005010/X214-HN277.rb +409 -0
  81. data/lib/stupidedi/guides/005010/X221-HP835.rb +613 -0
  82. data/lib/stupidedi/guides/005010/X221A1-HP835.rb +613 -0
  83. data/lib/stupidedi/guides/005010/X222-HC837P.rb +2291 -0
  84. data/lib/stupidedi/guides/005010/X222A1-HC837P.rb +2297 -0
  85. data/lib/stupidedi/guides/005010/X231-FA999.rb +123 -0
  86. data/lib/stupidedi/guides/005010/X231A1-FA999.rb +119 -0
  87. data/lib/stupidedi/guides/005010/element_reqs.rb +38 -0
  88. data/lib/stupidedi/guides/005010/guide_builder.rb +180 -0
  89. data/lib/stupidedi/guides/005010/segment_reqs.rb +32 -0
  90. data/lib/stupidedi/guides/005010.rb +64 -0
  91. data/lib/stupidedi/guides.rb +5 -0
  92. data/lib/stupidedi/inspect.rb +26 -0
  93. data/lib/stupidedi/reader/input/abstract_input.rb +133 -0
  94. data/lib/stupidedi/reader/input/delegated_input.rb +111 -0
  95. data/lib/stupidedi/reader/input/file_input.rb +155 -0
  96. data/lib/stupidedi/reader/input.rb +30 -0
  97. data/lib/stupidedi/reader/position.rb +69 -0
  98. data/lib/stupidedi/reader/result.rb +168 -0
  99. data/lib/stupidedi/reader/segment_dict.rb +175 -0
  100. data/lib/stupidedi/reader/separators.rb +85 -0
  101. data/lib/stupidedi/reader/stream_reader.rb +172 -0
  102. data/lib/stupidedi/reader/token_reader.rb +466 -0
  103. data/lib/stupidedi/reader/tokens/component_element_tok.rb +56 -0
  104. data/lib/stupidedi/reader/tokens/composite_element_tok.rb +64 -0
  105. data/lib/stupidedi/reader/tokens/repeated_element_tok.rb +64 -0
  106. data/lib/stupidedi/reader/tokens/segment_tok.rb +51 -0
  107. data/lib/stupidedi/reader/tokens/simple_element_tok.rb +63 -0
  108. data/lib/stupidedi/reader.rb +121 -0
  109. data/lib/stupidedi/schema/abstract_def.rb +74 -0
  110. data/lib/stupidedi/schema/abstract_use.rb +73 -0
  111. data/lib/stupidedi/schema/code_list.rb +94 -0
  112. data/lib/stupidedi/schema/element_def.rb +173 -0
  113. data/lib/stupidedi/schema/element_req.rb +56 -0
  114. data/lib/stupidedi/schema/element_use.rb +251 -0
  115. data/lib/stupidedi/schema/functional_group_def.rb +114 -0
  116. data/lib/stupidedi/schema/interchange_def.rb +93 -0
  117. data/lib/stupidedi/schema/loop_def.rb +152 -0
  118. data/lib/stupidedi/schema/repeat_count.rb +85 -0
  119. data/lib/stupidedi/schema/segment_def.rb +108 -0
  120. data/lib/stupidedi/schema/segment_req.rb +43 -0
  121. data/lib/stupidedi/schema/segment_use.rb +98 -0
  122. data/lib/stupidedi/schema/syntax_note.rb +63 -0
  123. data/lib/stupidedi/schema/table_def.rb +139 -0
  124. data/lib/stupidedi/schema/transaction_set_def.rb +88 -0
  125. data/lib/stupidedi/schema.rb +28 -0
  126. data/lib/stupidedi/sets/absolute_set.rb +297 -0
  127. data/lib/stupidedi/sets/abstract_set.rb +174 -0
  128. data/lib/stupidedi/sets/null_set.rb +125 -0
  129. data/lib/stupidedi/sets/relative_complement.rb +137 -0
  130. data/lib/stupidedi/sets/relative_set.rb +269 -0
  131. data/lib/stupidedi/sets/universal_set.rb +104 -0
  132. data/lib/stupidedi/sets.rb +57 -0
  133. data/lib/stupidedi/tail_call.rb +109 -0
  134. data/lib/stupidedi/thread_local.rb +174 -0
  135. data/lib/stupidedi/values/abstract_element_val.rb +19 -0
  136. data/lib/stupidedi/values/abstract_val.rb +130 -0
  137. data/lib/stupidedi/values/composite_element_val.rb +95 -0
  138. data/lib/stupidedi/values/functional_group_val.rb +102 -0
  139. data/lib/stupidedi/values/interchange_val.rb +86 -0
  140. data/lib/stupidedi/values/invalid_envelope_val.rb +61 -0
  141. data/lib/stupidedi/values/invalid_segment_val.rb +78 -0
  142. data/lib/stupidedi/values/loop_val.rb +70 -0
  143. data/lib/stupidedi/values/repeated_element_val.rb +105 -0
  144. data/lib/stupidedi/values/segment_val.rb +104 -0
  145. data/lib/stupidedi/values/segment_val_group.rb +20 -0
  146. data/lib/stupidedi/values/simple_element_val.rb +80 -0
  147. data/lib/stupidedi/values/table_val.rb +66 -0
  148. data/lib/stupidedi/values/transaction_set_val.rb +66 -0
  149. data/lib/stupidedi/values/transmission_val.rb +52 -0
  150. data/lib/stupidedi/values.rb +21 -0
  151. data/lib/stupidedi/version.rb +3 -0
  152. data/lib/stupidedi/versions/functional_groups/004010/element_defs.rb +54 -0
  153. data/lib/stupidedi/versions/functional_groups/004010/element_reqs.rb +18 -0
  154. data/lib/stupidedi/versions/functional_groups/004010/element_types/date_val.rb +527 -0
  155. data/lib/stupidedi/versions/functional_groups/004010/element_types/fixnum_val.rb +335 -0
  156. data/lib/stupidedi/versions/functional_groups/004010/element_types/float_val.rb +299 -0
  157. data/lib/stupidedi/versions/functional_groups/004010/element_types/identifier_val.rb +287 -0
  158. data/lib/stupidedi/versions/functional_groups/004010/element_types/string_val.rb +338 -0
  159. data/lib/stupidedi/versions/functional_groups/004010/element_types/time_val.rb +309 -0
  160. data/lib/stupidedi/versions/functional_groups/004010/element_types.rb +124 -0
  161. data/lib/stupidedi/versions/functional_groups/004010/functional_group_def.rb +30 -0
  162. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/GE.rb +20 -0
  163. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/GS.rb +27 -0
  164. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/SE.rb +20 -0
  165. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/ST.rb +20 -0
  166. data/lib/stupidedi/versions/functional_groups/004010/segment_defs.rb +23 -0
  167. data/lib/stupidedi/versions/functional_groups/004010/segment_reqs.rb +18 -0
  168. data/lib/stupidedi/versions/functional_groups/004010/syntax_notes.rb +174 -0
  169. data/lib/stupidedi/versions/functional_groups/004010.rb +38 -0
  170. data/lib/stupidedi/versions/functional_groups/005010/element_defs.rb +1405 -0
  171. data/lib/stupidedi/versions/functional_groups/005010/element_reqs.rb +18 -0
  172. data/lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb +577 -0
  173. data/lib/stupidedi/versions/functional_groups/005010/element_types/fixnum_val.rb +322 -0
  174. data/lib/stupidedi/versions/functional_groups/005010/element_types/float_val.rb +354 -0
  175. data/lib/stupidedi/versions/functional_groups/005010/element_types/identifier_val.rb +368 -0
  176. data/lib/stupidedi/versions/functional_groups/005010/element_types/operators.rb +117 -0
  177. data/lib/stupidedi/versions/functional_groups/005010/element_types/string_val.rb +398 -0
  178. data/lib/stupidedi/versions/functional_groups/005010/element_types/time_val.rb +327 -0
  179. data/lib/stupidedi/versions/functional_groups/005010/element_types.rb +132 -0
  180. data/lib/stupidedi/versions/functional_groups/005010/functional_group_def.rb +30 -0
  181. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/AK1.rb +21 -0
  182. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/AK2.rb +21 -0
  183. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/AK9.rb +28 -0
  184. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/AMT.rb +21 -0
  185. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/BHT.rb +24 -0
  186. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/BPR.rb +49 -0
  187. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CAS.rb +56 -0
  188. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CL1.rb +22 -0
  189. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CLM.rb +41 -0
  190. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CLP.rb +34 -0
  191. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CN1.rb +24 -0
  192. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CR1.rb +32 -0
  193. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CR2.rb +35 -0
  194. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CR3.rb +25 -0
  195. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CRC.rb +26 -0
  196. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CTP.rb +36 -0
  197. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CTX.rb +24 -0
  198. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CUR.rb +57 -0
  199. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DMG.rb +34 -0
  200. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DN1.rb +22 -0
  201. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DN2.rb +24 -0
  202. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DTM.rb +24 -0
  203. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DTP.rb +21 -0
  204. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/FRM.rb +25 -0
  205. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/GE.rb +20 -0
  206. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/GS.rb +27 -0
  207. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/HCP.rb +39 -0
  208. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/HI.rb +31 -0
  209. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/HL.rb +22 -0
  210. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/IK3.rb +22 -0
  211. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/IK4.rb +22 -0
  212. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/IK5.rb +24 -0
  213. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/K3.rb +21 -0
  214. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/LIN.rb +69 -0
  215. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/LQ.rb +22 -0
  216. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/LX.rb +19 -0
  217. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/MEA.rb +39 -0
  218. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/MIA.rb +45 -0
  219. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/MOA.rb +28 -0
  220. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N1.rb +24 -0
  221. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N2.rb +20 -0
  222. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N3.rb +20 -0
  223. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N4.rb +30 -0
  224. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/NM1.rb +35 -0
  225. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/NTE.rb +20 -0
  226. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/OI.rb +24 -0
  227. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PAT.rb +31 -0
  228. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PER.rb +32 -0
  229. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PLB.rb +40 -0
  230. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PRV.rb +26 -0
  231. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PS1.rb +21 -0
  232. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PWK.rb +30 -0
  233. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/QTY.rb +25 -0
  234. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/RDM.rb +23 -0
  235. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/REF.rb +23 -0
  236. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SBR.rb +28 -0
  237. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SE.rb +20 -0
  238. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/ST.rb +21 -0
  239. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/STC.rb +30 -0
  240. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SV1.rb +44 -0
  241. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SV2.rb +29 -0
  242. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SV3.rb +30 -0
  243. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SV5.rb +29 -0
  244. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SVC.rb +26 -0
  245. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SVD.rb +24 -0
  246. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/TOO.rb +21 -0
  247. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/TRN.rb +22 -0
  248. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/TS2.rb +40 -0
  249. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/TS3.rb +45 -0
  250. data/lib/stupidedi/versions/functional_groups/005010/segment_defs.rb +227 -0
  251. data/lib/stupidedi/versions/functional_groups/005010/segment_reqs.rb +18 -0
  252. data/lib/stupidedi/versions/functional_groups/005010/syntax_notes.rb +165 -0
  253. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/FA999.rb +38 -0
  254. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HB271.rb +85 -0
  255. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HC837.rb +163 -0
  256. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HI278.rb +64 -0
  257. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HN277.rb +74 -0
  258. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HP835.rb +68 -0
  259. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HR276.rb +57 -0
  260. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HS270.rb +53 -0
  261. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/RA820.rb +240 -0
  262. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs.rb +68 -0
  263. data/lib/stupidedi/versions/functional_groups/005010.rb +38 -0
  264. data/lib/stupidedi/versions/functional_groups.rb +8 -0
  265. data/lib/stupidedi/versions/interchanges/00401/element_defs.rb +224 -0
  266. data/lib/stupidedi/versions/interchanges/00401/interchange_def.rb +45 -0
  267. data/lib/stupidedi/versions/interchanges/00401/segment_defs/IEA.rb +20 -0
  268. data/lib/stupidedi/versions/interchanges/00401/segment_defs/ISA.rb +34 -0
  269. data/lib/stupidedi/versions/interchanges/00401/segment_defs/TA1.rb +23 -0
  270. data/lib/stupidedi/versions/interchanges/00401/segment_defs.rb +28 -0
  271. data/lib/stupidedi/versions/interchanges/00401.rb +23 -0
  272. data/lib/stupidedi/versions/interchanges/00501/element_defs.rb +269 -0
  273. data/lib/stupidedi/versions/interchanges/00501/interchange_def.rb +47 -0
  274. data/lib/stupidedi/versions/interchanges/00501/segment_defs/IEA.rb +20 -0
  275. data/lib/stupidedi/versions/interchanges/00501/segment_defs/ISA.rb +34 -0
  276. data/lib/stupidedi/versions/interchanges/00501/segment_defs/ISB.rb +18 -0
  277. data/lib/stupidedi/versions/interchanges/00501/segment_defs/ISE.rb +18 -0
  278. data/lib/stupidedi/versions/interchanges/00501/segment_defs/TA1.rb +23 -0
  279. data/lib/stupidedi/versions/interchanges/00501/segment_defs/TA3.rb +18 -0
  280. data/lib/stupidedi/versions/interchanges/00501/segment_defs.rb +37 -0
  281. data/lib/stupidedi/versions/interchanges/00501.rb +23 -0
  282. data/lib/stupidedi/versions/interchanges.rb +8 -0
  283. data/lib/stupidedi/versions.rb +6 -0
  284. data/lib/stupidedi/writer/claredi.rb +142 -0
  285. data/lib/stupidedi/writer/default.rb +124 -0
  286. data/lib/stupidedi/writer.rb +6 -0
  287. data/lib/stupidedi/zipper/abstract_cursor.rb +351 -0
  288. data/lib/stupidedi/zipper/dangling_cursor.rb +103 -0
  289. data/lib/stupidedi/zipper/edited_cursor.rb +157 -0
  290. data/lib/stupidedi/zipper/memoized_cursor.rb +131 -0
  291. data/lib/stupidedi/zipper/path.rb +124 -0
  292. data/lib/stupidedi/zipper/root_cursor.rb +120 -0
  293. data/lib/stupidedi/zipper.rb +25 -0
  294. data/lib/stupidedi.rb +66 -0
  295. data/spec/examples/integration/generating.example +551 -0
  296. data/spec/examples/integration/navigating.example +214 -0
  297. data/spec/examples/integration/parsing.example +445 -0
  298. data/spec/examples/ruby/array.example +476 -0
  299. data/spec/examples/ruby/blank.example +62 -0
  300. data/spec/examples/ruby/count.example +68 -0
  301. data/spec/examples/ruby/object.example +99 -0
  302. data/spec/examples/ruby/string.example +111 -0
  303. data/spec/examples/ruby/symbol.example +117 -0
  304. data/spec/examples/ruby/to_d.example +90 -0
  305. data/spec/examples/ruby/try.example +50 -0
  306. data/spec/examples/stupidedi/either.example +375 -0
  307. data/spec/examples/stupidedi/reader/failure.example +68 -0
  308. data/spec/examples/stupidedi/reader/input/delegated_input.example +292 -0
  309. data/spec/examples/stupidedi/reader/separators.example +73 -0
  310. data/spec/examples/stupidedi/reader/stream_reader.example +48 -0
  311. data/spec/examples/stupidedi/reader/success.example +34 -0
  312. data/spec/examples/stupidedi/reader/token_reader.example +775 -0
  313. data/spec/examples/stupidedi/reader.example +168 -0
  314. data/spec/examples/stupidedi/sets/absolute_set.example +1577 -0
  315. data/spec/examples/stupidedi/sets/null_set.example +2 -0
  316. data/spec/examples/stupidedi/sets/relative_set.example +2 -0
  317. data/spec/examples/stupidedi/sets/universal_set.example +1 -0
  318. data/spec/examples/stupidedi/versions/005010/element_types/an.example +201 -0
  319. data/spec/examples/stupidedi/versions/005010/element_types/dt.example +258 -0
  320. data/spec/examples/stupidedi/versions/005010/element_types/id.example +192 -0
  321. data/spec/examples/stupidedi/versions/005010/element_types/nn.example +177 -0
  322. data/spec/examples/stupidedi/versions/005010/element_types/r.example +178 -0
  323. data/spec/examples/stupidedi/versions/005010/element_types/tm.example +2 -0
  324. data/spec/examples/stupidedi/zipper/abstract_cursor.example +417 -0
  325. data/spec/examples/stupidedi/zipper.example +9 -0
  326. data/spec/fixtures/X186-AG824/1-bad.txt +21 -0
  327. data/spec/fixtures/X186-AG824/1-good.txt +17 -0
  328. data/spec/fixtures/X186-AG824/2-bad.txt +26 -0
  329. data/spec/fixtures/X186-AG824/2-good.txt +21 -0
  330. data/spec/fixtures/X186-AG824/3-bad.txt +87 -0
  331. data/spec/fixtures/X186-AG824/3-good.txt +61 -0
  332. data/spec/fixtures/X212-HN277/1-bad.txt +54 -0
  333. data/spec/fixtures/X212-HN277/1-good.txt +46 -0
  334. data/spec/fixtures/X212-HN277/2-bad.txt +37 -0
  335. data/spec/fixtures/X212-HN277/2-good.txt +29 -0
  336. data/spec/fixtures/X212-HN277/3-bad.txt +22 -0
  337. data/spec/fixtures/X212-HN277/3-good.txt +17 -0
  338. data/spec/fixtures/X212-HN277/4-bad.txt +30 -0
  339. data/spec/fixtures/X212-HN277/4-good.txt +24 -0
  340. data/spec/fixtures/X212-HR276/1-bad.txt +53 -0
  341. data/spec/fixtures/X212-HR276/1-good.txt +46 -0
  342. data/spec/fixtures/X212-HR276/2-bad.txt +45 -0
  343. data/spec/fixtures/X212-HR276/2-good.txt +38 -0
  344. data/spec/fixtures/X212-HR276/3-bad.txt +32 -0
  345. data/spec/fixtures/X212-HR276/3-good.txt +26 -0
  346. data/spec/fixtures/X212-HR276/4-bad.txt +32 -0
  347. data/spec/fixtures/X212-HR276/4-good.txt +26 -0
  348. data/spec/fixtures/X214-HN277/1-bad.txt +58 -0
  349. data/spec/fixtures/X214-HN277/1-good.txt +47 -0
  350. data/spec/fixtures/X214-HN277/2-bad.txt +34 -0
  351. data/spec/fixtures/X214-HN277/2-good.txt +22 -0
  352. data/spec/fixtures/X214-HN277/3-bad.txt +64 -0
  353. data/spec/fixtures/X214-HN277/3-good.txt +54 -0
  354. data/spec/fixtures/X214-HN277/4-bad.txt +77 -0
  355. data/spec/fixtures/X214-HN277/4-good.txt +63 -0
  356. data/spec/fixtures/X216-HI278/1-bad.txt +42 -0
  357. data/spec/fixtures/X216-HI278/1-good.txt +27 -0
  358. data/spec/fixtures/X216-HI278/2-bad.txt +43 -0
  359. data/spec/fixtures/X216-HI278/2-good.txt +29 -0
  360. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-1.txt +24 -0
  361. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-1_Clean.txt +20 -0
  362. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-2.txt +46 -0
  363. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-2_Clean.txt +30 -0
  364. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-3.txt +38 -0
  365. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-3_Clean.txt +24 -0
  366. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-4a.txt +39 -0
  367. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-4a_Clean.txt +24 -0
  368. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-4b.txt +43 -0
  369. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-4b_Clean.txt +25 -0
  370. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-5.txt +63 -0
  371. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-5_Clean.txt +41 -0
  372. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-6.txt +36 -0
  373. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-6_Clean.txt +20 -0
  374. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-1r.txt +34 -0
  375. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-1r_Clean.txt +23 -0
  376. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-2r.txt +46 -0
  377. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-2r_Clean.txt +31 -0
  378. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-3r.txt +44 -0
  379. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-3r_Clean.txt +26 -0
  380. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-4ar_Clean.txt +28 -0
  381. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-4br_Clean.txt +35 -0
  382. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-5r.txt +60 -0
  383. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-5r_Clean.txt +42 -0
  384. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-6r.txt +40 -0
  385. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-6r_Clean.txt +24 -0
  386. data/spec/fixtures/X218-RA820/1-bad.txt +31 -0
  387. data/spec/fixtures/X218-RA820/1-good.txt +25 -0
  388. data/spec/fixtures/X218-RA820/2-bad.txt +37 -0
  389. data/spec/fixtures/X218-RA820/2-good.txt +29 -0
  390. data/spec/fixtures/X218-RA820/3-bad.txt +29 -0
  391. data/spec/fixtures/X218-RA820/3-good.txt +23 -0
  392. data/spec/fixtures/X218-RA820/4-bad.txt +36 -0
  393. data/spec/fixtures/X218-RA820/4-good.txt +27 -0
  394. data/spec/fixtures/X220-BE834/1-bad.txt +35 -0
  395. data/spec/fixtures/X220-BE834/1-good.txt +29 -0
  396. data/spec/fixtures/X220-BE834/10-bad.txt +26 -0
  397. data/spec/fixtures/X220-BE834/10-good.txt +19 -0
  398. data/spec/fixtures/X220-BE834/2-bad.txt +31 -0
  399. data/spec/fixtures/X220-BE834/2-good.txt +23 -0
  400. data/spec/fixtures/X220-BE834/3-bad.txt +36 -0
  401. data/spec/fixtures/X220-BE834/3-good.txt +26 -0
  402. data/spec/fixtures/X220-BE834/4-bad.txt +27 -0
  403. data/spec/fixtures/X220-BE834/4-good.txt +21 -0
  404. data/spec/fixtures/X220-BE834/5-bad.txt +26 -0
  405. data/spec/fixtures/X220-BE834/5-good.txt +17 -0
  406. data/spec/fixtures/X220-BE834/6-bad.txt +25 -0
  407. data/spec/fixtures/X220-BE834/6-good.txt +20 -0
  408. data/spec/fixtures/X220-BE834/7-bad.txt +25 -0
  409. data/spec/fixtures/X220-BE834/7-good.txt +20 -0
  410. data/spec/fixtures/X220-BE834/8-bad.txt +25 -0
  411. data/spec/fixtures/X220-BE834/8-good.txt +20 -0
  412. data/spec/fixtures/X220-BE834/9-bad.txt +27 -0
  413. data/spec/fixtures/X220-BE834/9-good.txt +21 -0
  414. data/spec/fixtures/X221-HP835/1-bad.txt +58 -0
  415. data/spec/fixtures/X221-HP835/1-good.txt +40 -0
  416. data/spec/fixtures/X221-HP835/2-bad.txt +51 -0
  417. data/spec/fixtures/X221-HP835/2-good.txt +40 -0
  418. data/spec/fixtures/X221-HP835/3a-bad.txt +78 -0
  419. data/spec/fixtures/X221-HP835/3a-good.txt +49 -0
  420. data/spec/fixtures/X221-HP835/3b-bad.txt +60 -0
  421. data/spec/fixtures/X221-HP835/3b-good.txt +32 -0
  422. data/spec/fixtures/X221-HP835/3c-bad.txt +55 -0
  423. data/spec/fixtures/X221-HP835/3c-good.txt +34 -0
  424. data/spec/fixtures/X222-HC837/1-bad.txt +60 -0
  425. data/spec/fixtures/X222-HC837/1-good.txt +53 -0
  426. data/spec/fixtures/X222-HC837/10a-bad.txt +52 -0
  427. data/spec/fixtures/X222-HC837/10a-good.txt +40 -0
  428. data/spec/fixtures/X222-HC837/10b-bad.txt +99 -0
  429. data/spec/fixtures/X222-HC837/10b-good.txt +80 -0
  430. data/spec/fixtures/X222-HC837/10c-bad.txt +105 -0
  431. data/spec/fixtures/X222-HC837/10c-good.txt +80 -0
  432. data/spec/fixtures/X222-HC837/11-bad.txt +69 -0
  433. data/spec/fixtures/X222-HC837/11-good.txt +45 -0
  434. data/spec/fixtures/X222-HC837/12-bad.txt +73 -0
  435. data/spec/fixtures/X222-HC837/12-good.txt +51 -0
  436. data/spec/fixtures/X222-HC837/13-bad.txt +64 -0
  437. data/spec/fixtures/X222-HC837/13-good.txt +46 -0
  438. data/spec/fixtures/X222-HC837/3a-bad.txt +83 -0
  439. data/spec/fixtures/X222-HC837/3a-good.txt +59 -0
  440. data/spec/fixtures/X222-HC837/3b-bad.txt +97 -0
  441. data/spec/fixtures/X222-HC837/3b-good.txt +70 -0
  442. data/spec/fixtures/X222-HC837/3c-bad.txt +95 -0
  443. data/spec/fixtures/X222-HC837/3c-good.txt +74 -0
  444. data/spec/fixtures/X222-HC837/4-bad.txt +67 -0
  445. data/spec/fixtures/X222-HC837/4-good.txt +48 -0
  446. data/spec/fixtures/X222-HC837/5-bad.txt +73 -0
  447. data/spec/fixtures/X222-HC837/5-good.txt +60 -0
  448. data/spec/fixtures/X222-HC837/6-bad.txt +50 -0
  449. data/spec/fixtures/X222-HC837/6-good.txt +39 -0
  450. data/spec/fixtures/X222-HC837/7-bad.txt +93 -0
  451. data/spec/fixtures/X222-HC837/7-good.txt +78 -0
  452. data/spec/fixtures/X222-HC837/8-bad.txt +64 -0
  453. data/spec/fixtures/X222-HC837/8-good.txt +52 -0
  454. data/spec/fixtures/X222-HC837/9-bad.txt +56 -0
  455. data/spec/fixtures/X222-HC837/9-good.txt +38 -0
  456. data/spec/fixtures/X223-HC837/1-bad.txt +66 -0
  457. data/spec/fixtures/X223-HC837/1-good.txt +53 -0
  458. data/spec/fixtures/X223-HC837/2-bad.txt +69 -0
  459. data/spec/fixtures/X223-HC837/2-good.txt +60 -0
  460. data/spec/fixtures/X223-HC837/3-bad.txt +89 -0
  461. data/spec/fixtures/X223-HC837/3-good.txt +61 -0
  462. data/spec/fixtures/X223-HC837/4-bad.txt +60 -0
  463. data/spec/fixtures/X223-HC837/4-good.txt +40 -0
  464. data/spec/fixtures/X223-HC837/5-bad.txt +75 -0
  465. data/spec/fixtures/X223-HC837/5-good.txt +58 -0
  466. data/spec/fixtures/X224-HC837/1-bad.txt +54 -0
  467. data/spec/fixtures/X224-HC837/1-good.txt +44 -0
  468. data/spec/fixtures/X224-HC837/2a-bad.txt +52 -0
  469. data/spec/fixtures/X224-HC837/2a-good.txt +42 -0
  470. data/spec/fixtures/X224-HC837/2b-bad.txt +67 -0
  471. data/spec/fixtures/X224-HC837/2b-good.txt +52 -0
  472. data/spec/fixtures/X224-HC837/3-bad.txt +67 -0
  473. data/spec/fixtures/X224-HC837/3-good.txt +51 -0
  474. data/spec/fixtures/X224-HC837/4-bad.txt +49 -0
  475. data/spec/fixtures/X224-HC837/4-good.txt +40 -0
  476. data/spec/fixtures/X230-FA997/1-bad.txt +19 -0
  477. data/spec/fixtures/X230-FA997/1-good.txt +16 -0
  478. data/spec/fixtures/X231-FA999/1-bad.txt +20 -0
  479. data/spec/fixtures/X231-FA999/1-good.txt +20 -0
  480. data/spec/fixtures/X279-HB271/1-bad.txt +36 -0
  481. data/spec/fixtures/X279-HB271/1-good.txt +30 -0
  482. data/spec/fixtures/X279-HB271/2-bad.txt +22 -0
  483. data/spec/fixtures/X279-HB271/2-good.txt +16 -0
  484. data/spec/fixtures/X279-HB271/3-bad.txt +44 -0
  485. data/spec/fixtures/X279-HB271/3-good.txt +36 -0
  486. data/spec/fixtures/X279-HS270/1-bad.txt +29 -0
  487. data/spec/fixtures/X279-HS270/1-good.txt +23 -0
  488. data/spec/fixtures/X279-HS270/2-bad.txt +32 -0
  489. data/spec/fixtures/X279-HS270/2-good.txt +25 -0
  490. data/spec/spec_helper.rb +34 -0
  491. data/spec/support/fixtures.rb +26 -0
  492. data/spec/support/matchers/either_matchers.rb +26 -0
  493. data/spec/support/matchers/navigation_matchers.rb +247 -0
  494. data/spec/support/node.rb +41 -0
  495. data/spec/support/quickcheck/characters.rb +28 -0
  496. data/spec/support/quickcheck/property.rb +105 -0
  497. data/spec/support/quickcheck/serialized_edi.rb +399 -0
  498. data/spec/support/quickcheck.rb +302 -0
  499. data/spec/support/rcov.rb +34 -0
  500. metadata +577 -0
data/lib/ruby/array.rb ADDED
@@ -0,0 +1,164 @@
1
+ class Array
2
+
3
+ # Return the first item. Raises an `IndexError` if the Array is `empty?`.
4
+ #
5
+ # @example
6
+ # [1, 2, 3].head #=> 1
7
+ #
8
+ def head
9
+ raise IndexError, "head of empty list" if empty?
10
+ x, = self
11
+ x
12
+ end
13
+
14
+ # True if `#at` is defined for the given `n`
15
+ #
16
+ # @example
17
+ # [1, 2, 3].defined_at?(0) #=> true
18
+ # [].defined_at?(0) #=> false
19
+ #
20
+ def defined_at?(n)
21
+ n < length and -n <= length
22
+ end
23
+
24
+ # @group Selection
25
+ #############################################################################
26
+
27
+ # Selects all elements except the first.
28
+ #
29
+ # @example
30
+ # [1, 2, 3].tail #=> [2, 3]
31
+ # [1].tail #=> []
32
+ # [].tail #=> []
33
+ #
34
+ # @return [Array]
35
+ def tail
36
+ _, *xs = self
37
+ xs
38
+ end
39
+
40
+ # Selects all elements except the last `n` ones.
41
+ #
42
+ # @example
43
+ # [1, 2, 3].init #=> [1, 2]
44
+ # [1, 2, 3].init(2) #=> [1]
45
+ # [].tail #=> []
46
+ #
47
+ # @return [Array]
48
+ def init(n = 1)
49
+ raise ArgumentError, "n cannot be negative" if n < 0
50
+ slice(0..-(n + 1)) or []
51
+ end
52
+
53
+ # Select all elements except the first `n` ones.
54
+ #
55
+ # @example
56
+ # [1, 2, 3].drop(1) #=> [2, 3]
57
+ # [1, 3, 3].drop(2) #=> [3]
58
+ # [].drop(10) #=> []
59
+ #
60
+ # @return [Array]
61
+ def drop(n)
62
+ raise ArgumentError, "n cannot be negative" if n < 0
63
+ slice(n..-1) or []
64
+ end
65
+
66
+ # Select the first `n` elements.
67
+ #
68
+ # @example
69
+ # [1, 2, 3].take(2) #=> [1, 2]
70
+ # [1, 2, 3].take(0) #=> []
71
+ #
72
+ # @return [Array]
73
+ def take(n)
74
+ raise ArgumentError, "n cannot be negative" if n < 0
75
+ slice(0, n) or []
76
+ end
77
+
78
+ # Split the array in two at the given position.
79
+ #
80
+ # @example
81
+ # [1, 2, 3].split_at(2) #=> [[1,2], [3]]
82
+ # [1, 2, 3].split_at(0) #=> [[], [1,2,3]]
83
+ #
84
+ # @return [(Array, Array)]
85
+ def split_at(n)
86
+ n = length + n if n < 0
87
+ return take(n), drop(n)
88
+ end
89
+
90
+ # @endgroup
91
+ #############################################################################
92
+
93
+ # @group Filtering
94
+ #############################################################################
95
+
96
+ # Drops the longest prefix of elements that satisfy the predicate.
97
+ #
98
+ # @return [Array]
99
+ def drop_while(&block)
100
+ # This is in tail call form
101
+ if not empty? and yield(head)
102
+ tail.drop_while(&block)
103
+ else
104
+ self
105
+ end
106
+ end
107
+
108
+ # Drops the longest prefix of elements that do not satisfy the predicate.
109
+ #
110
+ # @return [Array]
111
+ def drop_until(&block)
112
+ # This is in tail call form
113
+ unless empty? or yield(head)
114
+ tail.drop_until(&block)
115
+ else
116
+ self
117
+ end
118
+ end
119
+
120
+ # Takes the longest prefix of elements that satisfy the predicate.
121
+ #
122
+ # @return [Array]
123
+ def take_while(accumulator = [], &block)
124
+ # This is in tail call form
125
+ if not empty? and yield(head)
126
+ tail.take_while(head.snoc(accumulator), &block)
127
+ else
128
+ accumulator
129
+ end
130
+ end
131
+
132
+ # Takes the longest prefix of elements that do not satisfy the predicate.
133
+ #
134
+ # @return [Array]
135
+ def take_until(accumulator = [], &block)
136
+ # This is in tail call form
137
+ unless empty? or yield(head)
138
+ tail.take_until(head.snoc(accumulator), &block)
139
+ else
140
+ accumulator
141
+ end
142
+ end
143
+
144
+ # Splits the array into prefix/suffix pair according to the predicate.
145
+ #
146
+ # @return [(Array, Array)]
147
+ def split_until(&block)
148
+ prefix = take_while(&block)
149
+ suffix = drop(prefix.length)
150
+ return prefix, suffix
151
+ end
152
+
153
+ # Splits the array into prefix/suffix pair according to the predicate.
154
+ #
155
+ # @return [(Array, Array)]
156
+ def split_when(&block)
157
+ prefix = take_until(&block)
158
+ suffix = drop(prefix.length)
159
+ return prefix, suffix
160
+ end
161
+
162
+ # @endgroup
163
+ #############################################################################
164
+ end
data/lib/ruby/blank.rb ADDED
@@ -0,0 +1,67 @@
1
+ class String
2
+
3
+ # True if the string is `empty?` or contains all whitespace
4
+ #
5
+ # @example
6
+ # "abc".blank? #=> false
7
+ # " ".blank? #=> true
8
+ # "".blank? #=> true
9
+ #
10
+ def blank?
11
+ self !~ /\S/
12
+ end
13
+
14
+ def present?
15
+ self =~ /\S/
16
+ end
17
+ end
18
+
19
+ module Enumerable
20
+
21
+ # True if the collection is `empty?`
22
+ #
23
+ # @example
24
+ # [1,2].blank? #=> false
25
+ # [].blank? #=> false
26
+ #
27
+ def blank?
28
+ empty?
29
+ end
30
+
31
+ def present?
32
+ not empty?
33
+ end
34
+ end
35
+
36
+ class NilClass
37
+
38
+ # Always `true`. Note this overrides {Object#blank?} which returns false.
39
+ #
40
+ # @example
41
+ # nil.blank? #=> true
42
+ #
43
+ def blank?
44
+ true
45
+ end
46
+
47
+ def present?
48
+ false
49
+ end
50
+ end
51
+
52
+ class Object
53
+
54
+ # Always `false`. Note that {NilClass#blank?} is overridden to return `true`
55
+ #
56
+ # @example
57
+ # false.blank? #=> false
58
+ # 100.blank? #=> false
59
+ #
60
+ def blank?
61
+ false
62
+ end
63
+
64
+ def present?
65
+ true
66
+ end
67
+ end
@@ -0,0 +1,35 @@
1
+ module Enumerable
2
+
3
+ # Count the number of elements that satisfy the predicate
4
+ #
5
+ # @example
6
+ # ["abc", "de", "fg", "hi"].count{|s| s.length == 2 } #=> 3
7
+ # ["a", "b", "a", "c", "a"].count("a") #=> 3
8
+ # [1, 3, 5, 9, 0].count #=> 5
9
+ #
10
+ # @return [Integer]
11
+ def count(*args)
12
+ if block_given?
13
+ inject(0){|n, e| yield(e) ? n + 1 : n }
14
+ elsif args.empty?
15
+ size
16
+ else
17
+ inject(0){|n, e| e == args.first ? n + 1 : n }
18
+ end
19
+ end
20
+
21
+ # Accumulate elements using the `+` method, optionally
22
+ # transforming them first using a block
23
+ #
24
+ # @example
25
+ # ["a", "b", "cd"].sum #=> "abcd"
26
+ # ["a", "b", "cd"].sum(&:length) #=> 4
27
+ #
28
+ def sum(&block)
29
+ if block_given?
30
+ tail.inject(yield(head)){|sum,e| sum + yield(e) }
31
+ else
32
+ tail.inject(head){|sum,e| sum + e }
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,33 @@
1
+ # require "continuation" if RUBY_VERSION >= "1.9"
2
+ #
3
+ # class Exception
4
+ # attr_accessor :continuation
5
+ #
6
+ # class NoContinuationError < StandardError; end
7
+ #
8
+ # def continue
9
+ # unless continuation.respond_to?(:call)
10
+ # raise NoContinuationError
11
+ # end
12
+ #
13
+ # continuation.call
14
+ # end
15
+ # end
16
+ #
17
+ # class Object
18
+ # # @private
19
+ # def raise(type = RuntimeError, message = nil, from = caller)
20
+ # exception = case type
21
+ # when String
22
+ # RuntimeError.exception(type)
23
+ # when Exception then type
24
+ # else type.exception(message)
25
+ # end
26
+ #
27
+ # callcc do |cc|
28
+ # exception.set_backtrace(from)
29
+ # exception.continuation = cc
30
+ # super exception
31
+ # end
32
+ # end
33
+ # end
data/lib/ruby/hash.rb ADDED
@@ -0,0 +1,4 @@
1
+ class Hash
2
+ alias defined_at? include?
3
+ alias at []
4
+ end
@@ -0,0 +1,26 @@
1
+ class Object
2
+
3
+ if RUBY_VERSION < "1.9"
4
+ module InstanceExecHelper; end
5
+ include InstanceExecHelper
6
+
7
+ # @see http://eigenclass.org/hiki/instance_exec
8
+ def instance_exec(*args, &block)
9
+ thread = Thread.current.object_id.abs
10
+ object = object_id.abs
11
+ mname = "__instance_exec_#{thread}_#{object}"
12
+ InstanceExecHelper.module_eval { define_method(mname, &block) }
13
+
14
+ begin
15
+ __send__(mname, *args)
16
+ ensure
17
+ begin
18
+ InstanceExecHelper.module_eval { remove_method(mname) }
19
+ rescue
20
+ end
21
+ end
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -0,0 +1,79 @@
1
+ class Module
2
+
3
+ # Creates an abstract method
4
+ #
5
+ # @example
6
+ # class Collection
7
+ # abstract :size
8
+ # abstract :add, :args => %w(item)
9
+ # end
10
+ #
11
+ # @return [void]
12
+ def abstract(name, *params)
13
+ if params.last.is_a?(Hash)
14
+ # abstract :method, :args => %w(a b c)
15
+ params = params.last[:args]
16
+ end
17
+
18
+ file, line, = Stupidedi.caller
19
+
20
+ if params.empty?
21
+ class_eval(<<-RUBY, file, line.to_i - 1)
22
+ def #{name}(*args)
23
+ raise NoMethodError,
24
+ "method \#{self.class.name}.#{name} is abstract"
25
+ end
26
+ RUBY
27
+ else
28
+ class_eval(<<-RUBY, file, line.to_i - 1)
29
+ def #{name}(*args)
30
+ raise NoMethodError,
31
+ "method \#{self.class.name}.#{name}(#{params.join(', ')}) is abstract"
32
+ end
33
+ RUBY
34
+ end
35
+ end
36
+
37
+ # Creates a method (or methods) that delegates messages to an instance
38
+ # variable or another instance method.
39
+ #
40
+ # @example
41
+ # class WrappedCollection
42
+ # delegate :size, :add, :to => :@wrapped
43
+ #
44
+ # def initialize(wrapped)
45
+ # @wrapped = wrapped
46
+ # end
47
+ # end
48
+ #
49
+ # @return [void]
50
+ def delegate(*params)
51
+ unless params.last.is_a?(Hash)
52
+ raise ArgumentError,
53
+ "last argument must be :to => ..."
54
+ end
55
+
56
+ methods = params.init
57
+ target = params.last.fetch(:to) or
58
+ raise ArgumentError,
59
+ ":to => ... cannot be nil"
60
+
61
+ file, line, = Stupidedi.caller
62
+
63
+ for m in methods
64
+ if m.to_s =~ /=$/
65
+ class_eval(<<-RUBY, file, line.to_i - 1)
66
+ def #{m}(value)
67
+ #{target}.#{m}(value)
68
+ end
69
+ RUBY
70
+ else
71
+ class_eval(<<-RUBY, file, line.to_i - 1)
72
+ def #{m}(*args, &block)
73
+ #{target}.#{m}(*args, &block)
74
+ end
75
+ RUBY
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,63 @@
1
+ class Object
2
+
3
+ # @group List Constructors
4
+ #############################################################################
5
+
6
+ # Prepend the item to the front of a new list
7
+ #
8
+ # @example
9
+ # 1.cons #=> [1]
10
+ # 1.cons(2.cons) #=> [1, 2]
11
+ # 1.cons([0, 0, 0]) #=> [1, 0, 0, 0]
12
+ #
13
+ # @return [Array]
14
+ def cons(array = [])
15
+ [self] + array
16
+ end
17
+
18
+ # Append the item to rear of a new list
19
+ #
20
+ # @example
21
+ # 1.snoc #=> [1]
22
+ # 1.snoc(2.snoc) #=> [2, 1]
23
+ # 1.snoc([0, 0, 0]) #=> [0, 0, 0, 1]
24
+ #
25
+ # @return [Array]
26
+ def snoc(array = [])
27
+ array + [self]
28
+ end
29
+
30
+ # @group Combinators
31
+ #############################################################################
32
+
33
+ # Yields `self` to a block argument
34
+ #
35
+ # @example
36
+ # nil.bind{|a| a.nil? } #=> true
37
+ # 100.bind{|a| a.nil? } #=> false
38
+ #
39
+ def bind
40
+ yield self
41
+ end
42
+
43
+ # Yields `self` to a side-effect block argument and return `self`
44
+ #
45
+ # @example:
46
+ # 100.bind{|a| puts "debug: #{a}" } #=> 100
47
+ #
48
+ # @return self
49
+ def tap
50
+ yield self
51
+ self
52
+ end
53
+
54
+ # @endgroup
55
+ #############################################################################
56
+
57
+ # Return the "eigenclass" where singleton methods reside
58
+ #
59
+ # @return [Class]
60
+ def eigenclass
61
+ class << self; self; end
62
+ end
63
+ end
@@ -0,0 +1,73 @@
1
+ class String
2
+
3
+ # Return the one-character string at the given index
4
+ #
5
+ # @example
6
+ # "abc".at(0) #=> "a"
7
+ # "abc".at(2) #=> "c"
8
+ #
9
+ # @param [Integer] n zero-based index of the character to read
10
+ #
11
+ # @return [String]
12
+ def at(n)
13
+ raise ArgumentError, "n must be positive" if n < 0
14
+ self[n, 1] unless n >= length
15
+ end
16
+
17
+ # Return the string with `n` characters removed from the front
18
+ #
19
+ # @example
20
+ # "abc".drop(0) #=> "abc"
21
+ # "abc".drop(2) #=> "c"
22
+ #
23
+ # @param [Integer] n number of characters to drop (`n > 0`)
24
+ #
25
+ # @return [String]
26
+ def drop(n)
27
+ raise ArgumentError, "n must be positive" if n < 0
28
+ (length >= n) ? self[n..-1] : ""
29
+ end
30
+
31
+ # Return the first `n` characters from the front
32
+ #
33
+ # @example
34
+ # "abc".take(0) #=> ""
35
+ # "abc".take(2) #=> "ab"
36
+ #
37
+ # @param [Integer] n number of characters to select (`n > 0`)
38
+ #
39
+ # @return [String]
40
+ def take(n)
41
+ raise ArgumentError, "n must be positive" if n < 0
42
+ self[0, n]
43
+ end
44
+
45
+ # Split the string in two at the given position
46
+ #
47
+ # @example
48
+ # "abc".split_at(0) #=> ["", "abc"]
49
+ # "abc".split_at(2) #=> ["ab", "c"]
50
+ #
51
+ # @param [Integer] n number of characters at which to split (`n > 0`)
52
+ #
53
+ # @return [Array(String, String)]
54
+ def split_at(n)
55
+ [take(n), drop(n)]
56
+ end
57
+
58
+ # True if the string is long enough such that {#at} is defined for the
59
+ # given `n`
60
+ #
61
+ # @example
62
+ # "abc".defined_at?(0) #=> true
63
+ # "abc".defined_at?(3) #=> false
64
+ def defined_at?(n)
65
+ n < length
66
+ end
67
+
68
+ # To make String compatible with the {Stupidedi::Reader::Input} interface,
69
+ # we have to define `#position`... shameful!
70
+ def position
71
+ nil
72
+ end
73
+ end
@@ -0,0 +1,24 @@
1
+ class Symbol
2
+
3
+ unless method_defined?(:to_proc)
4
+ # Returns a proc that calls self on the proc's parameter
5
+ #
6
+ # @example
7
+ # [1, 2, 3].map(&:-@) #=> [-1, -2, -3]
8
+ # [-1, -2, -3].map(&:abs) #=> [1, 2, 3]
9
+ #
10
+ def to_proc
11
+ lambda{|*args| args.head.__send__(self, *args.tail) }
12
+ end
13
+ end
14
+
15
+ # Calls self on the given receiver
16
+ #
17
+ # @example
18
+ # :to_s.call(100) #=> "100"
19
+ # :join.call([1,2,3], "-") #=> "1-2-3"
20
+ #
21
+ def call(receiver, *args)
22
+ receiver.__send__(self, *args)
23
+ end
24
+ end
data/lib/ruby/to_d.rb ADDED
@@ -0,0 +1,81 @@
1
+ require "bigdecimal"
2
+ require "rational"
3
+
4
+ class BigDecimal
5
+
6
+ # @return [BigDecimal] self
7
+ def to_d
8
+ self
9
+ end
10
+ end
11
+
12
+ class String
13
+ BIGDECIMAL = /\A[+-]? (?# optional leading sign )
14
+ (?:
15
+ (?:\d+\.?\d*) | (?# whole with optional decimal or ..)
16
+ (?:\d*?\.?\d+) ) (?# optional whole with decimal )
17
+ (?:E[+-]?\d+)? (?# optional exponent )
18
+ \Z/ix
19
+
20
+ # Converts the string to a BigDecimal after validating the format. If the
21
+ # string does not match the pattern for a valid number, an `ArgumentError`
22
+ # is raised.
23
+ #
24
+ # @example
25
+ # "1.0".to_d #=> BigDecimal("1.0")
26
+ #
27
+ # @return [BigDecimal]
28
+ def to_d
29
+ if BIGDECIMAL =~ self
30
+ BigDecimal(to_s)
31
+ else
32
+ raise ArgumentError, "#{inspect} is not a valid number"
33
+ end
34
+ end
35
+ end
36
+
37
+ class Integer
38
+
39
+ # Converts the integer to a BigDecimal
40
+ #
41
+ # @example
42
+ # 10.to_d #=> BigDecimal("10")
43
+ #
44
+ # @return [BigDecimal]
45
+ def to_d
46
+ BigDecimal(to_s)
47
+ end
48
+ end
49
+
50
+ class Rational
51
+
52
+ # Converts the rational to a BigDecimal
53
+ #
54
+ # @example
55
+ # Rational(3, 4).to_d #=> BigDecimal("3") / BigDecimal("4")
56
+ #
57
+ # @return [BigDecimal]
58
+ def to_d
59
+ numerator.to_d / denominator.to_d
60
+ end
61
+ end
62
+
63
+ class Float
64
+
65
+ # Raises a `TypeError` exception. The reason this method is defined at
66
+ # all is to produce a more meaningful error than `NoSuchMethod`.
67
+ #
68
+ # @return [void]
69
+ def to_d
70
+ # The problem is there isn't a way to know the correct precision,
71
+ # since there are (many) values that cannot be represented exactly
72
+ # using Floats. For instance, we can't assume which value is correct
73
+ #
74
+ # "%0.10f" % 1.8 #=> "1.8000000000"
75
+ # "%0.20f" % 1.8 #=> "1.80000000000000004441"
76
+ #
77
+ # The programmer should convert the Float to a String using whatever
78
+ # precision he chooses, and call #to_d on the String.
79
+ raise TypeError, "cannot convert Float to BigDecimal"
80
+ end
81
+ end
@@ -0,0 +1,33 @@
1
+ class Time
2
+ unless method_defined?(:to_date)
3
+ def to_date
4
+ Date.civil(year, month, day)
5
+ end
6
+ end
7
+
8
+ public :to_date
9
+ end
10
+
11
+ class String
12
+ unless method_defined?(:to_date)
13
+ def to_date
14
+ Date.parse(self)
15
+ end
16
+ end
17
+
18
+ public :to_date
19
+ end
20
+
21
+ class Date
22
+ unless method_defined?(:to_date)
23
+ def to_date
24
+ self
25
+ end
26
+ end
27
+
28
+ public :to_date
29
+
30
+ class << self
31
+ public :parse
32
+ end
33
+ end
@@ -0,0 +1,24 @@
1
+ class Time
2
+ unless method_defined?(:to_time)
3
+ # @return [Time]
4
+ def to_time
5
+ self
6
+ end
7
+ end
8
+
9
+ public :to_time
10
+
11
+ class << self
12
+ public :parse
13
+ end
14
+ end
15
+
16
+ class String
17
+ unless method_defined?(:to_time)
18
+ def to_time
19
+ Time.parse(self)
20
+ end
21
+ end
22
+
23
+ public :to_time
24
+ end