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.
- data/README.md +215 -0
- data/Rakefile +108 -0
- data/bin/edi-ed +71 -0
- data/bin/edi-pp +81 -0
- data/doc/Defining.md +0 -0
- data/doc/Generating.md +321 -0
- data/doc/LICENSE.md +0 -0
- data/doc/Navigating.md +645 -0
- data/doc/Parsing.md +0 -0
- data/doc/Serializing.md +7 -0
- data/doc/Tokenizing.md +0 -0
- data/doc/Validating.md +0 -0
- data/doc/design/Parser.md +0 -0
- data/doc/design/Reader.md +0 -0
- data/lib/ruby/array.rb +164 -0
- data/lib/ruby/blank.rb +67 -0
- data/lib/ruby/enumerable.rb +35 -0
- data/lib/ruby/exception.rb +33 -0
- data/lib/ruby/hash.rb +4 -0
- data/lib/ruby/instance_exec.rb +26 -0
- data/lib/ruby/module.rb +79 -0
- data/lib/ruby/object.rb +63 -0
- data/lib/ruby/string.rb +73 -0
- data/lib/ruby/symbol.rb +24 -0
- data/lib/ruby/to_d.rb +81 -0
- data/lib/ruby/to_date.rb +33 -0
- data/lib/ruby/to_time.rb +24 -0
- data/lib/ruby/try.rb +43 -0
- data/lib/stupidedi/blank_slate.rb +11 -0
- data/lib/stupidedi/builder/builder_dsl.rb +281 -0
- data/lib/stupidedi/builder/constraint_table.rb +418 -0
- data/lib/stupidedi/builder/generation.rb +112 -0
- data/lib/stupidedi/builder/instruction.rb +102 -0
- data/lib/stupidedi/builder/instruction_table.rb +204 -0
- data/lib/stupidedi/builder/navigation.rb +655 -0
- data/lib/stupidedi/builder/state_machine.rb +55 -0
- data/lib/stupidedi/builder/states/abstract_state.rb +332 -0
- data/lib/stupidedi/builder/states/failure_state.rb +69 -0
- data/lib/stupidedi/builder/states/functional_group_state.rb +97 -0
- data/lib/stupidedi/builder/states/initial_state.rb +63 -0
- data/lib/stupidedi/builder/states/interchange_state.rb +94 -0
- data/lib/stupidedi/builder/states/loop_state.rb +79 -0
- data/lib/stupidedi/builder/states/table_state.rb +96 -0
- data/lib/stupidedi/builder/states/transaction_set_state.rb +112 -0
- data/lib/stupidedi/builder/states/transmission_state.rb +59 -0
- data/lib/stupidedi/builder/tokenization.rb +196 -0
- data/lib/stupidedi/builder.rb +23 -0
- data/lib/stupidedi/color.rb +93 -0
- data/lib/stupidedi/config/code_list_config.rb +42 -0
- data/lib/stupidedi/config/editor_config.rb +51 -0
- data/lib/stupidedi/config/functional_group_config.rb +62 -0
- data/lib/stupidedi/config/interchange_config.rb +79 -0
- data/lib/stupidedi/config/transaction_set_config.rb +91 -0
- data/lib/stupidedi/config.rb +101 -0
- data/lib/stupidedi/editor/00501.rb +341 -0
- data/lib/stupidedi/editor/005010/N2.rb +0 -0
- data/lib/stupidedi/editor/005010/N3.rb +0 -0
- data/lib/stupidedi/editor/005010/N4.rb +63 -0
- data/lib/stupidedi/editor/005010/NM1.rb +0 -0
- data/lib/stupidedi/editor/005010.rb +469 -0
- data/lib/stupidedi/editor/X222-HC837.rb +195 -0
- data/lib/stupidedi/editor/abstract_ed.rb +36 -0
- data/lib/stupidedi/editor/claim_ack.rb +9 -0
- data/lib/stupidedi/editor/implementation_ack.rb +213 -0
- data/lib/stupidedi/editor/interchange_ack.rb +9 -0
- data/lib/stupidedi/editor/result.rb +100 -0
- data/lib/stupidedi/editor/result_set.rb +69 -0
- data/lib/stupidedi/editor/transaction_set_ed.rb +275 -0
- data/lib/stupidedi/editor/transmission_ed.rb +90 -0
- data/lib/stupidedi/editor.rb +37 -0
- data/lib/stupidedi/either.rb +287 -0
- data/lib/stupidedi/exceptions/invalid_element_error.rb +8 -0
- data/lib/stupidedi/exceptions/invalid_schema_error.rb +8 -0
- data/lib/stupidedi/exceptions/output_error.rb +8 -0
- data/lib/stupidedi/exceptions/parse_error.rb +8 -0
- data/lib/stupidedi/exceptions/stupidedi_error.rb +8 -0
- data/lib/stupidedi/exceptions/tokenize_error.rb +8 -0
- data/lib/stupidedi/exceptions/zipper_error.rb +8 -0
- data/lib/stupidedi/exceptions.rb +11 -0
- data/lib/stupidedi/guides/005010/X214-HN277.rb +409 -0
- data/lib/stupidedi/guides/005010/X221-HP835.rb +613 -0
- data/lib/stupidedi/guides/005010/X221A1-HP835.rb +613 -0
- data/lib/stupidedi/guides/005010/X222-HC837P.rb +2291 -0
- data/lib/stupidedi/guides/005010/X222A1-HC837P.rb +2297 -0
- data/lib/stupidedi/guides/005010/X231-FA999.rb +123 -0
- data/lib/stupidedi/guides/005010/X231A1-FA999.rb +119 -0
- data/lib/stupidedi/guides/005010/element_reqs.rb +38 -0
- data/lib/stupidedi/guides/005010/guide_builder.rb +180 -0
- data/lib/stupidedi/guides/005010/segment_reqs.rb +32 -0
- data/lib/stupidedi/guides/005010.rb +64 -0
- data/lib/stupidedi/guides.rb +5 -0
- data/lib/stupidedi/inspect.rb +26 -0
- data/lib/stupidedi/reader/input/abstract_input.rb +133 -0
- data/lib/stupidedi/reader/input/delegated_input.rb +111 -0
- data/lib/stupidedi/reader/input/file_input.rb +155 -0
- data/lib/stupidedi/reader/input.rb +30 -0
- data/lib/stupidedi/reader/position.rb +69 -0
- data/lib/stupidedi/reader/result.rb +168 -0
- data/lib/stupidedi/reader/segment_dict.rb +175 -0
- data/lib/stupidedi/reader/separators.rb +85 -0
- data/lib/stupidedi/reader/stream_reader.rb +172 -0
- data/lib/stupidedi/reader/token_reader.rb +466 -0
- data/lib/stupidedi/reader/tokens/component_element_tok.rb +56 -0
- data/lib/stupidedi/reader/tokens/composite_element_tok.rb +64 -0
- data/lib/stupidedi/reader/tokens/repeated_element_tok.rb +64 -0
- data/lib/stupidedi/reader/tokens/segment_tok.rb +51 -0
- data/lib/stupidedi/reader/tokens/simple_element_tok.rb +63 -0
- data/lib/stupidedi/reader.rb +121 -0
- data/lib/stupidedi/schema/abstract_def.rb +74 -0
- data/lib/stupidedi/schema/abstract_use.rb +73 -0
- data/lib/stupidedi/schema/code_list.rb +94 -0
- data/lib/stupidedi/schema/element_def.rb +173 -0
- data/lib/stupidedi/schema/element_req.rb +56 -0
- data/lib/stupidedi/schema/element_use.rb +251 -0
- data/lib/stupidedi/schema/functional_group_def.rb +114 -0
- data/lib/stupidedi/schema/interchange_def.rb +93 -0
- data/lib/stupidedi/schema/loop_def.rb +152 -0
- data/lib/stupidedi/schema/repeat_count.rb +85 -0
- data/lib/stupidedi/schema/segment_def.rb +108 -0
- data/lib/stupidedi/schema/segment_req.rb +43 -0
- data/lib/stupidedi/schema/segment_use.rb +98 -0
- data/lib/stupidedi/schema/syntax_note.rb +63 -0
- data/lib/stupidedi/schema/table_def.rb +139 -0
- data/lib/stupidedi/schema/transaction_set_def.rb +88 -0
- data/lib/stupidedi/schema.rb +28 -0
- data/lib/stupidedi/sets/absolute_set.rb +297 -0
- data/lib/stupidedi/sets/abstract_set.rb +174 -0
- data/lib/stupidedi/sets/null_set.rb +125 -0
- data/lib/stupidedi/sets/relative_complement.rb +137 -0
- data/lib/stupidedi/sets/relative_set.rb +269 -0
- data/lib/stupidedi/sets/universal_set.rb +104 -0
- data/lib/stupidedi/sets.rb +57 -0
- data/lib/stupidedi/tail_call.rb +109 -0
- data/lib/stupidedi/thread_local.rb +174 -0
- data/lib/stupidedi/values/abstract_element_val.rb +19 -0
- data/lib/stupidedi/values/abstract_val.rb +130 -0
- data/lib/stupidedi/values/composite_element_val.rb +95 -0
- data/lib/stupidedi/values/functional_group_val.rb +102 -0
- data/lib/stupidedi/values/interchange_val.rb +86 -0
- data/lib/stupidedi/values/invalid_envelope_val.rb +61 -0
- data/lib/stupidedi/values/invalid_segment_val.rb +78 -0
- data/lib/stupidedi/values/loop_val.rb +70 -0
- data/lib/stupidedi/values/repeated_element_val.rb +105 -0
- data/lib/stupidedi/values/segment_val.rb +104 -0
- data/lib/stupidedi/values/segment_val_group.rb +20 -0
- data/lib/stupidedi/values/simple_element_val.rb +80 -0
- data/lib/stupidedi/values/table_val.rb +66 -0
- data/lib/stupidedi/values/transaction_set_val.rb +66 -0
- data/lib/stupidedi/values/transmission_val.rb +52 -0
- data/lib/stupidedi/values.rb +21 -0
- data/lib/stupidedi/version.rb +3 -0
- data/lib/stupidedi/versions/functional_groups/004010/element_defs.rb +54 -0
- data/lib/stupidedi/versions/functional_groups/004010/element_reqs.rb +18 -0
- data/lib/stupidedi/versions/functional_groups/004010/element_types/date_val.rb +527 -0
- data/lib/stupidedi/versions/functional_groups/004010/element_types/fixnum_val.rb +335 -0
- data/lib/stupidedi/versions/functional_groups/004010/element_types/float_val.rb +299 -0
- data/lib/stupidedi/versions/functional_groups/004010/element_types/identifier_val.rb +287 -0
- data/lib/stupidedi/versions/functional_groups/004010/element_types/string_val.rb +338 -0
- data/lib/stupidedi/versions/functional_groups/004010/element_types/time_val.rb +309 -0
- data/lib/stupidedi/versions/functional_groups/004010/element_types.rb +124 -0
- data/lib/stupidedi/versions/functional_groups/004010/functional_group_def.rb +30 -0
- data/lib/stupidedi/versions/functional_groups/004010/segment_defs/GE.rb +20 -0
- data/lib/stupidedi/versions/functional_groups/004010/segment_defs/GS.rb +27 -0
- data/lib/stupidedi/versions/functional_groups/004010/segment_defs/SE.rb +20 -0
- data/lib/stupidedi/versions/functional_groups/004010/segment_defs/ST.rb +20 -0
- data/lib/stupidedi/versions/functional_groups/004010/segment_defs.rb +23 -0
- data/lib/stupidedi/versions/functional_groups/004010/segment_reqs.rb +18 -0
- data/lib/stupidedi/versions/functional_groups/004010/syntax_notes.rb +174 -0
- data/lib/stupidedi/versions/functional_groups/004010.rb +38 -0
- data/lib/stupidedi/versions/functional_groups/005010/element_defs.rb +1405 -0
- data/lib/stupidedi/versions/functional_groups/005010/element_reqs.rb +18 -0
- data/lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb +577 -0
- data/lib/stupidedi/versions/functional_groups/005010/element_types/fixnum_val.rb +322 -0
- data/lib/stupidedi/versions/functional_groups/005010/element_types/float_val.rb +354 -0
- data/lib/stupidedi/versions/functional_groups/005010/element_types/identifier_val.rb +368 -0
- data/lib/stupidedi/versions/functional_groups/005010/element_types/operators.rb +117 -0
- data/lib/stupidedi/versions/functional_groups/005010/element_types/string_val.rb +398 -0
- data/lib/stupidedi/versions/functional_groups/005010/element_types/time_val.rb +327 -0
- data/lib/stupidedi/versions/functional_groups/005010/element_types.rb +132 -0
- data/lib/stupidedi/versions/functional_groups/005010/functional_group_def.rb +30 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/AK1.rb +21 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/AK2.rb +21 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/AK9.rb +28 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/AMT.rb +21 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/BHT.rb +24 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/BPR.rb +49 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CAS.rb +56 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CL1.rb +22 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CLM.rb +41 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CLP.rb +34 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CN1.rb +24 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CR1.rb +32 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CR2.rb +35 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CR3.rb +25 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CRC.rb +26 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CTP.rb +36 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CTX.rb +24 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CUR.rb +57 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DMG.rb +34 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DN1.rb +22 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DN2.rb +24 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DTM.rb +24 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DTP.rb +21 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/FRM.rb +25 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/GE.rb +20 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/GS.rb +27 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/HCP.rb +39 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/HI.rb +31 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/HL.rb +22 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/IK3.rb +22 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/IK4.rb +22 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/IK5.rb +24 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/K3.rb +21 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/LIN.rb +69 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/LQ.rb +22 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/LX.rb +19 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/MEA.rb +39 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/MIA.rb +45 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/MOA.rb +28 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N1.rb +24 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N2.rb +20 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N3.rb +20 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N4.rb +30 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/NM1.rb +35 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/NTE.rb +20 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/OI.rb +24 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PAT.rb +31 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PER.rb +32 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PLB.rb +40 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PRV.rb +26 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PS1.rb +21 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PWK.rb +30 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/QTY.rb +25 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/RDM.rb +23 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/REF.rb +23 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SBR.rb +28 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SE.rb +20 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/ST.rb +21 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/STC.rb +30 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SV1.rb +44 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SV2.rb +29 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SV3.rb +30 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SV5.rb +29 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SVC.rb +26 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SVD.rb +24 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/TOO.rb +21 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/TRN.rb +22 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/TS2.rb +40 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs/TS3.rb +45 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_defs.rb +227 -0
- data/lib/stupidedi/versions/functional_groups/005010/segment_reqs.rb +18 -0
- data/lib/stupidedi/versions/functional_groups/005010/syntax_notes.rb +165 -0
- data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/FA999.rb +38 -0
- data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HB271.rb +85 -0
- data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HC837.rb +163 -0
- data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HI278.rb +64 -0
- data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HN277.rb +74 -0
- data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HP835.rb +68 -0
- data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HR276.rb +57 -0
- data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HS270.rb +53 -0
- data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/RA820.rb +240 -0
- data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs.rb +68 -0
- data/lib/stupidedi/versions/functional_groups/005010.rb +38 -0
- data/lib/stupidedi/versions/functional_groups.rb +8 -0
- data/lib/stupidedi/versions/interchanges/00401/element_defs.rb +224 -0
- data/lib/stupidedi/versions/interchanges/00401/interchange_def.rb +45 -0
- data/lib/stupidedi/versions/interchanges/00401/segment_defs/IEA.rb +20 -0
- data/lib/stupidedi/versions/interchanges/00401/segment_defs/ISA.rb +34 -0
- data/lib/stupidedi/versions/interchanges/00401/segment_defs/TA1.rb +23 -0
- data/lib/stupidedi/versions/interchanges/00401/segment_defs.rb +28 -0
- data/lib/stupidedi/versions/interchanges/00401.rb +23 -0
- data/lib/stupidedi/versions/interchanges/00501/element_defs.rb +269 -0
- data/lib/stupidedi/versions/interchanges/00501/interchange_def.rb +47 -0
- data/lib/stupidedi/versions/interchanges/00501/segment_defs/IEA.rb +20 -0
- data/lib/stupidedi/versions/interchanges/00501/segment_defs/ISA.rb +34 -0
- data/lib/stupidedi/versions/interchanges/00501/segment_defs/ISB.rb +18 -0
- data/lib/stupidedi/versions/interchanges/00501/segment_defs/ISE.rb +18 -0
- data/lib/stupidedi/versions/interchanges/00501/segment_defs/TA1.rb +23 -0
- data/lib/stupidedi/versions/interchanges/00501/segment_defs/TA3.rb +18 -0
- data/lib/stupidedi/versions/interchanges/00501/segment_defs.rb +37 -0
- data/lib/stupidedi/versions/interchanges/00501.rb +23 -0
- data/lib/stupidedi/versions/interchanges.rb +8 -0
- data/lib/stupidedi/versions.rb +6 -0
- data/lib/stupidedi/writer/claredi.rb +142 -0
- data/lib/stupidedi/writer/default.rb +124 -0
- data/lib/stupidedi/writer.rb +6 -0
- data/lib/stupidedi/zipper/abstract_cursor.rb +351 -0
- data/lib/stupidedi/zipper/dangling_cursor.rb +103 -0
- data/lib/stupidedi/zipper/edited_cursor.rb +157 -0
- data/lib/stupidedi/zipper/memoized_cursor.rb +131 -0
- data/lib/stupidedi/zipper/path.rb +124 -0
- data/lib/stupidedi/zipper/root_cursor.rb +120 -0
- data/lib/stupidedi/zipper.rb +25 -0
- data/lib/stupidedi.rb +66 -0
- data/spec/examples/integration/generating.example +551 -0
- data/spec/examples/integration/navigating.example +214 -0
- data/spec/examples/integration/parsing.example +445 -0
- data/spec/examples/ruby/array.example +476 -0
- data/spec/examples/ruby/blank.example +62 -0
- data/spec/examples/ruby/count.example +68 -0
- data/spec/examples/ruby/object.example +99 -0
- data/spec/examples/ruby/string.example +111 -0
- data/spec/examples/ruby/symbol.example +117 -0
- data/spec/examples/ruby/to_d.example +90 -0
- data/spec/examples/ruby/try.example +50 -0
- data/spec/examples/stupidedi/either.example +375 -0
- data/spec/examples/stupidedi/reader/failure.example +68 -0
- data/spec/examples/stupidedi/reader/input/delegated_input.example +292 -0
- data/spec/examples/stupidedi/reader/separators.example +73 -0
- data/spec/examples/stupidedi/reader/stream_reader.example +48 -0
- data/spec/examples/stupidedi/reader/success.example +34 -0
- data/spec/examples/stupidedi/reader/token_reader.example +775 -0
- data/spec/examples/stupidedi/reader.example +168 -0
- data/spec/examples/stupidedi/sets/absolute_set.example +1577 -0
- data/spec/examples/stupidedi/sets/null_set.example +2 -0
- data/spec/examples/stupidedi/sets/relative_set.example +2 -0
- data/spec/examples/stupidedi/sets/universal_set.example +1 -0
- data/spec/examples/stupidedi/versions/005010/element_types/an.example +201 -0
- data/spec/examples/stupidedi/versions/005010/element_types/dt.example +258 -0
- data/spec/examples/stupidedi/versions/005010/element_types/id.example +192 -0
- data/spec/examples/stupidedi/versions/005010/element_types/nn.example +177 -0
- data/spec/examples/stupidedi/versions/005010/element_types/r.example +178 -0
- data/spec/examples/stupidedi/versions/005010/element_types/tm.example +2 -0
- data/spec/examples/stupidedi/zipper/abstract_cursor.example +417 -0
- data/spec/examples/stupidedi/zipper.example +9 -0
- data/spec/fixtures/X186-AG824/1-bad.txt +21 -0
- data/spec/fixtures/X186-AG824/1-good.txt +17 -0
- data/spec/fixtures/X186-AG824/2-bad.txt +26 -0
- data/spec/fixtures/X186-AG824/2-good.txt +21 -0
- data/spec/fixtures/X186-AG824/3-bad.txt +87 -0
- data/spec/fixtures/X186-AG824/3-good.txt +61 -0
- data/spec/fixtures/X212-HN277/1-bad.txt +54 -0
- data/spec/fixtures/X212-HN277/1-good.txt +46 -0
- data/spec/fixtures/X212-HN277/2-bad.txt +37 -0
- data/spec/fixtures/X212-HN277/2-good.txt +29 -0
- data/spec/fixtures/X212-HN277/3-bad.txt +22 -0
- data/spec/fixtures/X212-HN277/3-good.txt +17 -0
- data/spec/fixtures/X212-HN277/4-bad.txt +30 -0
- data/spec/fixtures/X212-HN277/4-good.txt +24 -0
- data/spec/fixtures/X212-HR276/1-bad.txt +53 -0
- data/spec/fixtures/X212-HR276/1-good.txt +46 -0
- data/spec/fixtures/X212-HR276/2-bad.txt +45 -0
- data/spec/fixtures/X212-HR276/2-good.txt +38 -0
- data/spec/fixtures/X212-HR276/3-bad.txt +32 -0
- data/spec/fixtures/X212-HR276/3-good.txt +26 -0
- data/spec/fixtures/X212-HR276/4-bad.txt +32 -0
- data/spec/fixtures/X212-HR276/4-good.txt +26 -0
- data/spec/fixtures/X214-HN277/1-bad.txt +58 -0
- data/spec/fixtures/X214-HN277/1-good.txt +47 -0
- data/spec/fixtures/X214-HN277/2-bad.txt +34 -0
- data/spec/fixtures/X214-HN277/2-good.txt +22 -0
- data/spec/fixtures/X214-HN277/3-bad.txt +64 -0
- data/spec/fixtures/X214-HN277/3-good.txt +54 -0
- data/spec/fixtures/X214-HN277/4-bad.txt +77 -0
- data/spec/fixtures/X214-HN277/4-good.txt +63 -0
- data/spec/fixtures/X216-HI278/1-bad.txt +42 -0
- data/spec/fixtures/X216-HI278/1-good.txt +27 -0
- data/spec/fixtures/X216-HI278/2-bad.txt +43 -0
- data/spec/fixtures/X216-HI278/2-good.txt +29 -0
- data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-1.txt +24 -0
- data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-1_Clean.txt +20 -0
- data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-2.txt +46 -0
- data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-2_Clean.txt +30 -0
- data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-3.txt +38 -0
- data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-3_Clean.txt +24 -0
- data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-4a.txt +39 -0
- data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-4a_Clean.txt +24 -0
- data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-4b.txt +43 -0
- data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-4b_Clean.txt +25 -0
- data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-5.txt +63 -0
- data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-5_Clean.txt +41 -0
- data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-6.txt +36 -0
- data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-6_Clean.txt +20 -0
- data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-1r.txt +34 -0
- data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-1r_Clean.txt +23 -0
- data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-2r.txt +46 -0
- data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-2r_Clean.txt +31 -0
- data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-3r.txt +44 -0
- data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-3r_Clean.txt +26 -0
- data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-4ar_Clean.txt +28 -0
- data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-4br_Clean.txt +35 -0
- data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-5r.txt +60 -0
- data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-5r_Clean.txt +42 -0
- data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-6r.txt +40 -0
- data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-6r_Clean.txt +24 -0
- data/spec/fixtures/X218-RA820/1-bad.txt +31 -0
- data/spec/fixtures/X218-RA820/1-good.txt +25 -0
- data/spec/fixtures/X218-RA820/2-bad.txt +37 -0
- data/spec/fixtures/X218-RA820/2-good.txt +29 -0
- data/spec/fixtures/X218-RA820/3-bad.txt +29 -0
- data/spec/fixtures/X218-RA820/3-good.txt +23 -0
- data/spec/fixtures/X218-RA820/4-bad.txt +36 -0
- data/spec/fixtures/X218-RA820/4-good.txt +27 -0
- data/spec/fixtures/X220-BE834/1-bad.txt +35 -0
- data/spec/fixtures/X220-BE834/1-good.txt +29 -0
- data/spec/fixtures/X220-BE834/10-bad.txt +26 -0
- data/spec/fixtures/X220-BE834/10-good.txt +19 -0
- data/spec/fixtures/X220-BE834/2-bad.txt +31 -0
- data/spec/fixtures/X220-BE834/2-good.txt +23 -0
- data/spec/fixtures/X220-BE834/3-bad.txt +36 -0
- data/spec/fixtures/X220-BE834/3-good.txt +26 -0
- data/spec/fixtures/X220-BE834/4-bad.txt +27 -0
- data/spec/fixtures/X220-BE834/4-good.txt +21 -0
- data/spec/fixtures/X220-BE834/5-bad.txt +26 -0
- data/spec/fixtures/X220-BE834/5-good.txt +17 -0
- data/spec/fixtures/X220-BE834/6-bad.txt +25 -0
- data/spec/fixtures/X220-BE834/6-good.txt +20 -0
- data/spec/fixtures/X220-BE834/7-bad.txt +25 -0
- data/spec/fixtures/X220-BE834/7-good.txt +20 -0
- data/spec/fixtures/X220-BE834/8-bad.txt +25 -0
- data/spec/fixtures/X220-BE834/8-good.txt +20 -0
- data/spec/fixtures/X220-BE834/9-bad.txt +27 -0
- data/spec/fixtures/X220-BE834/9-good.txt +21 -0
- data/spec/fixtures/X221-HP835/1-bad.txt +58 -0
- data/spec/fixtures/X221-HP835/1-good.txt +40 -0
- data/spec/fixtures/X221-HP835/2-bad.txt +51 -0
- data/spec/fixtures/X221-HP835/2-good.txt +40 -0
- data/spec/fixtures/X221-HP835/3a-bad.txt +78 -0
- data/spec/fixtures/X221-HP835/3a-good.txt +49 -0
- data/spec/fixtures/X221-HP835/3b-bad.txt +60 -0
- data/spec/fixtures/X221-HP835/3b-good.txt +32 -0
- data/spec/fixtures/X221-HP835/3c-bad.txt +55 -0
- data/spec/fixtures/X221-HP835/3c-good.txt +34 -0
- data/spec/fixtures/X222-HC837/1-bad.txt +60 -0
- data/spec/fixtures/X222-HC837/1-good.txt +53 -0
- data/spec/fixtures/X222-HC837/10a-bad.txt +52 -0
- data/spec/fixtures/X222-HC837/10a-good.txt +40 -0
- data/spec/fixtures/X222-HC837/10b-bad.txt +99 -0
- data/spec/fixtures/X222-HC837/10b-good.txt +80 -0
- data/spec/fixtures/X222-HC837/10c-bad.txt +105 -0
- data/spec/fixtures/X222-HC837/10c-good.txt +80 -0
- data/spec/fixtures/X222-HC837/11-bad.txt +69 -0
- data/spec/fixtures/X222-HC837/11-good.txt +45 -0
- data/spec/fixtures/X222-HC837/12-bad.txt +73 -0
- data/spec/fixtures/X222-HC837/12-good.txt +51 -0
- data/spec/fixtures/X222-HC837/13-bad.txt +64 -0
- data/spec/fixtures/X222-HC837/13-good.txt +46 -0
- data/spec/fixtures/X222-HC837/3a-bad.txt +83 -0
- data/spec/fixtures/X222-HC837/3a-good.txt +59 -0
- data/spec/fixtures/X222-HC837/3b-bad.txt +97 -0
- data/spec/fixtures/X222-HC837/3b-good.txt +70 -0
- data/spec/fixtures/X222-HC837/3c-bad.txt +95 -0
- data/spec/fixtures/X222-HC837/3c-good.txt +74 -0
- data/spec/fixtures/X222-HC837/4-bad.txt +67 -0
- data/spec/fixtures/X222-HC837/4-good.txt +48 -0
- data/spec/fixtures/X222-HC837/5-bad.txt +73 -0
- data/spec/fixtures/X222-HC837/5-good.txt +60 -0
- data/spec/fixtures/X222-HC837/6-bad.txt +50 -0
- data/spec/fixtures/X222-HC837/6-good.txt +39 -0
- data/spec/fixtures/X222-HC837/7-bad.txt +93 -0
- data/spec/fixtures/X222-HC837/7-good.txt +78 -0
- data/spec/fixtures/X222-HC837/8-bad.txt +64 -0
- data/spec/fixtures/X222-HC837/8-good.txt +52 -0
- data/spec/fixtures/X222-HC837/9-bad.txt +56 -0
- data/spec/fixtures/X222-HC837/9-good.txt +38 -0
- data/spec/fixtures/X223-HC837/1-bad.txt +66 -0
- data/spec/fixtures/X223-HC837/1-good.txt +53 -0
- data/spec/fixtures/X223-HC837/2-bad.txt +69 -0
- data/spec/fixtures/X223-HC837/2-good.txt +60 -0
- data/spec/fixtures/X223-HC837/3-bad.txt +89 -0
- data/spec/fixtures/X223-HC837/3-good.txt +61 -0
- data/spec/fixtures/X223-HC837/4-bad.txt +60 -0
- data/spec/fixtures/X223-HC837/4-good.txt +40 -0
- data/spec/fixtures/X223-HC837/5-bad.txt +75 -0
- data/spec/fixtures/X223-HC837/5-good.txt +58 -0
- data/spec/fixtures/X224-HC837/1-bad.txt +54 -0
- data/spec/fixtures/X224-HC837/1-good.txt +44 -0
- data/spec/fixtures/X224-HC837/2a-bad.txt +52 -0
- data/spec/fixtures/X224-HC837/2a-good.txt +42 -0
- data/spec/fixtures/X224-HC837/2b-bad.txt +67 -0
- data/spec/fixtures/X224-HC837/2b-good.txt +52 -0
- data/spec/fixtures/X224-HC837/3-bad.txt +67 -0
- data/spec/fixtures/X224-HC837/3-good.txt +51 -0
- data/spec/fixtures/X224-HC837/4-bad.txt +49 -0
- data/spec/fixtures/X224-HC837/4-good.txt +40 -0
- data/spec/fixtures/X230-FA997/1-bad.txt +19 -0
- data/spec/fixtures/X230-FA997/1-good.txt +16 -0
- data/spec/fixtures/X231-FA999/1-bad.txt +20 -0
- data/spec/fixtures/X231-FA999/1-good.txt +20 -0
- data/spec/fixtures/X279-HB271/1-bad.txt +36 -0
- data/spec/fixtures/X279-HB271/1-good.txt +30 -0
- data/spec/fixtures/X279-HB271/2-bad.txt +22 -0
- data/spec/fixtures/X279-HB271/2-good.txt +16 -0
- data/spec/fixtures/X279-HB271/3-bad.txt +44 -0
- data/spec/fixtures/X279-HB271/3-good.txt +36 -0
- data/spec/fixtures/X279-HS270/1-bad.txt +29 -0
- data/spec/fixtures/X279-HS270/1-good.txt +23 -0
- data/spec/fixtures/X279-HS270/2-bad.txt +32 -0
- data/spec/fixtures/X279-HS270/2-good.txt +25 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/support/fixtures.rb +26 -0
- data/spec/support/matchers/either_matchers.rb +26 -0
- data/spec/support/matchers/navigation_matchers.rb +247 -0
- data/spec/support/node.rb +41 -0
- data/spec/support/quickcheck/characters.rb +28 -0
- data/spec/support/quickcheck/property.rb +105 -0
- data/spec/support/quickcheck/serialized_edi.rb +399 -0
- data/spec/support/quickcheck.rb +302 -0
- data/spec/support/rcov.rb +34 -0
- metadata +577 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
module Stupidedi
|
|
2
|
+
module Sets
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
# {AbsoluteSet} is a subset of a finite, fully-enumerated universe set. This
|
|
6
|
+
# means every possible value that can belong to the {AbsoluteSet} must
|
|
7
|
+
# already belong to the universe set, which is a _finite_ collection.
|
|
8
|
+
#
|
|
9
|
+
# This implementation is fairly efficient when computing set operations on
|
|
10
|
+
# two sets from the same universe, especially compared to {RelativeSet}.
|
|
11
|
+
# Efficiency is achieved by encoding each element in the universe's
|
|
12
|
+
# membership to the specific subset as a bitmask. Operations can then be
|
|
13
|
+
# performed using bitwise operations, instead of using operations on a Hash.
|
|
14
|
+
#
|
|
15
|
+
# This data type is not suitable for sets whose elements belong to an
|
|
16
|
+
# huge universe of possible values, as each set requires `2**|U|` bits of
|
|
17
|
+
# storage where `|U|` is the size of the universe. Operations on sets that
|
|
18
|
+
# belong to different universes do not currently attempt to merge the two
|
|
19
|
+
# universe sets, as this probably a better use case for {RelativeSet}.
|
|
20
|
+
#
|
|
21
|
+
class AbsoluteSet < AbstractSet
|
|
22
|
+
include Enumerable
|
|
23
|
+
|
|
24
|
+
# @return [Integer]
|
|
25
|
+
attr_reader :mask
|
|
26
|
+
|
|
27
|
+
# @return [Hash]
|
|
28
|
+
attr_reader :universe
|
|
29
|
+
|
|
30
|
+
def initialize(mask, universe)
|
|
31
|
+
@mask, @universe = mask, universe.freeze
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# @private
|
|
35
|
+
# @return [AbsoluteSet]
|
|
36
|
+
def copy(changes = {})
|
|
37
|
+
AbsoluteSet.new \
|
|
38
|
+
changes.fetch(:mask, @mask),
|
|
39
|
+
changes.fetch(:universe, @universe)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Returns a single element from the set, with no guarantees about which
|
|
43
|
+
# element. If the set is {#empty?}, the return value is undefined.
|
|
44
|
+
def first
|
|
45
|
+
@universe.each do |value, n|
|
|
46
|
+
unless @mask[n].zero?
|
|
47
|
+
return value
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Yields each element in the set to the implicit block argument
|
|
53
|
+
#
|
|
54
|
+
# @return [void]
|
|
55
|
+
def each
|
|
56
|
+
@universe.each do |value, n|
|
|
57
|
+
unless @mask[n].zero?
|
|
58
|
+
yield(value)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# (see AbstractSet#finite?)
|
|
64
|
+
def finite?
|
|
65
|
+
true
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# (see AbstractSet#empty?)
|
|
69
|
+
def empty?
|
|
70
|
+
@mask.zero?
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# (see AbstractSet#size)
|
|
74
|
+
def size
|
|
75
|
+
@universe.inject(0){|size, (value, n)| size + @mask[n] }
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# (see AbstractSet#replace)
|
|
79
|
+
def replace(other)
|
|
80
|
+
if other.is_a?(AbstractSet)
|
|
81
|
+
other
|
|
82
|
+
else
|
|
83
|
+
copy(:mask => as_mask(other, true))
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# (see AbstractSet#include?)
|
|
88
|
+
def include?(element)
|
|
89
|
+
if n = @universe.at(element)
|
|
90
|
+
# Same as (@mask & (1 << n)).zero? but potentially eliminates
|
|
91
|
+
# converting the intermediate computation to a Ruby value
|
|
92
|
+
not @mask[n].zero?
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# @group Set Operations
|
|
97
|
+
#########################################################################
|
|
98
|
+
|
|
99
|
+
# @return [AbsoluteSet]
|
|
100
|
+
def map
|
|
101
|
+
mask = 0
|
|
102
|
+
|
|
103
|
+
@universe.each do |value, n|
|
|
104
|
+
unless @mask[n].zero?
|
|
105
|
+
value = yield(value)
|
|
106
|
+
|
|
107
|
+
if m = @universe.at(value)
|
|
108
|
+
mask |= (1 << m)
|
|
109
|
+
else
|
|
110
|
+
raise "universe does not contain element #{value.inspect}"
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
copy(:mask => mask)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# @return [AbsoluteSet]
|
|
119
|
+
def select
|
|
120
|
+
mask = 0
|
|
121
|
+
|
|
122
|
+
@universe.each do |value, n|
|
|
123
|
+
unless @mask[n].zero? or not yield(value)
|
|
124
|
+
mask |= (1 << n)
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
copy(:mask => mask)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# @return [AbsoluteSet]
|
|
132
|
+
def reject
|
|
133
|
+
mask = 0
|
|
134
|
+
|
|
135
|
+
@universe.each do |value, n|
|
|
136
|
+
unless @mask[n].zero? or yield(value)
|
|
137
|
+
mask |= (1 << n)
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
copy(:mask => mask)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# (see AbstractSet#complement)
|
|
145
|
+
def complement
|
|
146
|
+
copy(:mask => ~@mask & ((1 << @universe.size) - 1))
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# (see AbstractSet#union)
|
|
150
|
+
def union(other)
|
|
151
|
+
if other.is_a?(AbsoluteSet) and other.universe.eql?(@universe)
|
|
152
|
+
copy(:mask => @mask | other.mask)
|
|
153
|
+
elsif other.is_a?(AbstractSet) and other.infinite?
|
|
154
|
+
other.union(self)
|
|
155
|
+
else
|
|
156
|
+
copy(:mask => @mask | as_mask(other, true))
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# (see AbstractSet#intersection)
|
|
161
|
+
def intersection(other)
|
|
162
|
+
if other.is_a?(AbsoluteSet) and other.universe.eql?(@universe)
|
|
163
|
+
copy(:mask => @mask & other.mask)
|
|
164
|
+
elsif other.is_a?(AbstractSet) and other.infinite?
|
|
165
|
+
other.intersection(self)
|
|
166
|
+
else
|
|
167
|
+
copy(:mask => @mask & as_mask(other, false))
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# (see AbstractSet#difference)
|
|
172
|
+
def difference(other)
|
|
173
|
+
if other.is_a?(AbsoluteSet) and other.universe.eql?(@universe)
|
|
174
|
+
copy(:mask => @mask & ~other.mask)
|
|
175
|
+
elsif other.is_a?(AbstractSet) and other.infinite?
|
|
176
|
+
intersection(other.complement)
|
|
177
|
+
else
|
|
178
|
+
copy(:mask => @mask & ~as_mask(other, false))
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# (see AbstractSet#symmetric_difference)
|
|
183
|
+
def symmetric_difference(other)
|
|
184
|
+
if other.is_a?(AbsoluteSet) and other.universe.eql?(@universe)
|
|
185
|
+
copy(:mask => @mask ^ other.mask)
|
|
186
|
+
elsif other.is_a?(AbstractSet) and other.infinite?
|
|
187
|
+
other.symmetric_difference(self)
|
|
188
|
+
else
|
|
189
|
+
copy(:mask => @mask ^ as_mask(other, true))
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# @group Set Ordering
|
|
194
|
+
#########################################################################
|
|
195
|
+
|
|
196
|
+
# (see AbstractSet#==)
|
|
197
|
+
def ==(other)
|
|
198
|
+
if other.is_a?(AbsoluteSet) and other.universe.eql?(@universe)
|
|
199
|
+
@mask == other.mask
|
|
200
|
+
elsif other.is_a?(AbstractSet) and other.infinite?
|
|
201
|
+
false
|
|
202
|
+
elsif other.is_a?(Enumerable)
|
|
203
|
+
@mask == as_mask(other, false) and size == other.size
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# @group Pretty Printing
|
|
208
|
+
#########################################################################
|
|
209
|
+
|
|
210
|
+
# @return [void]
|
|
211
|
+
def pretty_print(q)
|
|
212
|
+
q.text("AbsoluteSet[#{size}/#{@universe.size}]")
|
|
213
|
+
q.group(2, "(", ")") do
|
|
214
|
+
q.breakable ""
|
|
215
|
+
|
|
216
|
+
elements = to_a
|
|
217
|
+
elements.take(5).each do |e|
|
|
218
|
+
unless q.current_group.first?
|
|
219
|
+
q.text ","
|
|
220
|
+
q.breakable
|
|
221
|
+
end
|
|
222
|
+
q.pp e
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
if elements.length > 5
|
|
226
|
+
q.text ","
|
|
227
|
+
q.breakable
|
|
228
|
+
q.text "..."
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
# @return [String]
|
|
234
|
+
def inspect
|
|
235
|
+
"AbsoluteSet(#{to_a.map(&:inspect).join(', ')})"
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
# @endgroup
|
|
239
|
+
#########################################################################
|
|
240
|
+
|
|
241
|
+
private
|
|
242
|
+
|
|
243
|
+
# @return [Integer]
|
|
244
|
+
def as_mask(other, strict)
|
|
245
|
+
mask = 0
|
|
246
|
+
size = 0
|
|
247
|
+
|
|
248
|
+
if other.is_a?(AbstractSet) and @universe.size < other.size
|
|
249
|
+
@universe.each do |value, n|
|
|
250
|
+
if other.include?(value)
|
|
251
|
+
mask |= (1 << n)
|
|
252
|
+
size += 1
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
if strict and size < other.size
|
|
257
|
+
# other is not a subset of @universe
|
|
258
|
+
raise ArgumentError,
|
|
259
|
+
"universe does not contain all elements from #{other.inspect}"
|
|
260
|
+
end
|
|
261
|
+
else
|
|
262
|
+
# We might land here if other is an Array, since its probably
|
|
263
|
+
# much worse to repeatedly call Array#include? than it is to
|
|
264
|
+
# iterate the entire Array only once
|
|
265
|
+
other.each do |x|
|
|
266
|
+
if n = @universe.at(x)
|
|
267
|
+
mask |= (1 << n)
|
|
268
|
+
elsif strict
|
|
269
|
+
raise ArgumentError,
|
|
270
|
+
"universe does not contain element #{x.inspect}"
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
mask
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
class << AbsoluteSet
|
|
281
|
+
# @group Constructors
|
|
282
|
+
#########################################################################
|
|
283
|
+
|
|
284
|
+
# @return [AbsoluteSet]
|
|
285
|
+
def build(values)
|
|
286
|
+
count = -1
|
|
287
|
+
universe = values.inject({}){|hash, v| hash.update(v => (count += 1)) }
|
|
288
|
+
|
|
289
|
+
new((1 << (count + 1)) - 1, universe)
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
# @endgroup
|
|
293
|
+
#########################################################################
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
end
|
|
297
|
+
end
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
module Stupidedi
|
|
2
|
+
module Sets
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
# {AbstractSet} describes the common interface implemented by its concrete
|
|
6
|
+
# subclasses. The two main implementations are {RelativeSet} and
|
|
7
|
+
# {AbsoluteSet} which are each optimized for different kinds of set
|
|
8
|
+
# operations.
|
|
9
|
+
#
|
|
10
|
+
class AbstractSet
|
|
11
|
+
include Inspect
|
|
12
|
+
|
|
13
|
+
# True if the set includes the given `object`
|
|
14
|
+
abstract :include?, :args => %w(object)
|
|
15
|
+
|
|
16
|
+
# True if the set does not include the given `object`
|
|
17
|
+
def exclude?(object)
|
|
18
|
+
not include?(object)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# True if {#size} `< Infinity`
|
|
22
|
+
abstract :finite?
|
|
23
|
+
|
|
24
|
+
# True if {#size} `== 0`
|
|
25
|
+
abstract :empty?
|
|
26
|
+
|
|
27
|
+
# Returns the number of elements in the set
|
|
28
|
+
#
|
|
29
|
+
# @return [Numeric]
|
|
30
|
+
abstract :size
|
|
31
|
+
|
|
32
|
+
# Returns the `other` set, converting it to an {AbstractSet} if it isn't
|
|
33
|
+
# already.
|
|
34
|
+
#
|
|
35
|
+
# @return [AbstractSet]
|
|
36
|
+
abstract :replace, :args => %w(other)
|
|
37
|
+
|
|
38
|
+
# True if the set contains infinitely many elements
|
|
39
|
+
def infinite?
|
|
40
|
+
not finite?
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# @group Set Operations
|
|
44
|
+
#########################################################################
|
|
45
|
+
|
|
46
|
+
# (see AbstractSet#~)
|
|
47
|
+
# @abstract
|
|
48
|
+
abstract :complement
|
|
49
|
+
|
|
50
|
+
# (see AbstractSet#|)
|
|
51
|
+
# @abstract
|
|
52
|
+
abstract :union, :args => %w(other)
|
|
53
|
+
|
|
54
|
+
# (see AbstractSet#-)
|
|
55
|
+
# @abstract
|
|
56
|
+
abstract :difference, :args => %w(other)
|
|
57
|
+
|
|
58
|
+
# (see AbstractSet#^)
|
|
59
|
+
# @abstract
|
|
60
|
+
abstract :symmetric_difference, :args => %w(other)
|
|
61
|
+
|
|
62
|
+
# (see AbstractSet#&)
|
|
63
|
+
# @abstract
|
|
64
|
+
abstract :intersection, :args => %w(other)
|
|
65
|
+
|
|
66
|
+
# Computes the union of two sets: the set of elements in _either_ or
|
|
67
|
+
# _both_ sets
|
|
68
|
+
#
|
|
69
|
+
# @return [AbstractSet]
|
|
70
|
+
#
|
|
71
|
+
# @see http://en.wikipedia.org/wiki/Union_(set_theory)
|
|
72
|
+
def |(other) union(other) end
|
|
73
|
+
|
|
74
|
+
# (see AbstractSet#|)
|
|
75
|
+
def +(other) union(other) end
|
|
76
|
+
|
|
77
|
+
# Computes the difference of two sets: the set of elements elements in
|
|
78
|
+
# _this_ set and not the _other_.
|
|
79
|
+
#
|
|
80
|
+
# @return [AbstractSet]
|
|
81
|
+
#
|
|
82
|
+
# @see http://en.wikipedia.org/wiki/Set_difference#Relative_complement
|
|
83
|
+
def -(other) difference(other) end
|
|
84
|
+
|
|
85
|
+
# Computes the complement of the set: the set of elements _not_ in this
|
|
86
|
+
# set
|
|
87
|
+
#
|
|
88
|
+
# @return [AbstractSet]
|
|
89
|
+
#
|
|
90
|
+
# @see http://en.wikipedia.org/wiki/Complement_(set_theory)
|
|
91
|
+
def ~; complement end
|
|
92
|
+
|
|
93
|
+
# Computes the symmetric difference of two sets: the set of elements which
|
|
94
|
+
# are in _either_ of the two sets but _not_ in both.
|
|
95
|
+
#
|
|
96
|
+
# @return [AbstractSet]
|
|
97
|
+
#
|
|
98
|
+
# @see http://en.wikipedia.org/wiki/Symmetric_difference
|
|
99
|
+
def ^(other) symmetric_difference(other) end
|
|
100
|
+
|
|
101
|
+
# Computes the intersection of two sets: the set of elements common
|
|
102
|
+
# between _both_ sets.
|
|
103
|
+
#
|
|
104
|
+
# @return [AbstractSet]
|
|
105
|
+
#
|
|
106
|
+
# @see http://en.wikipedia.org/wiki/Intersection_(set_theory)
|
|
107
|
+
def &(other) intersection(other) end
|
|
108
|
+
|
|
109
|
+
# @endgroup
|
|
110
|
+
#########################################################################
|
|
111
|
+
|
|
112
|
+
# @group Set Ordering
|
|
113
|
+
#########################################################################
|
|
114
|
+
|
|
115
|
+
# True if every element in this set also belongs to the `other` set
|
|
116
|
+
#
|
|
117
|
+
# @see http://en.wikipedia.org/wiki/Subset
|
|
118
|
+
def subset?(other)
|
|
119
|
+
intersection(other) == self
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# True if this set is a subset of the `other` set and there exists at
|
|
123
|
+
# least one element in the `other` set that doesn't belong to this set
|
|
124
|
+
#
|
|
125
|
+
# @see http://en.wikipedia.org/wiki/Subset
|
|
126
|
+
def proper_subset?(other)
|
|
127
|
+
other.size > size and subset?(other)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# True if every element in the `other` set also belongs to this set
|
|
131
|
+
#
|
|
132
|
+
# @see http://en.wikipedia.org/wiki/Subset
|
|
133
|
+
def superset?(other)
|
|
134
|
+
intersection(other) == other
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# True if this set is a superset of the `other` set and there exists at
|
|
138
|
+
# least one element in this set that doesn't belong to the `other` set
|
|
139
|
+
#
|
|
140
|
+
# @see http://en.wikipedia.org/wiki/Subset
|
|
141
|
+
def proper_superset?(other)
|
|
142
|
+
other.size < size and superset?(other)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# True if this and the `other` set have no common elements
|
|
146
|
+
#
|
|
147
|
+
# @see http://en.wikipedia.org/wiki/Disjoint_sets
|
|
148
|
+
def disjoint?(other)
|
|
149
|
+
intersection(other).empty?
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# True if this and the `other` set have exactly the same elements
|
|
153
|
+
#
|
|
154
|
+
# @return [Boolean]
|
|
155
|
+
abstract :==, :args => %w(other)
|
|
156
|
+
|
|
157
|
+
# (see AbstractSet#proper_subset?)
|
|
158
|
+
def <(other) proper_subset?(other) end
|
|
159
|
+
|
|
160
|
+
# (see AbstractSet#proper_superset?)
|
|
161
|
+
def >(other) proper_superset?(other) end
|
|
162
|
+
|
|
163
|
+
# (see AbstractSet#subset?)
|
|
164
|
+
def <=(other) subset?(other) end
|
|
165
|
+
|
|
166
|
+
# (see AbstractSet#superset?)
|
|
167
|
+
def >=(other) superset?(other) end
|
|
168
|
+
|
|
169
|
+
# @endgroup
|
|
170
|
+
#########################################################################
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
end
|
|
174
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
module Stupidedi
|
|
4
|
+
module Sets
|
|
5
|
+
|
|
6
|
+
# @private
|
|
7
|
+
NullSet = Class.new(RelativeSet) do
|
|
8
|
+
|
|
9
|
+
def initialize
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# @return [NullSet]
|
|
13
|
+
def build
|
|
14
|
+
self
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Yields each element in the set to the implicit block argument. Since
|
|
18
|
+
# there are no elements, the block is never executed
|
|
19
|
+
#
|
|
20
|
+
# @return [void]
|
|
21
|
+
def each
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Returns an {Array} containing each element in this set. Since there are
|
|
25
|
+
# no elements, the {Array} is empty
|
|
26
|
+
#
|
|
27
|
+
# @return [Array]
|
|
28
|
+
def to_a
|
|
29
|
+
[]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @return false
|
|
33
|
+
def include?(other)
|
|
34
|
+
false
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @return true
|
|
38
|
+
def finite?
|
|
39
|
+
true
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# @return [Set] other
|
|
43
|
+
def replace(other)
|
|
44
|
+
Sets.build(other)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# @return 0
|
|
48
|
+
def size
|
|
49
|
+
0
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# @return true
|
|
53
|
+
def empty?
|
|
54
|
+
true
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# @group Set Operations
|
|
58
|
+
#########################################################################
|
|
59
|
+
|
|
60
|
+
# @return self
|
|
61
|
+
def map
|
|
62
|
+
self
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# @return self
|
|
66
|
+
def select
|
|
67
|
+
self
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# @return self
|
|
71
|
+
def reject
|
|
72
|
+
self
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# @return UniversalSet
|
|
76
|
+
def complement
|
|
77
|
+
# ¬∅ = U
|
|
78
|
+
UniversalSet.build
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# @return self
|
|
82
|
+
def intersection(other)
|
|
83
|
+
# ∅ ∩ A = ∅
|
|
84
|
+
self
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# @return [Set] other
|
|
88
|
+
def union(other)
|
|
89
|
+
# ∅ ∪ A = A
|
|
90
|
+
Sets.build(other)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# @return self
|
|
94
|
+
def difference(other)
|
|
95
|
+
# ∅ ∖ A = A
|
|
96
|
+
self
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# @return [Set] other
|
|
100
|
+
def symmetric_difference(other)
|
|
101
|
+
# ∅ ⊖ A = A
|
|
102
|
+
Sets.build(other)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# @group Set Ordering
|
|
106
|
+
#########################################################################
|
|
107
|
+
|
|
108
|
+
def ==(other)
|
|
109
|
+
eql?(other) or other.empty?
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# @group Pretty Printing
|
|
113
|
+
#########################################################################
|
|
114
|
+
|
|
115
|
+
# @return [String]
|
|
116
|
+
def inspect
|
|
117
|
+
"NullSet"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# @endgroup
|
|
121
|
+
#########################################################################
|
|
122
|
+
end.new
|
|
123
|
+
|
|
124
|
+
end
|
|
125
|
+
end
|