carats 0.3.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/ChangeLog +2 -0
- data/LICENSE +5 -0
- data/README +67 -0
- data/Reapfile +72 -0
- data/ToDo +24 -0
- data/bench/b_harray.rb +49 -0
- data/bench/b_range.rb +64 -0
- data/demo/ansicolor/cdiff.rb +20 -0
- data/demo/ansicolor/example.rb +82 -0
- data/demo/io-reactor/chatserver.rb +347 -0
- data/doc/classes/Array.html +172 -0
- data/doc/classes/BBCode.html +638 -0
- data/doc/classes/BinaryReader.html +675 -0
- data/doc/classes/Binding.html +223 -0
- data/doc/classes/ByteOrder.html +284 -0
- data/doc/classes/Class.html +189 -0
- data/doc/classes/Constant.html +785 -0
- data/doc/classes/Constant/CGS.html +609 -0
- data/doc/classes/Continuation.html +113 -0
- data/doc/classes/Coroutine.html +387 -0
- data/doc/classes/CountingSemaphore.html +337 -0
- data/doc/classes/CrossCase.html +561 -0
- data/doc/classes/DynamicMixin.html +185 -0
- data/doc/classes/EnumerableWithArgs.html +550 -0
- data/doc/classes/Expect.html +428 -0
- data/doc/classes/Expect/DefaultChain.html +113 -0
- data/doc/classes/Expect/SeparatedPattern.html +223 -0
- data/doc/classes/Expect/Timeout.html +167 -0
- data/doc/classes/Expect/UnmatchedMessage.html +160 -0
- data/doc/classes/FileList.html +833 -0
- data/doc/classes/FloatString.html +534 -0
- data/doc/classes/Functor.html +211 -0
- data/doc/classes/HArray.html +1872 -0
- data/doc/classes/HTML.html +328 -0
- data/doc/classes/Heap.html +683 -0
- data/doc/classes/Heap/EmptyHeapException.html +111 -0
- data/doc/classes/Heap/Max.html +176 -0
- data/doc/classes/Heap/Min.html +176 -0
- data/doc/classes/IO.html +108 -0
- data/doc/classes/IO/Reactor.html +790 -0
- data/doc/classes/IO/Redirect.html +289 -0
- data/doc/classes/Infinity.html +320 -0
- data/doc/classes/Interval.html +1014 -0
- data/doc/classes/InvalidNackError.html +161 -0
- data/doc/classes/Kernel.html +204 -0
- data/doc/classes/Lisp.html +1132 -0
- data/doc/classes/Lisp/DottedPair.html +379 -0
- data/doc/classes/Lisp/Format.html +178 -0
- data/doc/classes/Lisp/Format/ArgumentError.html +126 -0
- data/doc/classes/Lisp/Format/Directives.html +155 -0
- data/doc/classes/Lisp/Format/Directives/ArgJump.html +178 -0
- data/doc/classes/Lisp/Format/Directives/Ascii.html +119 -0
- data/doc/classes/Lisp/Format/Directives/BeginCaseConversion.html +185 -0
- data/doc/classes/Lisp/Format/Directives/BeginConditional.html +307 -0
- data/doc/classes/Lisp/Format/Directives/BeginIteration.html +338 -0
- data/doc/classes/Lisp/Format/Directives/Binary.html +157 -0
- data/doc/classes/Lisp/Format/Directives/Character.html +228 -0
- data/doc/classes/Lisp/Format/Directives/CharacterDirective.html +203 -0
- data/doc/classes/Lisp/Format/Directives/ClauseSeparator.html +166 -0
- data/doc/classes/Lisp/Format/Directives/Decimal.html +119 -0
- data/doc/classes/Lisp/Format/Directives/Directive.html +397 -0
- data/doc/classes/Lisp/Format/Directives/DollarFP.html +205 -0
- data/doc/classes/Lisp/Format/Directives/EndCaseConversion.html +174 -0
- data/doc/classes/Lisp/Format/Directives/EndConditional.html +159 -0
- data/doc/classes/Lisp/Format/Directives/EndIteration.html +163 -0
- data/doc/classes/Lisp/Format/Directives/ExpFP.html +252 -0
- data/doc/classes/Lisp/Format/Directives/FFFP.html +224 -0
- data/doc/classes/Lisp/Format/Directives/Factory.html +180 -0
- data/doc/classes/Lisp/Format/Directives/FreshLine.html +175 -0
- data/doc/classes/Lisp/Format/Directives/GeneralFP.html +265 -0
- data/doc/classes/Lisp/Format/Directives/Hexadecimal.html +157 -0
- data/doc/classes/Lisp/Format/Directives/Indirection.html +183 -0
- data/doc/classes/Lisp/Format/Directives/Literal.html +187 -0
- data/doc/classes/Lisp/Format/Directives/NewLine.html +158 -0
- data/doc/classes/Lisp/Format/Directives/NewPage.html +158 -0
- data/doc/classes/Lisp/Format/Directives/Number.html +243 -0
- data/doc/classes/Lisp/Format/Directives/Octal.html +157 -0
- data/doc/classes/Lisp/Format/Directives/Plural.html +177 -0
- data/doc/classes/Lisp/Format/Directives/Print.html +237 -0
- data/doc/classes/Lisp/Format/Directives/Radix.html +432 -0
- data/doc/classes/Lisp/Format/Directives/SExpression.html +157 -0
- data/doc/classes/Lisp/Format/Directives/SkipWhitespace.html +165 -0
- data/doc/classes/Lisp/Format/Directives/Tabulate.html +198 -0
- data/doc/classes/Lisp/Format/Directives/Tilde.html +158 -0
- data/doc/classes/Lisp/Format/Directives/UnknownDirectiveError.html +117 -0
- data/doc/classes/Lisp/Format/Formatter.html +193 -0
- data/doc/classes/Lisp/Format/IncompleteParameterError.html +119 -0
- data/doc/classes/Lisp/Format/IndexError.html +126 -0
- data/doc/classes/Lisp/Format/Lexer.html +479 -0
- data/doc/classes/Lisp/Format/MalformedError.html +119 -0
- data/doc/classes/Lisp/Format/MissingParameterError.html +119 -0
- data/doc/classes/Lisp/Format/ModifierError.html +119 -0
- data/doc/classes/Lisp/Format/Output.html +239 -0
- data/doc/classes/Lisp/Format/ParameterError.html +126 -0
- data/doc/classes/Lisp/Format/Parameters.html +123 -0
- data/doc/classes/Lisp/Format/Parameters/Argument.html +172 -0
- data/doc/classes/Lisp/Format/Parameters/ArgumentCount.html +159 -0
- data/doc/classes/Lisp/Format/Parameters/Character.html +119 -0
- data/doc/classes/Lisp/Format/Parameters/Default.html +120 -0
- data/doc/classes/Lisp/Format/Parameters/Integer.html +119 -0
- data/doc/classes/Lisp/Format/Parameters/Parameter.html +206 -0
- data/doc/classes/Lisp/Format/Parser.html +212 -0
- data/doc/classes/Lisp/Format/Positioned.html +166 -0
- data/doc/classes/Lisp/Format/State.html +455 -0
- data/doc/classes/Lisp/Format/SyntaxError.html +126 -0
- data/doc/classes/Method.html +274 -0
- data/doc/classes/Method/DuckHunter.html +281 -0
- data/doc/classes/Module.html +709 -0
- data/doc/classes/Multiton.html +284 -0
- data/doc/classes/Multiton/New.html +164 -0
- data/doc/classes/Multiton/Semi.html +155 -0
- data/doc/classes/NackClass.html +322 -0
- data/doc/classes/NilClass.html +231 -0
- data/doc/classes/NilComparable.html +179 -0
- data/doc/classes/NotCopyable.html +273 -0
- data/doc/classes/Object.html +261 -0
- data/doc/classes/OpenStructable.html +346 -0
- data/doc/classes/OrderedHash.html +939 -0
- data/doc/classes/Parser.html +515 -0
- data/doc/classes/Parser/Main.html +178 -0
- data/doc/classes/Parser/Marker.html +475 -0
- data/doc/classes/Parser/Registry.html +354 -0
- data/doc/classes/Parser/Token.html +399 -0
- data/doc/classes/Parser/UnitToken.html +222 -0
- data/doc/classes/Ref.html +230 -0
- data/doc/classes/SimpleStringIO.html +183 -0
- data/doc/classes/StaticHash.html +202 -0
- data/doc/classes/String.html +172 -0
- data/doc/classes/Struct.html +181 -0
- data/doc/classes/SuperStruct.html +382 -0
- data/doc/classes/Term.html +156 -0
- data/doc/classes/Term/ANSIColor.html +185 -0
- data/doc/classes/Text.html +138 -0
- data/doc/classes/Text/Soundex.html +222 -0
- data/doc/classes/TextTagIterator.html +911 -0
- data/doc/classes/Time.html +119 -0
- data/doc/classes/Time/Limit.html +303 -0
- data/doc/classes/Time/Limit/Dummy.html +181 -0
- data/doc/classes/Timer.html +351 -0
- data/doc/classes/TracePoint.html +532 -0
- data/doc/classes/Tuple.html +178 -0
- data/doc/classes/Uninheritable.html +213 -0
- data/doc/classes/Version.html +783 -0
- data/doc/created.rid +1 -0
- data/doc/files/LICENSE.html +113 -0
- data/doc/files/README.html +201 -0
- data/doc/files/lib/carat/1st_rb.html +107 -0
- data/doc/files/lib/carat/ansicolor_rb.html +146 -0
- data/doc/files/lib/carat/attr_rb.html +101 -0
- data/doc/files/lib/carat/bbcode_rb.html +152 -0
- data/doc/files/lib/carat/binaryreader_rb.html +114 -0
- data/doc/files/lib/carat/binding-of-caller_rb.html +108 -0
- data/doc/files/lib/carat/byteorder_rb.html +107 -0
- data/doc/files/lib/carat/constant_rb.html +167 -0
- data/doc/files/lib/carat/coroutine_rb.html +156 -0
- data/doc/files/lib/carat/crosscase_rb.html +224 -0
- data/doc/files/lib/carat/duckhunter_rb.html +165 -0
- data/doc/files/lib/carat/dynamic-mixin_rb.html +101 -0
- data/doc/files/lib/carat/enumerable-args_rb.html +140 -0
- data/doc/files/lib/carat/expect_rb.html +137 -0
- data/doc/files/lib/carat/filelist_rb.html +130 -0
- data/doc/files/lib/carat/floatstring_rb.html +126 -0
- data/doc/files/lib/carat/functor_rb.html +140 -0
- data/doc/files/lib/carat/harray_rb.html +128 -0
- data/doc/files/lib/carat/heap_rb.html +154 -0
- data/doc/files/lib/carat/html-helpers_rb.html +116 -0
- data/doc/files/lib/carat/infinity_rb.html +142 -0
- data/doc/files/lib/carat/init_rb.html +127 -0
- data/doc/files/lib/carat/interval_rb.html +162 -0
- data/doc/files/lib/carat/io-reactor_rb.html +211 -0
- data/doc/files/lib/carat/io-redirect_rb.html +132 -0
- data/doc/files/lib/carat/lisp-format_rb.html +187 -0
- data/doc/files/lib/carat/lisp_rb.html +152 -0
- data/doc/files/lib/carat/macro_rb.html +129 -0
- data/doc/files/lib/carat/multiton_rb.html +178 -0
- data/doc/files/lib/carat/nack_rb.html +193 -0
- data/doc/files/lib/carat/nil-comparable_rb.html +126 -0
- data/doc/files/lib/carat/nil-missing_rb.html +101 -0
- data/doc/files/lib/carat/notcopyable_rb.html +166 -0
- data/doc/files/lib/carat/orderedhash_rb.html +107 -0
- data/doc/files/lib/carat/ostructable_rb.html +157 -0
- data/doc/files/lib/carat/parser-old_rb.html +239 -0
- data/doc/files/lib/carat/parser_rb.html +244 -0
- data/doc/files/lib/carat/ref_rb.html +107 -0
- data/doc/files/lib/carat/semaphore_rb.html +132 -0
- data/doc/files/lib/carat/snapshot_rb.html +152 -0
- data/doc/files/lib/carat/soundex_rb.html +128 -0
- data/doc/files/lib/carat/sstruct_rb.html +142 -0
- data/doc/files/lib/carat/statichash_rb.html +150 -0
- data/doc/files/lib/carat/tagiter_rb.html +236 -0
- data/doc/files/lib/carat/timelimit_rb.html +136 -0
- data/doc/files/lib/carat/timer_rb.html +153 -0
- data/doc/files/lib/carat/tracepoint_rb.html +160 -0
- data/doc/files/lib/carat/tuple_rb.html +123 -0
- data/doc/files/lib/carat/uninheritable_rb.html +101 -0
- data/doc/files/lib/carat/version_rb.html +141 -0
- data/doc/fr_class_index.html +159 -0
- data/doc/fr_file_index.html +78 -0
- data/doc/fr_method_index.html +663 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/lib/carat-dev/README +11 -0
- data/lib/carat-dev/access-blocks/access_blocks.rb +42 -0
- data/lib/carat-dev/association/association.rb +70 -0
- data/lib/carat-dev/blankslate/blankslate.rb +51 -0
- data/lib/carat-dev/breakpoint.rb +518 -0
- data/lib/carat-dev/class-constructor/constructor_methods.rb +78 -0
- data/lib/carat-dev/class-constructor/tc_constructor.rb +35 -0
- data/lib/carat-dev/closecall/closecall-test.rb +39 -0
- data/lib/carat-dev/closecall/closecall.rb +101 -0
- data/lib/carat-dev/commandrunner/commandrunner.rb +100 -0
- data/lib/carat-dev/conditional/conditionals.rb +106 -0
- data/lib/carat-dev/daemon/daemon.rb +70 -0
- data/lib/carat-dev/detach/detach.rb +363 -0
- data/lib/carat-dev/detach/tc_detach.rb +57 -0
- data/lib/carat-dev/import-module/import-module-0.81.tar.gz +0 -0
- data/lib/carat-dev/import-module/import-module-0.81/LICENSE +1 -0
- data/lib/carat-dev/import-module/import-module-0.81/Makefile +11 -0
- data/lib/carat-dev/import-module/import-module-0.81/README +4 -0
- data/lib/carat-dev/import-module/import-module-0.81/dev-lib/import-module-hash.rb +49 -0
- data/lib/carat-dev/import-module/import-module-0.81/dev-lib/import-module-pip.rb +71 -0
- data/lib/carat-dev/import-module/import-module-0.81/dev-lib/import-module-unbound-method.rb +36 -0
- data/lib/carat-dev/import-module/import-module-0.81/doc/README-ja.html +293 -0
- data/lib/carat-dev/import-module/import-module-0.81/doc/README-ja.rd +306 -0
- data/lib/carat-dev/import-module/import-module-0.81/doc/README.html +290 -0
- data/lib/carat-dev/import-module/import-module-0.81/doc/README.rd +303 -0
- data/lib/carat-dev/import-module/import-module-0.81/doc/style.css +85 -0
- data/lib/carat-dev/import-module/import-module-0.81/install.rb +99 -0
- data/lib/carat-dev/import-module/import-module-0.81/lib/import-module-single-thread.rb +84 -0
- data/lib/carat-dev/import-module/import-module-0.81/lib/import-module.rb +493 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/Makefile +2 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/test +91 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/test-import-module.rb +936 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/test-import_scope.rb +33 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/test-scope_import.rb +33 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/test-time.rb +184 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/test.sh +91 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/time.rb +135 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/times-do.sh +10 -0
- data/lib/carat-dev/interface_work/SCRAP/i-contracts.rb +37 -0
- data/lib/carat-dev/interface_work/SCRAP/interface.rb +105 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0.zip +0 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/CHANGES +3 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/MANIFEST +15 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/README +32 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/doc/interface.rd +73 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/doc/interface.txt +94 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/install.rb +16 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/lib/interface.rb +50 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/test/tc_interface.rb +51 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/test/test.rb +29 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/test/test_instance.rb +24 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/test/test_sub.rb +29 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/test/test_unrequire.rb +28 -0
- data/lib/carat-dev/interface_work/contracts/contract.zip +0 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.html +376 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000001.html +23 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000002.html +18 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000003.html +19 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000004.html +29 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000005.html +18 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000006.html +18 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract/ContractError.html +142 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract/ContractException.html +153 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract/ContractMismatch.html +125 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Module.html +157 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Module.src/M000007.html +112 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/created.rid +1 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/files/lib/contract/assertions_rb.html +109 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/files/lib/contract/exception_rb.html +108 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/files/lib/contract/integration_rb.html +108 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/files/lib/contract/overrides_rb.html +109 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/files/lib/contract_rb.html +114 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/fr_class_index.html +31 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/fr_file_index.html +31 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/fr_method_index.html +33 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/index.html +24 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/rdoc-style.css +208 -0
- data/lib/carat-dev/interface_work/contracts/contract/lib/contract.rb +88 -0
- data/lib/carat-dev/interface_work/contracts/contract/lib/contract/assertions.rb +37 -0
- data/lib/carat-dev/interface_work/contracts/contract/lib/contract/exception.rb +92 -0
- data/lib/carat-dev/interface_work/contracts/contract/lib/contract/integration.rb +132 -0
- data/lib/carat-dev/interface_work/contracts/contract/lib/contract/overrides.rb +32 -0
- data/lib/carat-dev/interface_work/must.rb +37 -0
- data/lib/carat-dev/interface_work/type.rb +232 -0
- data/lib/carat-dev/main/tc_toplevel.rb +23 -0
- data/lib/carat-dev/main/toplevel.rb +33 -0
- data/lib/carat-dev/main/toplevel_test.rb +24 -0
- data/lib/carat-dev/misc/1.rb +40 -0
- data/lib/carat-dev/misc/misc.rb +44 -0
- data/lib/carat-dev/misc/sys.rb +186 -0
- data/lib/carat-dev/misc/temp.rb +1 -0
- data/lib/carat-dev/misc/utils.rb +518 -0
- data/lib/carat-dev/predicate/predicate.rb +109 -0
- data/lib/carat-dev/predicate/predicate_test.rb +67 -0
- data/lib/carat-dev/premshree.rb +40 -0
- data/lib/carat-dev/priority-queue/pqueue.rb +183 -0
- data/lib/carat-dev/priority-queue/priorityqueue.rb +84 -0
- data/lib/carat-dev/quaternion/quaternion.rb +529 -0
- data/lib/carat-dev/range.rb +259 -0
- data/lib/carat-dev/system/rubyinfo.rb +75 -0
- data/lib/carat-dev/system/system.rb +105 -0
- data/lib/carat-dev/tc_range.rb +118 -0
- data/lib/carat-dev/timer/timer-doc/classes/Timer.html +291 -0
- data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000001.html +26 -0
- data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000002.html +19 -0
- data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000003.html +18 -0
- data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000004.html +18 -0
- data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000005.html +21 -0
- data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000006.html +23 -0
- data/lib/carat-dev/timer/timer-doc/created.rid +1 -0
- data/lib/carat-dev/timer/timer-doc/files/timer_rb.html +144 -0
- data/lib/carat-dev/timer/timer-doc/fr_class_index.html +27 -0
- data/lib/carat-dev/timer/timer-doc/fr_file_index.html +27 -0
- data/lib/carat-dev/timer/timer-doc/fr_method_index.html +32 -0
- data/lib/carat-dev/timer/timer-doc/index.html +24 -0
- data/lib/carat-dev/timer/timer-doc/rdoc-style.css +208 -0
- data/lib/carat-dev/timer/timer.rb +160 -0
- data/lib/carat-dev/vars/vars.rb +62 -0
- data/lib/carat/1st.rb +58 -0
- data/lib/carat/ansicolor.rb +122 -0
- data/lib/carat/attr.rb +342 -0
- data/lib/carat/bbcode.rb +352 -0
- data/lib/carat/binaryreader.rb +170 -0
- data/lib/carat/binding-of-caller.rb +83 -0
- data/lib/carat/byteorder.rb +34 -0
- data/lib/carat/constant.rb +287 -0
- data/lib/carat/coroutine.rb +102 -0
- data/lib/carat/crosscase.rb +309 -0
- data/lib/carat/duckhunter.rb +158 -0
- data/lib/carat/dynamic-mixin.rb +71 -0
- data/lib/carat/enumerable-args.rb +125 -0
- data/lib/carat/expect.rb +192 -0
- data/lib/carat/filelist.rb +277 -0
- data/lib/carat/floatstring.rb +153 -0
- data/lib/carat/functor.rb +41 -0
- data/lib/carat/harray.rb +507 -0
- data/lib/carat/heap.rb +193 -0
- data/lib/carat/html-helpers.rb +82 -0
- data/lib/carat/infinity.rb +61 -0
- data/lib/carat/init.rb +33 -0
- data/lib/carat/interval.rb +248 -0
- data/lib/carat/io-reactor.rb +657 -0
- data/lib/carat/io-redirect.rb +99 -0
- data/lib/carat/lisp-format.rb +1832 -0
- data/lib/carat/lisp.rb +336 -0
- data/lib/carat/macro.rb +68 -0
- data/lib/carat/multiton.rb +153 -0
- data/lib/carat/nack.rb +115 -0
- data/lib/carat/nil-comparable.rb +67 -0
- data/lib/carat/nil-missing.rb +12 -0
- data/lib/carat/notcopyable.rb +68 -0
- data/lib/carat/orderedhash.rb +249 -0
- data/lib/carat/ostructable.rb +138 -0
- data/lib/carat/parser-old.rb +350 -0
- data/lib/carat/parser.rb +393 -0
- data/lib/carat/ref.rb +31 -0
- data/lib/carat/semaphore.rb +69 -0
- data/lib/carat/snapshot.rb +94 -0
- data/lib/carat/soundex.rb +104 -0
- data/lib/carat/sstruct.rb +223 -0
- data/lib/carat/statichash.rb +49 -0
- data/lib/carat/tagiter.rb +345 -0
- data/lib/carat/timelimit.rb +114 -0
- data/lib/carat/timer.rb +99 -0
- data/lib/carat/tracepoint.rb +154 -0
- data/lib/carat/tuple.rb +31 -0
- data/lib/carat/uninheritable.rb +68 -0
- data/lib/carat/version.rb +147 -0
- data/pub/doc/sstruct.txt +204 -0
- data/pub/doc/tagiter.html +145 -0
- data/setup.rb +1361 -0
- data/test/fixtures/filelist/testfile.txt +1 -0
- data/test/fixtures/filelist/testfile2.txt +1 -0
- data/test/tc_1st.rb +16 -0
- data/test/tc_ansicolor.rb +23 -0
- data/test/tc_attr.rb +46 -0
- data/test/tc_bbcode.rb +20 -0
- data/test/tc_binaryreader.rb +14 -0
- data/test/tc_binding_of_caller.rb +2 -0
- data/test/tc_byteorder.rb +41 -0
- data/test/tc_constant.rb +12 -0
- data/test/tc_coroutine.rb +50 -0
- data/test/tc_crosscase.rb +33 -0
- data/test/tc_duckhunter.rb +37 -0
- data/test/tc_dynamic-mixin.rb +66 -0
- data/test/tc_enumerable-args.rb +66 -0
- data/test/tc_expect.rb +83 -0
- data/test/tc_filelist.rb +17 -0
- data/test/tc_floatstring.rb +22 -0
- data/test/tc_functor.rb +18 -0
- data/test/tc_harray.rb +280 -0
- data/test/tc_heap.rb +6 -0
- data/test/tc_infinity.rb +23 -0
- data/test/tc_init.rb +29 -0
- data/test/tc_interval.rb +153 -0
- data/test/tc_io-reactor.rb +5 -0
- data/test/tc_io-redirect.rb +5 -0
- data/test/tc_lisp-format.rb +24 -0
- data/test/tc_lisp.rb +32 -0
- data/test/tc_macro.rb +48 -0
- data/test/tc_multiton.rb +188 -0
- data/test/tc_nack.rb +31 -0
- data/test/tc_nil-as-emptiness.rb +19 -0
- data/test/tc_nil-comparable.rb +29 -0
- data/test/tc_nil-missing.rb +0 -0
- data/test/tc_notcopyable.rb +64 -0
- data/test/tc_orderedhash.rb +36 -0
- data/test/tc_ostructable.rb +31 -0
- data/test/tc_semaphore.rb +5 -0
- data/test/tc_snapshot.rb +20 -0
- data/test/tc_soundex.rb +19 -0
- data/test/tc_sstruct.rb +313 -0
- data/test/tc_statichash.rb +24 -0
- data/test/tc_tagiter.rb +80 -0
- data/test/tc_timelimit.rb +47 -0
- data/test/tc_timer.rb +35 -0
- data/test/tc_tracepoint.rb +10 -0
- data/test/tc_tuple.rb +25 -0
- data/test/tc_uninheritable.rb +33 -0
- data/test/tc_version.rb +90 -0
- metadata +531 -0
data/lib/carat/nack.rb
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
=begin rdoc
|
|
2
|
+
|
|
3
|
+
= NackClass
|
|
4
|
+
|
|
5
|
+
The NackClass is is like the NilClass except one step down.
|
|
6
|
+
Nack is never used to to mean nothingness or emptiness.
|
|
7
|
+
The Nack class is only used to report something is "a miss" w/o
|
|
8
|
+
the system raising an Exception. It's a mechanism for
|
|
9
|
+
lazy error evaluation.
|
|
10
|
+
|
|
11
|
+
== Usage
|
|
12
|
+
|
|
13
|
+
def scalar( x )
|
|
14
|
+
if x.kind_of?(Enumerable)
|
|
15
|
+
return nack(ArgumentError, "Value must not be enumerable")
|
|
16
|
+
end
|
|
17
|
+
x
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
a = scaler( 1 ) #=> 1
|
|
21
|
+
b = scaler( [1,2] ) #=> nack
|
|
22
|
+
b.first #=> ArgumentError (previous)
|
|
23
|
+
|
|
24
|
+
a = nail scaler( 1 ) #=> 1
|
|
25
|
+
b = nail scaler( [1,2] ) #=> ArgumentError
|
|
26
|
+
|
|
27
|
+
== TODO
|
|
28
|
+
|
|
29
|
+
* I beleive this class has even more potential yet.
|
|
30
|
+
It would be interesting to see if a catch/try correction
|
|
31
|
+
facility could be built into it too.
|
|
32
|
+
|
|
33
|
+
== Author(s)
|
|
34
|
+
|
|
35
|
+
* Thomas Sawyer
|
|
36
|
+
|
|
37
|
+
== Legal
|
|
38
|
+
|
|
39
|
+
Ruby License
|
|
40
|
+
Copyright (c)2004 Thomas Sawyer
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
== History
|
|
44
|
+
|
|
45
|
+
* 2005.04.11 Passed basic test.
|
|
46
|
+
|
|
47
|
+
=end
|
|
48
|
+
|
|
49
|
+
class InvalidNackError < ArgumentError
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
class NackClass
|
|
53
|
+
|
|
54
|
+
attr_reader :error, :data
|
|
55
|
+
|
|
56
|
+
def initialize(error=nil, *data, &ctrl)
|
|
57
|
+
if Class === error and error <= Exception
|
|
58
|
+
@error = error.new(*data)
|
|
59
|
+
elsif error.kind_of?( Exception )
|
|
60
|
+
@error = error
|
|
61
|
+
elsif error.kind_of?( String )
|
|
62
|
+
@error = StandardError.new(error)
|
|
63
|
+
elsif error == nil
|
|
64
|
+
@error = StandardError.new
|
|
65
|
+
else
|
|
66
|
+
raise InvalidNackError
|
|
67
|
+
end
|
|
68
|
+
@data = data
|
|
69
|
+
@ctrl = ctrl
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def call(*args)
|
|
73
|
+
@ctrl.call(*args)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def call_with_data
|
|
77
|
+
@ctrl.call(*@data)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def raise_error
|
|
81
|
+
raise @error
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def to_s; "n/a"; end
|
|
85
|
+
|
|
86
|
+
def ==(x)
|
|
87
|
+
x.is_a?(NackClass)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def method_missing(meth, *args)
|
|
91
|
+
raise_error
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
module Kernel
|
|
97
|
+
def nack(err=nil, *data, &ctrl)
|
|
98
|
+
NackClass.new(err, *data, &ctrl)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# private Object method
|
|
103
|
+
def nail( arg )
|
|
104
|
+
if NackClass === arg
|
|
105
|
+
arg.raise_error
|
|
106
|
+
else
|
|
107
|
+
return arg
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
#class NilClass
|
|
112
|
+
# def method_missing(meth, *args)
|
|
113
|
+
# nack()
|
|
114
|
+
# end
|
|
115
|
+
#end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
=begin rdoc
|
|
2
|
+
|
|
3
|
+
= NilComparable
|
|
4
|
+
|
|
5
|
+
NilComparable does two things. First it make nil comparable, such that
|
|
6
|
+
all things (except itself) are greater than it.
|
|
7
|
+
|
|
8
|
+
Secondly it provides a module called NilComparable to include into any
|
|
9
|
+
other class to allow it to compare itself to NilClass as the greater
|
|
10
|
+
of the two.
|
|
11
|
+
|
|
12
|
+
= Author(s)
|
|
13
|
+
|
|
14
|
+
* Paul Brannan
|
|
15
|
+
* Thomas Sawyer
|
|
16
|
+
|
|
17
|
+
=end
|
|
18
|
+
|
|
19
|
+
class NilClass
|
|
20
|
+
include Comparable
|
|
21
|
+
def <=>(x)
|
|
22
|
+
x.nil? ? 0 : -1
|
|
23
|
+
end
|
|
24
|
+
alias_method( :cmp, :<=> )
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# # Calling this method for a given class allows instances
|
|
28
|
+
# # of a class to be compared to nil using <=>.
|
|
29
|
+
# # Adapted from code by Paul Brannan (Ruby License)
|
|
30
|
+
# # NOTE: THIS SHOULD BE A CLASS INCLUDING MODULE, I THINK.
|
|
31
|
+
# def nil_comparable(klass=self)
|
|
32
|
+
# klass.class_eval %{
|
|
33
|
+
# if method_defined?( :<=> )
|
|
34
|
+
# alias_method :compare_without_nil, :<=>
|
|
35
|
+
# else
|
|
36
|
+
# def compare_without_nil( other )
|
|
37
|
+
# raise TypeError, "Cannot compare \#{self.inspect} to \#{other.inspect}"
|
|
38
|
+
# end
|
|
39
|
+
# end
|
|
40
|
+
# def <=>( other )
|
|
41
|
+
# return 1 if other.nil?
|
|
42
|
+
# compare_without_nil( other )
|
|
43
|
+
# end
|
|
44
|
+
# }
|
|
45
|
+
# end
|
|
46
|
+
|
|
47
|
+
module NilComparable
|
|
48
|
+
|
|
49
|
+
def self.included( mod )
|
|
50
|
+
mod.class_eval %{
|
|
51
|
+
if method_defined?( :<=> )
|
|
52
|
+
alias_method :compare_without_nil, :<=>
|
|
53
|
+
else
|
|
54
|
+
def compare_without_nil( other )
|
|
55
|
+
raise TypeError, "Cannot compare \#{self.inspect} to \#{other.inspect}"
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
def <=>( other )
|
|
59
|
+
return 1 if other.nil?
|
|
60
|
+
compare_without_nil( other )
|
|
61
|
+
end
|
|
62
|
+
}
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
=begin rdoc
|
|
2
|
+
|
|
3
|
+
= NotCopyable
|
|
4
|
+
|
|
5
|
+
Disable copying via dup and clone (and copy).
|
|
6
|
+
|
|
7
|
+
== Usage
|
|
8
|
+
|
|
9
|
+
require 'carat/notcopyable.rb'
|
|
10
|
+
|
|
11
|
+
Class FixedString < String
|
|
12
|
+
include NotCopyable
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
s = FixedString.new("Don't tred on me!")
|
|
16
|
+
puts s
|
|
17
|
+
s2 = s.dup
|
|
18
|
+
|
|
19
|
+
produces
|
|
20
|
+
|
|
21
|
+
Don't tred on me!
|
|
22
|
+
TypeError, "Object not copyable"
|
|
23
|
+
|
|
24
|
+
== Todo
|
|
25
|
+
|
|
26
|
+
* If one is reopening a class and including this, it will
|
|
27
|
+
not work if the class defined #dub, #clone or #copy (and #deep_copy)
|
|
28
|
+
itself. It only work if it's ancestors are responsible for those
|
|
29
|
+
methods. How to fix?
|
|
30
|
+
|
|
31
|
+
== Notes
|
|
32
|
+
|
|
33
|
+
* I don't think this will prove very useful, but just in case
|
|
34
|
+
here it is.
|
|
35
|
+
|
|
36
|
+
== Author(s)
|
|
37
|
+
|
|
38
|
+
* Paul Brannan <paul at atdesk.com>
|
|
39
|
+
* Thomas Sawyer
|
|
40
|
+
|
|
41
|
+
== Legal
|
|
42
|
+
|
|
43
|
+
Adapted from Ruby Treasures 0.4
|
|
44
|
+
Copyright (C) 2002 Paul Brannan <paul@atdesk.com>
|
|
45
|
+
|
|
46
|
+
You may distribute this software under the same terms as Ruby
|
|
47
|
+
(see the file COPYING that was distributed with this library).
|
|
48
|
+
|
|
49
|
+
== History
|
|
50
|
+
|
|
51
|
+
* 2005.04.11 Passed basic test.
|
|
52
|
+
|
|
53
|
+
=end
|
|
54
|
+
|
|
55
|
+
module NotCopyable
|
|
56
|
+
def clone
|
|
57
|
+
raise TypeError, "Object not copyable"
|
|
58
|
+
end
|
|
59
|
+
def dup
|
|
60
|
+
raise TypeError, "Object not copyable"
|
|
61
|
+
end
|
|
62
|
+
# if object/copy has been required?
|
|
63
|
+
def copy
|
|
64
|
+
raise TypeError, "Object not copyable"
|
|
65
|
+
end
|
|
66
|
+
alias_method( :deep_copy, :copy )
|
|
67
|
+
end
|
|
68
|
+
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
#$Id: orderedhash.rb, v2.0 2004-12-05 transami Exp $
|
|
2
|
+
|
|
3
|
+
=begin rdoc
|
|
4
|
+
|
|
5
|
+
= OrderedHash
|
|
6
|
+
|
|
7
|
+
Hash with preserved order and some array-like extensions
|
|
8
|
+
|
|
9
|
+
== AUTHOR
|
|
10
|
+
|
|
11
|
+
* jan molic </mig/at/1984/dot/cz/>
|
|
12
|
+
|
|
13
|
+
== THANKS
|
|
14
|
+
|
|
15
|
+
Andrew Johnson for his suggestions and fixes of Hash[], merge,
|
|
16
|
+
to_a, inspect and shift.
|
|
17
|
+
|
|
18
|
+
== USAGE
|
|
19
|
+
|
|
20
|
+
Just require this file and use OrderedHash instead of Hash.
|
|
21
|
+
|
|
22
|
+
require 'trix/orderedhash'
|
|
23
|
+
|
|
24
|
+
# You can do simply
|
|
25
|
+
hsh = OrderedHash.new
|
|
26
|
+
hsh['z'] = 1
|
|
27
|
+
hsh['a'] = 2
|
|
28
|
+
hsh['c'] = 3
|
|
29
|
+
p hsh.keys #=> ['z','a','c']
|
|
30
|
+
|
|
31
|
+
# or using OrderedHash[] method
|
|
32
|
+
hsh = OrderedHash['z', 1, 'a', 2, 'c', 3]
|
|
33
|
+
p hsh.keys #=> ['z','a','c']
|
|
34
|
+
|
|
35
|
+
# but this don't preserve order
|
|
36
|
+
hsh = OrderedHash['z'=>1, 'a'=>2, 'c'=>3]
|
|
37
|
+
p hsh.keys #=> ['a','c','z']
|
|
38
|
+
|
|
39
|
+
# OrderedHash has useful extensions: push, pop and unshift
|
|
40
|
+
p hsh.push('to_end', 15) #=> true, key added
|
|
41
|
+
p hsh.push('to_end', 30) #=> false, already - nothing happen
|
|
42
|
+
p hsh.unshift('to_begin', 50) #=> true, key added
|
|
43
|
+
p hsh.unshift('to_begin', 60) #=> false, already - nothing happen
|
|
44
|
+
p hsh.keys #=> ["to_begin", "a", "c", "z", "to_end"]
|
|
45
|
+
p hsh.pop #=> ["to_end", 15], if nothing remains, return nil
|
|
46
|
+
p hsh.keys #=> ["to_begin", "a", "c", "z"]
|
|
47
|
+
p hsh.shift #=> ["to_begin", 30], if nothing remains, return nil
|
|
48
|
+
|
|
49
|
+
=end
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class OrderedHash < Hash
|
|
53
|
+
|
|
54
|
+
attr_accessor :order
|
|
55
|
+
|
|
56
|
+
class << self
|
|
57
|
+
def [] *args
|
|
58
|
+
hsh = OrderedHash.new
|
|
59
|
+
if Hash === args[0]
|
|
60
|
+
hsh.replace args[0]
|
|
61
|
+
elsif (args.size % 2) != 0
|
|
62
|
+
raise ArgumentError, "odd number of elements for Hash"
|
|
63
|
+
else
|
|
64
|
+
hsh[args.shift] = args.shift while args.size > 0
|
|
65
|
+
end
|
|
66
|
+
hsh
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def initialize
|
|
71
|
+
@order = []
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def store_only a,b
|
|
75
|
+
store a,b
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
alias orig_store store
|
|
79
|
+
def store a,b
|
|
80
|
+
@order.push a unless has_key? a
|
|
81
|
+
super a,b
|
|
82
|
+
end
|
|
83
|
+
alias []= store
|
|
84
|
+
|
|
85
|
+
def == hsh2
|
|
86
|
+
return false if @order != hsh2.order
|
|
87
|
+
super hsh2
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def clear
|
|
91
|
+
@order = []
|
|
92
|
+
super
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def delete key
|
|
96
|
+
@order.delete key
|
|
97
|
+
super
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def each_key
|
|
101
|
+
@order.each { |k| yield k }
|
|
102
|
+
self
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def each_value
|
|
106
|
+
@order.each { |k| yield self[k] }
|
|
107
|
+
self
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def each
|
|
111
|
+
@order.each { |k| yield k,self[k] }
|
|
112
|
+
self
|
|
113
|
+
end
|
|
114
|
+
alias each_pair each
|
|
115
|
+
|
|
116
|
+
def delete_if
|
|
117
|
+
@order.clone.each { |k|
|
|
118
|
+
delete k if yield
|
|
119
|
+
}
|
|
120
|
+
self
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def values
|
|
124
|
+
ary = []
|
|
125
|
+
@order.each { |k| ary.push self[k] }
|
|
126
|
+
ary
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def keys
|
|
130
|
+
@order
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def invert
|
|
134
|
+
hsh2 = Hash.new
|
|
135
|
+
@order.each { |k| hsh2[self[k]] = k }
|
|
136
|
+
hsh2
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def reject &block
|
|
140
|
+
self.dup.delete_if &block
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def reject! &block
|
|
144
|
+
hsh2 = reject &block
|
|
145
|
+
self == hsh2 ? nil : hsh2
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def replace hsh2
|
|
149
|
+
@order = hsh2.keys
|
|
150
|
+
super hsh2
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def shift
|
|
154
|
+
key = @order.first
|
|
155
|
+
key ? [key,delete(key)] : super
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def unshift k,v
|
|
159
|
+
unless self.include? k
|
|
160
|
+
@order.unshift k
|
|
161
|
+
orig_store(k,v)
|
|
162
|
+
true
|
|
163
|
+
else
|
|
164
|
+
false
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def push k,v
|
|
169
|
+
unless self.include? k
|
|
170
|
+
@order.push k
|
|
171
|
+
orig_store(k,v)
|
|
172
|
+
true
|
|
173
|
+
else
|
|
174
|
+
false
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def pop
|
|
179
|
+
key = @order.last
|
|
180
|
+
key ? [key,delete(key)] : nil
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def to_a
|
|
184
|
+
ary = []
|
|
185
|
+
each { |k,v| ary << [k,v] }
|
|
186
|
+
ary
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def to_s
|
|
190
|
+
self.to_a.to_s
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def inspect
|
|
194
|
+
ary = []
|
|
195
|
+
each {|k,v| ary << k.inspect + "=>" + v.inspect}
|
|
196
|
+
'{' + ary.join(", ") + '}'
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def update hsh2
|
|
200
|
+
hsh2.each { |k,v| self[k] = v }
|
|
201
|
+
self
|
|
202
|
+
end
|
|
203
|
+
alias :merge! update
|
|
204
|
+
|
|
205
|
+
def merge hsh2
|
|
206
|
+
self.dup update(hsh2)
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def select
|
|
210
|
+
ary = []
|
|
211
|
+
each { |k,v| ary << [k,v] if yield k,v }
|
|
212
|
+
ary
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
=begin
|
|
219
|
+
# --- development testing ---
|
|
220
|
+
|
|
221
|
+
if __FILE__ == $0
|
|
222
|
+
|
|
223
|
+
# You can do simply
|
|
224
|
+
hsh = OrderedHash.new
|
|
225
|
+
hsh['z'] = 1
|
|
226
|
+
hsh['a'] = 2
|
|
227
|
+
hsh['c'] = 3
|
|
228
|
+
p hsh.keys # ['z','a','c']
|
|
229
|
+
|
|
230
|
+
# or using OrderedHash[] method
|
|
231
|
+
hsh = OrderedHash['z', 1, 'a', 2, 'c', 3]
|
|
232
|
+
p hsh.keys # ['z','a','c']
|
|
233
|
+
|
|
234
|
+
# but this don't preserve order
|
|
235
|
+
hsh = OrderedHash['z'=>1, 'a'=>2, 'c'=>3]
|
|
236
|
+
p hsh.keys # ['a','c','z']
|
|
237
|
+
|
|
238
|
+
# OrderedHash has useful extensions: push, pop and unshift
|
|
239
|
+
p hsh.push('to_end', 15) # true, key added
|
|
240
|
+
p hsh.push('to_end', 30) # false, already - nothing happen
|
|
241
|
+
p hsh.unshift('to_begin', 50) # true, key added
|
|
242
|
+
p hsh.unshift('to_begin', 60) # false, already - nothing happen
|
|
243
|
+
p hsh.keys # ["to_begin", "a", "c", "z", "to_end"]
|
|
244
|
+
p hsh.pop # ["to_end", 15], if nothing remains, return nil
|
|
245
|
+
p hsh.keys # ["to_begin", "a", "c", "z"]
|
|
246
|
+
p hsh.shift # ["to_begin", 30], if nothing remains, return nil
|
|
247
|
+
|
|
248
|
+
end
|
|
249
|
+
=end
|