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/lisp.rb
ADDED
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
=begin rdoc
|
|
2
|
+
|
|
3
|
+
= Lisp Mixin
|
|
4
|
+
|
|
5
|
+
This module provides Lisp-like functional notation.
|
|
6
|
+
With this module it almost possibel to write real
|
|
7
|
+
Lisp code in Ruby.
|
|
8
|
+
|
|
9
|
+
== Example
|
|
10
|
+
|
|
11
|
+
It's hardly believable, but the following IS valid ruby code:
|
|
12
|
+
|
|
13
|
+
(def accumulate (fun, x, list)
|
|
14
|
+
(if (null? list)
|
|
15
|
+
x
|
|
16
|
+
else
|
|
17
|
+
(accumulate fun, (fun.call x, (car list)), (cdr list))
|
|
18
|
+
end)
|
|
19
|
+
end)
|
|
20
|
+
|
|
21
|
+
A real programmer can write LISP in any language... ;)
|
|
22
|
+
|
|
23
|
+
== Author(s)
|
|
24
|
+
|
|
25
|
+
* Florian Frank
|
|
26
|
+
* Thomas Sawyer
|
|
27
|
+
|
|
28
|
+
== Legal
|
|
29
|
+
|
|
30
|
+
Based on original work func.rb by Florain Frank.
|
|
31
|
+
Copyright (c)2005 Florian Frank <flori@ping.de>
|
|
32
|
+
Ruby License
|
|
33
|
+
|
|
34
|
+
== History
|
|
35
|
+
|
|
36
|
+
* 2005.04.12
|
|
37
|
+
** Changed the name of Pair class to DottedPair.
|
|
38
|
+
** Added a new method #pair! which converts an array to a DottedPair.
|
|
39
|
+
** This is then used in #car and #cdr to automatically convert arrays passed to them.
|
|
40
|
+
** Note: There may be other places that #pair! conversion is needed.
|
|
41
|
+
|
|
42
|
+
=end
|
|
43
|
+
|
|
44
|
+
module Lisp
|
|
45
|
+
|
|
46
|
+
VERSION = 1.1
|
|
47
|
+
|
|
48
|
+
# DottedPair
|
|
49
|
+
|
|
50
|
+
class DottedPair
|
|
51
|
+
|
|
52
|
+
include Lisp
|
|
53
|
+
include Enumerable
|
|
54
|
+
|
|
55
|
+
def initialize(first = nil, second = nil)
|
|
56
|
+
@first, @second = first, second
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
attr_accessor :first, :second
|
|
60
|
+
|
|
61
|
+
def DottedPair.[](*array)
|
|
62
|
+
if array.empty?
|
|
63
|
+
nil
|
|
64
|
+
else
|
|
65
|
+
DottedPair.new(array.shift, DottedPair[*array])
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def each(&block)
|
|
70
|
+
if @first
|
|
71
|
+
if @first.is_a? DottedPair
|
|
72
|
+
@first.each(&block)
|
|
73
|
+
else
|
|
74
|
+
block.call(@first)
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
if @second
|
|
78
|
+
if @second.is_a? DottedPair
|
|
79
|
+
@second.each(&block)
|
|
80
|
+
else
|
|
81
|
+
block.call(@second)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def to_s
|
|
87
|
+
'(' + repr + ')'
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def inspect
|
|
91
|
+
'(' + repr + ')'
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def to_a
|
|
95
|
+
a = []
|
|
96
|
+
each { |e| a << e }
|
|
97
|
+
a
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def ==(other)
|
|
101
|
+
if pair?(self) and pair?(other)
|
|
102
|
+
car(self) == car(other) and cdr(self) == cdr(other)
|
|
103
|
+
else
|
|
104
|
+
if pair?(self) then false else self == other end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
protected
|
|
109
|
+
|
|
110
|
+
def repr
|
|
111
|
+
case @second
|
|
112
|
+
when DottedPair then @first.to_s + ' ' + @second.repr
|
|
113
|
+
when nil then @first.to_s
|
|
114
|
+
else @first.to_s + ' . ' + @second.to_s
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Functional API
|
|
121
|
+
|
|
122
|
+
def cons(car, cdr)
|
|
123
|
+
DottedPair.new(car, cdr)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def consonto(cdr, car)
|
|
127
|
+
DottedPair.new(car, cdr)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def car(pair)
|
|
131
|
+
pair = pair!(pair)
|
|
132
|
+
pair.first
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def cdr(pair)
|
|
136
|
+
pair = pair!(pair)
|
|
137
|
+
pair.second
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def set(var, val, binding)
|
|
141
|
+
eval "var = #{val}", binding
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def set_car!(pair, val)
|
|
145
|
+
pair.first = val
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def set_cdr!(pair, val)
|
|
149
|
+
pair.second = val
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def null?(x)
|
|
153
|
+
x == nil
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def pair?(x)
|
|
157
|
+
x.is_a?(DottedPair)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def pair!(x)
|
|
161
|
+
return x if pair?(x)
|
|
162
|
+
return DottedPair[*x]
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def atom?(x)
|
|
166
|
+
not pair?(x) || null?(x)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def equal?(l, m)
|
|
170
|
+
l == m
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def list(*elms)
|
|
174
|
+
if elms.empty?
|
|
175
|
+
nil
|
|
176
|
+
else
|
|
177
|
+
cons(elms.shift, list(*elms))
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def append(l, m)
|
|
182
|
+
if null?(l)
|
|
183
|
+
if null?(m)
|
|
184
|
+
nil
|
|
185
|
+
else
|
|
186
|
+
cons(car(m), append(l, cdr(m)))
|
|
187
|
+
end
|
|
188
|
+
else
|
|
189
|
+
cons(car(l), append(cdr(l), m))
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def length(list)
|
|
194
|
+
if null?(list)
|
|
195
|
+
0
|
|
196
|
+
else
|
|
197
|
+
1 + length(cdr(list))
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def map(fun, list)
|
|
202
|
+
if null?(list)
|
|
203
|
+
nil
|
|
204
|
+
else
|
|
205
|
+
cons(fun.call(car(list)), map(fun, cdr(list)))
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def zip(fun, l, m)
|
|
210
|
+
if null?(l) and null?(m)
|
|
211
|
+
nil
|
|
212
|
+
elsif null?(l) or null?(m)
|
|
213
|
+
raise ArgumentError.new("zip with unequal length lists")
|
|
214
|
+
else
|
|
215
|
+
cons(fun.call(car(l), car(m)), zip(fun, cdr(l), cdr(m)))
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def pairlis(l, m)
|
|
220
|
+
zip(lambda { |x, y| cons(x, y) }, l, m)
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def member?(x, list)
|
|
224
|
+
if null?(list)
|
|
225
|
+
false
|
|
226
|
+
else
|
|
227
|
+
if x == car(list)
|
|
228
|
+
true
|
|
229
|
+
else
|
|
230
|
+
member?(x, cdr(list))
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def filter(pred, list)
|
|
236
|
+
if null?(list)
|
|
237
|
+
nil
|
|
238
|
+
else
|
|
239
|
+
if pred.call(car(list))
|
|
240
|
+
cons(car(list), filter(pred, cdr(list)))
|
|
241
|
+
else
|
|
242
|
+
filter(pred, cdr(list))
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
def assoc(x, list)
|
|
248
|
+
f = filter(lambda { |y| x == car(y)}, list)
|
|
249
|
+
if null?(f) then nil else car(f) end
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def exists?(pred, list)
|
|
253
|
+
if null?(list)
|
|
254
|
+
false
|
|
255
|
+
else
|
|
256
|
+
if pred.call(car(list))
|
|
257
|
+
true
|
|
258
|
+
else
|
|
259
|
+
exists?(pred, cdr(list))
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def all?(pred, list)
|
|
265
|
+
if null?(list)
|
|
266
|
+
true
|
|
267
|
+
else
|
|
268
|
+
if pred.call(car(list))
|
|
269
|
+
all?(pred, cdr(list))
|
|
270
|
+
else
|
|
271
|
+
false
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
def accumulate(fun, x, list)
|
|
277
|
+
if null?(list)
|
|
278
|
+
x
|
|
279
|
+
else
|
|
280
|
+
accumulate(fun, fun.call(x, car(list)), cdr(list))
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
alias foldleft accumulate
|
|
285
|
+
|
|
286
|
+
def reduce(fun, x, list)
|
|
287
|
+
if null?(list)
|
|
288
|
+
x
|
|
289
|
+
else
|
|
290
|
+
fun.call(car(list), reduce(fun, x, cdr(list)))
|
|
291
|
+
end
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
alias foldright reduce
|
|
295
|
+
|
|
296
|
+
def link(lists)
|
|
297
|
+
accumulate(lambda { |x, y| append(x, y) }, nil, lists)
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
def explode(string)
|
|
301
|
+
list(*(string.split(//)))
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
def implode(list)
|
|
305
|
+
accumulate(lambda { |x, y| x + y }, '', list)
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
def sum(list)
|
|
309
|
+
accumulate(lambda { |x, y| x + y }, 0, list)
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
def prod(list)
|
|
313
|
+
accumulate(lambda { |x, y| x * y }, 1, list)
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
def reverse(lists)
|
|
317
|
+
accumulate(lambda { |x, y| consonto(x, y) }, nil, lists)
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
def take(l, n)
|
|
321
|
+
if n > 0 and not null?(l)
|
|
322
|
+
cons(car(l), take(cdr(l), n - 1))
|
|
323
|
+
else
|
|
324
|
+
nil
|
|
325
|
+
end
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
def drop(l, n)
|
|
329
|
+
if n > 0 and not null?(l)
|
|
330
|
+
drop(cdr(l), n - 1)
|
|
331
|
+
else
|
|
332
|
+
l
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
end
|
data/lib/carat/macro.rb
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# = Module Macros
|
|
2
|
+
#
|
|
3
|
+
# A macro construction for creating dynamic mixins.
|
|
4
|
+
#
|
|
5
|
+
# == Example
|
|
6
|
+
#
|
|
7
|
+
# module Mixin
|
|
8
|
+
# macro { |options| %{
|
|
9
|
+
# def hello
|
|
10
|
+
# puts 'Hello from #{options[:name]}'
|
|
11
|
+
# end
|
|
12
|
+
# } }
|
|
13
|
+
# end
|
|
14
|
+
#
|
|
15
|
+
# class MyClass
|
|
16
|
+
# include Mixin, :name => 'tml'
|
|
17
|
+
# end
|
|
18
|
+
#
|
|
19
|
+
# m = MyClass.new
|
|
20
|
+
# m.hello -> 'Hello from tml'
|
|
21
|
+
#
|
|
22
|
+
# == Author
|
|
23
|
+
#
|
|
24
|
+
# Based on original code by George Moschovitis <gm@navel.gr>
|
|
25
|
+
#
|
|
26
|
+
class Module
|
|
27
|
+
|
|
28
|
+
def macro( &blk )
|
|
29
|
+
(@macros ||= []) << blk
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def macros ; @macros ||= [] ; end
|
|
33
|
+
|
|
34
|
+
alias_method :include_without_macros, :include
|
|
35
|
+
|
|
36
|
+
def include(*args)
|
|
37
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
|
38
|
+
for mod in args
|
|
39
|
+
mod.append_dynamic_features( self, options )
|
|
40
|
+
end
|
|
41
|
+
include_without_macros(*args)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Note: Is this the best name for this callback?
|
|
45
|
+
def append_dynamic_features( base, options )
|
|
46
|
+
macros.each do |m|
|
|
47
|
+
base.class_eval m.call( options )
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
alias_method :extend_without_macros, :extend
|
|
52
|
+
|
|
53
|
+
def extend(*args)
|
|
54
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
|
55
|
+
for mod in args
|
|
56
|
+
mod.extend_dynamic_object( self, options )
|
|
57
|
+
end
|
|
58
|
+
extend_without_macros(*args)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Note: Is this the best name for this callback?
|
|
62
|
+
def extend_dynamic_object( base, options )
|
|
63
|
+
macros.each do |m|
|
|
64
|
+
(class << base; self ; end).class_eval m.call( options )
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
=begin rdoc
|
|
2
|
+
|
|
3
|
+
= Multiton
|
|
4
|
+
|
|
5
|
+
Multiton module that ensures only one object to be allocated for a given
|
|
6
|
+
argument list.
|
|
7
|
+
|
|
8
|
+
The 'multiton' pattern is similar to a singleton, but instead of only one
|
|
9
|
+
instance, there are several similar instances. it's usefull when you want to
|
|
10
|
+
avoid constructing objects many times because of some huge expence (connecting
|
|
11
|
+
to a database for example), require a set of similar but not identical
|
|
12
|
+
objects, and cannot easily control how many time a contructor may be called.
|
|
13
|
+
|
|
14
|
+
== Synopsis
|
|
15
|
+
|
|
16
|
+
require 'carat/multiton'
|
|
17
|
+
|
|
18
|
+
class SomeMultitonClass
|
|
19
|
+
include Multiton
|
|
20
|
+
attr :arg
|
|
21
|
+
def initialize(arg)
|
|
22
|
+
@arg = arg
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
a = SomeMultitonClass.instance(4)
|
|
27
|
+
b = SomeMultitonClass.instance(4) # a and b are same object
|
|
28
|
+
c = SomeMultitonClass.instance(2) # c is a different object
|
|
29
|
+
|
|
30
|
+
In previous versions the Class.new method was made private, but for
|
|
31
|
+
Semi Multitons this restriction has been lifted with the following
|
|
32
|
+
caveat: Class.instance will attempt to retreive a previously cached
|
|
33
|
+
object, constructing one if needed, but Class.new will *always*
|
|
34
|
+
construct a new object - this should allow great flexiblity with
|
|
35
|
+
multiton classes.
|
|
36
|
+
|
|
37
|
+
== How It Works
|
|
38
|
+
|
|
39
|
+
We try to use a previously cached object, if one is not found
|
|
40
|
+
we construct one and cache it in the pool based on class and
|
|
41
|
+
the args given to the contructor
|
|
42
|
+
|
|
43
|
+
note: a limitation of this approach is that it is impossible to
|
|
44
|
+
detect if different blocks were given to a contructor (if it takes a
|
|
45
|
+
block. Thus, it is the constructor *args _exclusively_ which determine
|
|
46
|
+
the uniqueness of an object. A workaround is for the class to define
|
|
47
|
+
the _class_ method multiton_id, eg:
|
|
48
|
+
|
|
49
|
+
def Klass.multiton_id(*args, &block)
|
|
50
|
+
# ...
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
Which should return a hash key used to identify the object being
|
|
54
|
+
constructed as (not) unique.
|
|
55
|
+
|
|
56
|
+
== Author(s)
|
|
57
|
+
|
|
58
|
+
* Thomas Sawyer
|
|
59
|
+
|
|
60
|
+
== Legal
|
|
61
|
+
|
|
62
|
+
Ruby License
|
|
63
|
+
Copyright (c)2005 Thomas Sawyer
|
|
64
|
+
|
|
65
|
+
== History
|
|
66
|
+
|
|
67
|
+
* 2005.04.12 Passed basic tests.
|
|
68
|
+
|
|
69
|
+
=end
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
module Multiton
|
|
73
|
+
|
|
74
|
+
VERSION = "2.0"
|
|
75
|
+
|
|
76
|
+
# pools of objects cached on class type
|
|
77
|
+
POOLS = {}
|
|
78
|
+
|
|
79
|
+
# method which can be defined by a class to determine object uniqueness
|
|
80
|
+
MULTITON_ID_HOOK = :multiton_id
|
|
81
|
+
|
|
82
|
+
# method which can be defined by a class to create multiton objects
|
|
83
|
+
MULTITON_NEW_HOOK = :multiton_new
|
|
84
|
+
|
|
85
|
+
def self.append_features(klass)
|
|
86
|
+
klass.private_class_method(:new)
|
|
87
|
+
def klass.instance(*args, &block)
|
|
88
|
+
# if the class defined 'multiton_id' we use this as the key
|
|
89
|
+
# otherwise we simply use the argument list.
|
|
90
|
+
k = (respond_to?(MULTITON_ID_HOOK) ? send(MULTITON_ID_HOOK, *args, &block) : args)
|
|
91
|
+
unless (obj = (POOLS[self] ||= {})[k])
|
|
92
|
+
begin
|
|
93
|
+
critical = Thread.critical
|
|
94
|
+
Thread.critical = true
|
|
95
|
+
meth = self.respond_to?(MULTITON_NEW_HOOK) ? MULTITON_NEW_HOOK : :new
|
|
96
|
+
obj = (POOLS[self][k] = self.send(meth, *args, &block))
|
|
97
|
+
ensure
|
|
98
|
+
Thread.critical = critical # restore state
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
return obj
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# A new-multiton uses the #new method rather than the #instance method.
|
|
106
|
+
module New
|
|
107
|
+
def self.append_features(klass)
|
|
108
|
+
def klass.new(*args, &block)
|
|
109
|
+
# if the class defined 'multiton_id' we use this as the key
|
|
110
|
+
# otherwise we simply use the argument list.
|
|
111
|
+
k = (respond_to?(MULTITON_ID_HOOK) ? send(MULTITON_ID_HOOK, *args, &block) : args)
|
|
112
|
+
unless (obj = (POOLS[self] ||= {})[k])
|
|
113
|
+
begin
|
|
114
|
+
critical = Thread.critical
|
|
115
|
+
Thread.critical = true
|
|
116
|
+
if self.respond_to?(MULTITON_NEW_HOOK)
|
|
117
|
+
obj = (POOLS[self][k] = self.send(MULTITON_NEW_HOOK, *args, &block))
|
|
118
|
+
else
|
|
119
|
+
obj = super
|
|
120
|
+
end
|
|
121
|
+
ensure
|
|
122
|
+
Thread.critical = critical # restore state
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
return obj
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
#
|
|
131
|
+
module Semi
|
|
132
|
+
def self.append_features(klass)
|
|
133
|
+
def klass.instance(*args, &block)
|
|
134
|
+
# if the class defined 'multiton_id' we use this as the key
|
|
135
|
+
# otherwise we simply use the argument list.
|
|
136
|
+
k = (respond_to?(MULTITON_ID_HOOK) ? send(MULTITON_ID_HOOK, *args, &block) : args)
|
|
137
|
+
unless (obj = (POOLS[self] ||= {})[k])
|
|
138
|
+
begin
|
|
139
|
+
critical = Thread.critical
|
|
140
|
+
Thread.critical = true
|
|
141
|
+
meth = self.respond_to?(MULTITON_NEW_HOOK) ? MULTITON_NEW_HOOK : :new
|
|
142
|
+
obj = (POOLS[self][k] = self.send(meth, *args, &block))
|
|
143
|
+
ensure
|
|
144
|
+
Thread.critical = critical # restore state
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
return obj
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
end
|
|
153
|
+
|