farce 0.0.1.alpha2-x86_64-linux-gnu
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.
- checksums.yaml +7 -0
- data/CODE_OF_CONDUCT.md +26 -0
- data/CONTRIBUTING.md +71 -0
- data/MIT-LICENSE +20 -0
- data/README.md +1524 -0
- data/SECURITY.md +10 -0
- data/docs/benchmarks.md +185 -0
- data/docs/gems/dry-types.md +290 -0
- data/docs/gems/msgpack.md +70 -0
- data/docs/gems/ractor-shim.md +63 -0
- data/docs/modes.md +628 -0
- data/docs/scopes.md +649 -0
- data/docs/variants.md +346 -0
- data/ext/ext_helper.rb +20 -0
- data/ext/farce/README.md +21 -0
- data/ext/farce/atom.c +1023 -0
- data/ext/farce/bounded_map.c +1683 -0
- data/ext/farce/containers.h +77 -0
- data/ext/farce/counter.c +399 -0
- data/ext/farce/darwin.c +100 -0
- data/ext/farce/depend +12 -0
- data/ext/farce/dict.c +1523 -0
- data/ext/farce/dict.h +152 -0
- data/ext/farce/drivers.c +237 -0
- data/ext/farce/exchanger.c +299 -0
- data/ext/farce/extconf.rb +99 -0
- data/ext/farce/farce.c +359 -0
- data/ext/farce/flag.c +288 -0
- data/ext/farce/io.c +338 -0
- data/ext/farce/lock.c +510 -0
- data/ext/farce/map.c +2240 -0
- data/ext/farce/priority_queue.c +2056 -0
- data/ext/farce/queue.c +1059 -0
- data/ext/farce/reactor.c +820 -0
- data/ext/farce/reactor.h +103 -0
- data/ext/farce/shareable.h +31 -0
- data/ext/farce/signal.c +350 -0
- data/ext/farce/transaction.c +354 -0
- data/ext/farce/transaction.h +40 -0
- data/ext/farce/tree_map.c +1953 -0
- data/ext/farce/trie.c +2020 -0
- data/ext/farce/unshareable.c +155 -0
- data/ext/farce/unshared_io_pool.h +234 -0
- data/ext/farce/unshared_signal.c +263 -0
- data/ext/farce/unshared_wait.h +193 -0
- data/ext/farce/unsupported.c +6 -0
- data/ext/farce/vector.c +1195 -0
- data/ext/farce/weak_map.c +1714 -0
- data/ext/java/org/farce/BoundedMap.java +394 -0
- data/ext/java/org/farce/FiberScheduler.java +141 -0
- data/ext/java/org/farce/PriorityKey.java +45 -0
- data/ext/java/org/farce/PriorityQueue.java +373 -0
- data/ext/java/org/farce/QueueSignal.java +28 -0
- data/ext/rebind/README.md +14 -0
- data/ext/rebind/extconf.rb +10 -0
- data/ext/rebind/rebind.c +186 -0
- data/lib/farce/_yard/internal.rb +13 -0
- data/lib/farce/_yard/macros.rb +61 -0
- data/lib/farce/_yard/ractor.rb +46 -0
- data/lib/farce/abstract/atom.rb +186 -0
- data/lib/farce/abstract/bounded_map.rb +232 -0
- data/lib/farce/abstract/collection.rb +151 -0
- data/lib/farce/abstract/concurrent_map.rb +381 -0
- data/lib/farce/abstract/counter.rb +193 -0
- data/lib/farce/abstract/duplicable_map.rb +229 -0
- data/lib/farce/abstract/exchanger.rb +26 -0
- data/lib/farce/abstract/flag.rb +71 -0
- data/lib/farce/abstract/lazy.rb +115 -0
- data/lib/farce/abstract/lease.rb +104 -0
- data/lib/farce/abstract/lease_map.rb +261 -0
- data/lib/farce/abstract/lease_pool.rb +91 -0
- data/lib/farce/abstract/lfu_map.rb +20 -0
- data/lib/farce/abstract/lru_map.rb +25 -0
- data/lib/farce/abstract/map.rb +345 -0
- data/lib/farce/abstract/molecule.rb +245 -0
- data/lib/farce/abstract/port.rb +74 -0
- data/lib/farce/abstract/priority_queue.rb +117 -0
- data/lib/farce/abstract/queue.rb +269 -0
- data/lib/farce/abstract/scheduler.rb +111 -0
- data/lib/farce/abstract/set.rb +910 -0
- data/lib/farce/abstract/sorted_set.rb +172 -0
- data/lib/farce/abstract/timer_queue.rb +136 -0
- data/lib/farce/abstract/tree_map.rb +269 -0
- data/lib/farce/abstract/value.rb +68 -0
- data/lib/farce/abstract/vector.rb +1126 -0
- data/lib/farce/abstract/weak_atom.rb +32 -0
- data/lib/farce/abstract/weak_key_map.rb +12 -0
- data/lib/farce/abstract/weak_map.rb +13 -0
- data/lib/farce/abstract/weak_set.rb +12 -0
- data/lib/farce/abstract/weak_value_map.rb +12 -0
- data/lib/farce/abstract.rb +17 -0
- data/lib/farce/atom.rb +293 -0
- data/lib/farce/class_mirror.rb +87 -0
- data/lib/farce/clock.rb +121 -0
- data/lib/farce/config.rb +229 -0
- data/lib/farce/counter.rb +71 -0
- data/lib/farce/deduper.rb +122 -0
- data/lib/farce/engine/jruby/bounded_map.rb +314 -0
- data/lib/farce/engine/jruby/fiber_scheduler.jar +0 -0
- data/lib/farce/engine/jruby/fiber_scheduler.rb +119 -0
- data/lib/farce/engine/jruby/lease_waiting.rb +19 -0
- data/lib/farce/engine/jruby/map.rb +505 -0
- data/lib/farce/engine/jruby/mutable_numeric_copy.rb +42 -0
- data/lib/farce/engine/jruby/signal.rb +147 -0
- data/lib/farce/engine/jruby.rb +63 -0
- data/lib/farce/engine/jvm/concurrent_weak_registry.rb +55 -0
- data/lib/farce/engine/jvm/counter.rb +102 -0
- data/lib/farce/engine/jvm/extension.rb +32 -0
- data/lib/farce/engine/jvm/farce.jar +0 -0
- data/lib/farce/engine/jvm/flag.rb +79 -0
- data/lib/farce/engine/jvm/priority_queue.rb +217 -0
- data/lib/farce/engine/jvm/tree_map.rb +350 -0
- data/lib/farce/engine/jvm/types.rb +180 -0
- data/lib/farce/engine/jvm.rb +19 -0
- data/lib/farce/engine/ruby/3.4/farce.so +0 -0
- data/lib/farce/engine/ruby/3.4/fiber_scheduler.rb +20 -0
- data/lib/farce/engine/ruby/3.4/port.rb +186 -0
- data/lib/farce/engine/ruby/3.4/ractor_methods.rb +26 -0
- data/lib/farce/engine/ruby/3.4/ractor_selector.rb +92 -0
- data/lib/farce/engine/ruby/3.4/rebind.so +0 -0
- data/lib/farce/engine/ruby/3.4/vault.rb +56 -0
- data/lib/farce/engine/ruby/4.0/farce.so +0 -0
- data/lib/farce/engine/ruby/4.0/port.rb +19 -0
- data/lib/farce/engine/ruby/4.0/ractor_methods.rb +20 -0
- data/lib/farce/engine/ruby/4.0/ractor_selector.rb +108 -0
- data/lib/farce/engine/ruby/4.0/rebind.so +0 -0
- data/lib/farce/engine/ruby/4.0/vault.rb +74 -0
- data/lib/farce/engine/ruby/4.1/port.rb +21 -0
- data/lib/farce/engine/ruby/4.1/ractor_methods.rb +22 -0
- data/lib/farce/engine/ruby/4.1/ractor_selector.rb +25 -0
- data/lib/farce/engine/ruby/4.1/vault.rb +5 -0
- data/lib/farce/engine/ruby/fiber_scheduler.rb +32 -0
- data/lib/farce/engine/ruby/key_lock_map.rb +28 -0
- data/lib/farce/engine/ruby/shared/lease.rb +26 -0
- data/lib/farce/engine/ruby/shared/lease_pool.rb +24 -0
- data/lib/farce/engine/ruby/shared/main_scheduler.rb +9 -0
- data/lib/farce/engine/ruby/shared/parallel_scheduler.rb +9 -0
- data/lib/farce/engine/ruby/shared/proxy_owner.rb +31 -0
- data/lib/farce/engine/ruby/shared/ractor_methods.rb +34 -0
- data/lib/farce/engine/ruby/shared/ractor_selector.rb +328 -0
- data/lib/farce/engine/ruby/shared/strict_map.rb +13 -0
- data/lib/farce/engine/ruby/shared/unshared_vector.rb +14 -0
- data/lib/farce/engine/ruby/shared/vault.rb +144 -0
- data/lib/farce/engine/ruby/shared/vault_weak_map.rb +336 -0
- data/lib/farce/engine/ruby/shared/weak_atom.rb +54 -0
- data/lib/farce/engine/ruby/shared/weak_map.rb +413 -0
- data/lib/farce/engine/ruby.rb +130 -0
- data/lib/farce/engine/shared/atom.rb +10 -0
- data/lib/farce/engine/shared/exchanger.rb +130 -0
- data/lib/farce/engine/shared/identity_key.rb +22 -0
- data/lib/farce/engine/shared/lease.rb +10 -0
- data/lib/farce/engine/shared/lease_pool.rb +10 -0
- data/lib/farce/engine/shared/main_scheduler.rb +20 -0
- data/lib/farce/engine/shared/map_key_coordination.rb +226 -0
- data/lib/farce/engine/shared/parallel_scheduler.rb +9 -0
- data/lib/farce/engine/shared/port.rb +44 -0
- data/lib/farce/engine/shared/portable_bounded_map.rb +619 -0
- data/lib/farce/engine/shared/proxy_owner.rb +43 -0
- data/lib/farce/engine/shared/queue.rb +233 -0
- data/lib/farce/engine/shared/ractor_methods.rb +73 -0
- data/lib/farce/engine/shared/rebindable.rb +15 -0
- data/lib/farce/engine/shared/strict_atom.rb +73 -0
- data/lib/farce/engine/shared/strict_map.rb +117 -0
- data/lib/farce/engine/shared/strict_queue_values.rb +27 -0
- data/lib/farce/engine/shared/strict_tree_map.rb +56 -0
- data/lib/farce/engine/shared/transaction_map_backend.rb +20 -0
- data/lib/farce/engine/shared/trie.rb +317 -0
- data/lib/farce/engine/shared/trie_builder.rb +199 -0
- data/lib/farce/engine/shared/unshareable.rb +14 -0
- data/lib/farce/engine/shared/unshared_atom.rb +256 -0
- data/lib/farce/engine/shared/unshared_priority_queue.rb +9 -0
- data/lib/farce/engine/shared/unshared_queue.rb +18 -0
- data/lib/farce/engine/shared/unshared_signal.rb +21 -0
- data/lib/farce/engine/shared/unshared_vector.rb +377 -0
- data/lib/farce/engine/shared/unshared_weak_atom.rb +30 -0
- data/lib/farce/engine/shared/unshared_weak_map.rb +445 -0
- data/lib/farce/engine/shared/vault.rb +31 -0
- data/lib/farce/engine/shared/vector.rb +83 -0
- data/lib/farce/engine/shared/weak_atom/base.rb +189 -0
- data/lib/farce/engine/shared/weak_atom.rb +20 -0
- data/lib/farce/engine/shared/weak_map/cell.rb +99 -0
- data/lib/farce/engine/shared/weak_map/index.rb +249 -0
- data/lib/farce/engine/shared/weak_map/lock.rb +80 -0
- data/lib/farce/engine/shared/weak_map/reference.rb +33 -0
- data/lib/farce/engine/shared.rb +63 -0
- data/lib/farce/engine/truffleruby/fiber_scheduler.rb +13 -0
- data/lib/farce/engine/truffleruby/lock.rb +121 -0
- data/lib/farce/engine/truffleruby/map.rb +656 -0
- data/lib/farce/engine/truffleruby/native/counter.rb +105 -0
- data/lib/farce/engine/truffleruby/native/flag.rb +77 -0
- data/lib/farce/engine/truffleruby/native/ordered_array_support.rb +67 -0
- data/lib/farce/engine/truffleruby/native/priority_queue.rb +388 -0
- data/lib/farce/engine/truffleruby/native/tree_map.rb +51 -0
- data/lib/farce/engine/truffleruby/native/unsafe_tree_map.rb +350 -0
- data/lib/farce/engine/truffleruby/signal.rb +77 -0
- data/lib/farce/engine/truffleruby.rb +148 -0
- data/lib/farce/envelope.rb +335 -0
- data/lib/farce/error.rb +35 -0
- data/lib/farce/exchanger.rb +41 -0
- data/lib/farce/flag.rb +27 -0
- data/lib/farce/integrations/active_support/blank.rb +68 -0
- data/lib/farce/integrations/active_support/clock.rb +17 -0
- data/lib/farce/integrations/active_support/duplicable.rb +78 -0
- data/lib/farce/integrations/active_support/map.rb +175 -0
- data/lib/farce/integrations/active_support/set.rb +60 -0
- data/lib/farce/integrations/active_support/value_serialization.rb +17 -0
- data/lib/farce/integrations/active_support/vector.rb +231 -0
- data/lib/farce/integrations/active_support.rb +9 -0
- data/lib/farce/integrations/activesupport.rb +5 -0
- data/lib/farce/integrations/bson.rb +108 -0
- data/lib/farce/integrations/cbor.rb +51 -0
- data/lib/farce/integrations/concurrent.rb +112 -0
- data/lib/farce/integrations/dry-types.rb +5 -0
- data/lib/farce/integrations/dry_types.rb +694 -0
- data/lib/farce/integrations/json.rb +7 -0
- data/lib/farce/integrations/msgpack.rb +112 -0
- data/lib/farce/integrations/oj.rb +69 -0
- data/lib/farce/integrations/psych.rb +191 -0
- data/lib/farce/integrations/ractor-sharing.rb +5 -0
- data/lib/farce/integrations/ractor-tmvar.rb +5 -0
- data/lib/farce/integrations/ractor_sharing.rb +172 -0
- data/lib/farce/integrations/ractor_tmvar.rb +64 -0
- data/lib/farce/integrations/shared/to_json.rb +42 -0
- data/lib/farce/integrations/sorted_set.rb +11 -0
- data/lib/farce/integrations/weakref.rb +38 -0
- data/lib/farce/integrations/yajl.rb +10 -0
- data/lib/farce/integrations.rb +156 -0
- data/lib/farce/internal/_frozen_config.rb +11 -0
- data/lib/farce/internal/autoloads.rb +47 -0
- data/lib/farce/internal/blocking_priority_queue.rb +122 -0
- data/lib/farce/internal/converter.rb +106 -0
- data/lib/farce/internal/copyable.rb +31 -0
- data/lib/farce/internal/delegation.rb +20 -0
- data/lib/farce/internal/external_transaction.rb +59 -0
- data/lib/farce/internal/fake_ractor.rb +179 -0
- data/lib/farce/internal/freeze.rb +118 -0
- data/lib/farce/internal/inspect.rb +157 -0
- data/lib/farce/internal/key_lock_map.rb +29 -0
- data/lib/farce/internal/key_normalizer.rb +289 -0
- data/lib/farce/internal/lease_initialization.rb +115 -0
- data/lib/farce/internal/lease_map.rb +441 -0
- data/lib/farce/internal/lease_pool_state.rb +228 -0
- data/lib/farce/internal/lease_state.rb +342 -0
- data/lib/farce/internal/lease_waiting.rb +13 -0
- data/lib/farce/internal/managed_queue.rb +26 -0
- data/lib/farce/internal/map_value_modes.rb +227 -0
- data/lib/farce/internal/marshal_support.rb +227 -0
- data/lib/farce/internal/mixin.rb +20 -0
- data/lib/farce/internal/mutable_ordered_key_lock_map.rb +63 -0
- data/lib/farce/internal/noncopyable.rb +17 -0
- data/lib/farce/internal/ordered_key_lock_map.rb +69 -0
- data/lib/farce/internal/pool_supervisor.rb +41 -0
- data/lib/farce/internal/pool_worker.rb +61 -0
- data/lib/farce/internal/portable_transaction/reservation_entry.rb +29 -0
- data/lib/farce/internal/portable_transaction/strong_map_entry.rb +137 -0
- data/lib/farce/internal/portable_transaction/strong_map_size_entry.rb +44 -0
- data/lib/farce/internal/portable_transaction/tree_entry.rb +64 -0
- data/lib/farce/internal/portable_transaction.rb +164 -0
- data/lib/farce/internal/proxy_owner_notifications.rb +29 -0
- data/lib/farce/internal/reservation_waiting.rb +24 -0
- data/lib/farce/internal/scheduled_task.rb +48 -0
- data/lib/farce/internal/scheduler_io.rb +171 -0
- data/lib/farce/internal/scheduler_lifecycle.rb +314 -0
- data/lib/farce/internal/select_scheduler.rb +235 -0
- data/lib/farce/internal/storage.rb +162 -0
- data/lib/farce/internal/strict_lease.rb +30 -0
- data/lib/farce/internal/strict_lease_map.rb +20 -0
- data/lib/farce/internal/strict_lease_pool.rb +29 -0
- data/lib/farce/internal/thread_pool.rb +166 -0
- data/lib/farce/internal/transaction_conflict.rb +9 -0
- data/lib/farce/internal/transaction_freeze_guard.rb +30 -0
- data/lib/farce/internal/transaction_map_snapshot.rb +123 -0
- data/lib/farce/internal/undefined.rb +22 -0
- data/lib/farce/internal/unshared_lease.rb +29 -0
- data/lib/farce/internal/unshared_lease_pool.rb +34 -0
- data/lib/farce/internal/unshared_queue_waiting.rb +28 -0
- data/lib/farce/internal/value_serialization.rb +13 -0
- data/lib/farce/internal/weak_map_value_modes.rb +58 -0
- data/lib/farce/internal/weak_mode_manager.rb +26 -0
- data/lib/farce/internal.rb +129 -0
- data/lib/farce/lazy.rb +100 -0
- data/lib/farce/lazy_ref.rb +40 -0
- data/lib/farce/lease.rb +28 -0
- data/lib/farce/lease_map.rb +34 -0
- data/lib/farce/lease_pool.rb +29 -0
- data/lib/farce/lfu_map.rb +53 -0
- data/lib/farce/local/atom.rb +23 -0
- data/lib/farce/local/counter.rb +88 -0
- data/lib/farce/local/flag.rb +65 -0
- data/lib/farce/local/lazy.rb +38 -0
- data/lib/farce/local/lazy_ref.rb +36 -0
- data/lib/farce/local/lease.rb +77 -0
- data/lib/farce/local/lease_map.rb +80 -0
- data/lib/farce/local/lease_pool.rb +38 -0
- data/lib/farce/local/lfu_map.rb +55 -0
- data/lib/farce/local/lru_map.rb +62 -0
- data/lib/farce/local/map.rb +47 -0
- data/lib/farce/local/molecule.rb +45 -0
- data/lib/farce/local/priority_queue.rb +53 -0
- data/lib/farce/local/queue.rb +32 -0
- data/lib/farce/local/scoped.rb +166 -0
- data/lib/farce/local/set.rb +18 -0
- data/lib/farce/local/sorted_set.rb +50 -0
- data/lib/farce/local/timer_queue.rb +41 -0
- data/lib/farce/local/tree_map.rb +47 -0
- data/lib/farce/local/vector.rb +30 -0
- data/lib/farce/local/weak_atom.rb +23 -0
- data/lib/farce/local/weak_key_map.rb +39 -0
- data/lib/farce/local/weak_map.rb +39 -0
- data/lib/farce/local/weak_set.rb +18 -0
- data/lib/farce/local/weak_value_map.rb +39 -0
- data/lib/farce/local.rb +35 -0
- data/lib/farce/lock.rb +54 -0
- data/lib/farce/lru_map.rb +63 -0
- data/lib/farce/map.rb +58 -0
- data/lib/farce/mode_manager.rb +142 -0
- data/lib/farce/molecule.rb +60 -0
- data/lib/farce/mutable.rb +171 -0
- data/lib/farce/pool.rb +332 -0
- data/lib/farce/port.rb +134 -0
- data/lib/farce/priority_queue.rb +70 -0
- data/lib/farce/proxy/register.rb +101 -0
- data/lib/farce/proxy/supervisor.rb +137 -0
- data/lib/farce/proxy/wrapper.rb +49 -0
- data/lib/farce/proxy.rb +291 -0
- data/lib/farce/queue.rb +60 -0
- data/lib/farce/ractor.rb +269 -0
- data/lib/farce/read_write_lock.rb +256 -0
- data/lib/farce/reference.rb +158 -0
- data/lib/farce/resolv/dns.rb +42 -0
- data/lib/farce/resolv.rb +85 -0
- data/lib/farce/scheduler.rb +536 -0
- data/lib/farce/set.rb +39 -0
- data/lib/farce/shareable.rb +150 -0
- data/lib/farce/signal.rb +97 -0
- data/lib/farce/sorted_set.rb +36 -0
- data/lib/farce/strict/atom.rb +34 -0
- data/lib/farce/strict/counter.rb +10 -0
- data/lib/farce/strict/exchanger.rb +25 -0
- data/lib/farce/strict/flag.rb +10 -0
- data/lib/farce/strict/lazy.rb +26 -0
- data/lib/farce/strict/lazy_ref.rb +26 -0
- data/lib/farce/strict/lease.rb +27 -0
- data/lib/farce/strict/lease_map.rb +33 -0
- data/lib/farce/strict/lease_pool.rb +28 -0
- data/lib/farce/strict/lfu_map.rb +27 -0
- data/lib/farce/strict/lru_map.rb +28 -0
- data/lib/farce/strict/map.rb +54 -0
- data/lib/farce/strict/molecule.rb +16 -0
- data/lib/farce/strict/port.rb +40 -0
- data/lib/farce/strict/priority_queue.rb +20 -0
- data/lib/farce/strict/queue.rb +17 -0
- data/lib/farce/strict/set.rb +14 -0
- data/lib/farce/strict/sorted_set.rb +19 -0
- data/lib/farce/strict/timer_queue.rb +13 -0
- data/lib/farce/strict/tree_map.rb +27 -0
- data/lib/farce/strict/vector.rb +24 -0
- data/lib/farce/strict/weak_atom.rb +31 -0
- data/lib/farce/strict/weak_key_map.rb +49 -0
- data/lib/farce/strict/weak_map.rb +49 -0
- data/lib/farce/strict/weak_set.rb +14 -0
- data/lib/farce/strict/weak_value_map.rb +48 -0
- data/lib/farce/strict.rb +28 -0
- data/lib/farce/system.rb +40 -0
- data/lib/farce/thread_scheduler.rb +70 -0
- data/lib/farce/timer_queue.rb +66 -0
- data/lib/farce/transaction/atom.rb +73 -0
- data/lib/farce/transaction/map.rb +25 -0
- data/lib/farce/transaction/map_operations.rb +143 -0
- data/lib/farce/transaction/molecule.rb +90 -0
- data/lib/farce/transaction/mutable.rb +61 -0
- data/lib/farce/transaction/set.rb +17 -0
- data/lib/farce/transaction/set_operations.rb +48 -0
- data/lib/farce/transaction/sorted_set.rb +18 -0
- data/lib/farce/transaction/tree_map.rb +78 -0
- data/lib/farce/transaction/vector.rb +139 -0
- data/lib/farce/transaction/wrapper.rb +202 -0
- data/lib/farce/transaction.rb +343 -0
- data/lib/farce/tree_map.rb +56 -0
- data/lib/farce/unsafe/lfu_map.rb +36 -0
- data/lib/farce/unsafe/lru_map.rb +36 -0
- data/lib/farce/unsafe/tree_map.rb +21 -0
- data/lib/farce/unsafe.rb +29 -0
- data/lib/farce/unshareable.rb +67 -0
- data/lib/farce/unshared/atom.rb +24 -0
- data/lib/farce/unshared/counter.rb +10 -0
- data/lib/farce/unshared/flag.rb +10 -0
- data/lib/farce/unshared/lazy.rb +38 -0
- data/lib/farce/unshared/lazy_ref.rb +26 -0
- data/lib/farce/unshared/lease.rb +27 -0
- data/lib/farce/unshared/lease_map.rb +26 -0
- data/lib/farce/unshared/lease_pool.rb +25 -0
- data/lib/farce/unshared/lfu_map.rb +20 -0
- data/lib/farce/unshared/lru_map.rb +20 -0
- data/lib/farce/unshared/map.rb +49 -0
- data/lib/farce/unshared/molecule.rb +16 -0
- data/lib/farce/unshared/priority_queue.rb +16 -0
- data/lib/farce/unshared/queue.rb +27 -0
- data/lib/farce/unshared/set.rb +14 -0
- data/lib/farce/unshared/sorted_set.rb +28 -0
- data/lib/farce/unshared/timer_queue.rb +16 -0
- data/lib/farce/unshared/tree_map.rb +21 -0
- data/lib/farce/unshared/vector.rb +19 -0
- data/lib/farce/unshared/weak_atom.rb +31 -0
- data/lib/farce/unshared/weak_key_map.rb +44 -0
- data/lib/farce/unshared/weak_map.rb +44 -0
- data/lib/farce/unshared/weak_set.rb +14 -0
- data/lib/farce/unshared/weak_value_map.rb +43 -0
- data/lib/farce/unshared.rb +28 -0
- data/lib/farce/vector.rb +228 -0
- data/lib/farce/version.rb +8 -0
- data/lib/farce/walker/definitions.rb +186 -0
- data/lib/farce/walker/modification.rb +355 -0
- data/lib/farce/walker.rb +319 -0
- data/lib/farce/weak_atom.rb +121 -0
- data/lib/farce/weak_key_map.rb +31 -0
- data/lib/farce/weak_map.rb +33 -0
- data/lib/farce/weak_ref.rb +67 -0
- data/lib/farce/weak_set.rb +82 -0
- data/lib/farce/weak_value.rb +195 -0
- data/lib/farce/weak_value_map.rb +32 -0
- data/lib/farce.rb +519 -0
- metadata +468 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# shareable_constant_value: literal
|
|
3
|
+
# warn_indent: true
|
|
4
|
+
|
|
5
|
+
module Farce
|
|
6
|
+
# A delegating reference to a Farce::Abstract::Value object.
|
|
7
|
+
# Marshal preserves the holder and wrapper without resolving the referenced value.
|
|
8
|
+
#
|
|
9
|
+
# @example
|
|
10
|
+
# atom = Farce::Atom.new(:example)
|
|
11
|
+
# ref = Farce::Reference.new(atom)
|
|
12
|
+
# ref == :example # => true
|
|
13
|
+
#
|
|
14
|
+
# atom.value = 42
|
|
15
|
+
#
|
|
16
|
+
# ref == :example # => false
|
|
17
|
+
# ref == 42 # => true
|
|
18
|
+
class Reference < BasicObject
|
|
19
|
+
class Deep < Reference
|
|
20
|
+
protected def method_missing(...) = @value.unwrap.__send__(...) # rubocop:disable Style/MissingRespondToMissing
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
module Inherited
|
|
24
|
+
define_method(:dup, ::Kernel.instance_method(:dup))
|
|
25
|
+
define_method(:clone, ::Kernel.instance_method(:clone))
|
|
26
|
+
define_method(:freeze, ::Kernel.instance_method(:freeze))
|
|
27
|
+
define_method(:frozen?, ::Kernel.instance_method(:frozen?))
|
|
28
|
+
define_method(:initialize_copy, ::Kernel.instance_method(:initialize_copy))
|
|
29
|
+
define_method(:initialize_dup, ::Kernel.instance_method(:initialize_dup))
|
|
30
|
+
define_method(:initialize_clone, ::Kernel.instance_method(:initialize_clone))
|
|
31
|
+
|
|
32
|
+
private :initialize_copy, :initialize_dup, :initialize_clone
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private_constant :Deep, :Inherited
|
|
36
|
+
include Inherited
|
|
37
|
+
include Internal::Delegation
|
|
38
|
+
|
|
39
|
+
# Creates a subclass of {Farce::Reference} that uses the given factory to create new values to reference
|
|
40
|
+
# automatically.
|
|
41
|
+
#
|
|
42
|
+
# @example Creating a class for a specific value type
|
|
43
|
+
# # Example class that turns its value into an uppercase string
|
|
44
|
+
# class UpcaseValue
|
|
45
|
+
# include Farce::Abstract::Value
|
|
46
|
+
# attr_reader :value
|
|
47
|
+
# def initialize(value) = @value = -(value.to_s.upcase)
|
|
48
|
+
# end
|
|
49
|
+
#
|
|
50
|
+
# # Create a reference class for UpcaseValue
|
|
51
|
+
# UpcaseRef = Farce::Reference[UpcaseValue]
|
|
52
|
+
#
|
|
53
|
+
# UpcaseRef.new("hello") == "HELLO" # => true
|
|
54
|
+
#
|
|
55
|
+
# @example Subclassing a generated reference class
|
|
56
|
+
# # This is useful if you want to add custom methods
|
|
57
|
+
# class UpcaseRef < Farce::Reference[UpcaseValue]
|
|
58
|
+
# def wordle_compatible? = size == 5
|
|
59
|
+
# end
|
|
60
|
+
def self.[](factory, deep: false)
|
|
61
|
+
raise ::ArgumentError, "factory must be a class" unless factory.is_a?(::Class)
|
|
62
|
+
raise ::ArgumentError, "factory must include Farce::Abstract::Value" unless factory < ::Farce::Abstract::Value
|
|
63
|
+
|
|
64
|
+
klass = ::Class.new(deep ? Deep : Reference)
|
|
65
|
+
klass.set_temporary_name("#{superclass.name}[#{factory.name}, deep: #{deep.inspect}]")
|
|
66
|
+
klass.instance_variable_set(:@value_factory, factory)
|
|
67
|
+
|
|
68
|
+
klass.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
|
69
|
+
def self.new(...) = super(value_factory.new(...))
|
|
70
|
+
def self.value_factory
|
|
71
|
+
return @value_factory if defined?(@value_factory) && @value_factory
|
|
72
|
+
superclass.value_factory
|
|
73
|
+
end
|
|
74
|
+
RUBY
|
|
75
|
+
|
|
76
|
+
klass.singleton_class.class_eval "undef []", __FILE__, __LINE__
|
|
77
|
+
klass
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Creates a new reference to the given value.
|
|
81
|
+
# @param value [Farce::Abstract::Value] the value to be referenced
|
|
82
|
+
# @param deep [Boolean] whether to resolve nested values (like an {Envelope} inside of an {Atom})
|
|
83
|
+
# @return [Farce::Reference] a new reference to the given value
|
|
84
|
+
# @see #initialize
|
|
85
|
+
def self.new(value, deep: false)
|
|
86
|
+
value = deref(value)
|
|
87
|
+
raise ::ArgumentError, "value must be a Farce::Abstract::Value" unless ::Farce::Abstract::Value === value
|
|
88
|
+
return super(value) unless self == Reference && deep
|
|
89
|
+
Deep.new(value)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# If reference is a {Farce::Reference}, dereference it to get the underlying {Farce::Abstract::Value value object}.
|
|
93
|
+
#
|
|
94
|
+
# @example
|
|
95
|
+
# ref = Farce::Reference.new(Farce::Atom.new(:example))
|
|
96
|
+
# ref == :example # => true
|
|
97
|
+
#
|
|
98
|
+
# atom = Farce::Reference.deref(ref)
|
|
99
|
+
# atom.value = 42
|
|
100
|
+
#
|
|
101
|
+
# ref == :example # => false
|
|
102
|
+
# ref == 42 # => true
|
|
103
|
+
#
|
|
104
|
+
# @return [Farce::Abstract::Value, BasicObject]
|
|
105
|
+
# the underlying value object, or the given reference if the argument is not a {Farce::Reference}
|
|
106
|
+
def self.deref(reference)
|
|
107
|
+
return reference unless Reference === reference
|
|
108
|
+
::Kernel.instance_method(:instance_variable_get).bind_call(reference, :@value)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# @overload initialize(value, deep: false)
|
|
112
|
+
# @param value [Farce::Abstract::Value] the value to be referenced
|
|
113
|
+
# @param deep [Boolean] whether to resolve nested values (like an {Envelope} inside of an {Atom})
|
|
114
|
+
def initialize(value) = @value = value
|
|
115
|
+
|
|
116
|
+
# @api private
|
|
117
|
+
def marshal_dump = [1, @value, ::Kernel.instance_method(:frozen?).bind_call(self)]
|
|
118
|
+
|
|
119
|
+
# @api private
|
|
120
|
+
def marshal_load(data)
|
|
121
|
+
@value, frozen = Internal::MarshalSupport.payload(data, 2)
|
|
122
|
+
::Kernel.instance_method(:freeze).bind_call(self) if frozen
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Marshal hook discovery must inspect this wrapper without resolving its target.
|
|
126
|
+
def respond_to?(name, include_private = false) # rubocop:disable Style/OptionalBooleanParameter
|
|
127
|
+
return true if name == :marshal_dump || name == :marshal_load
|
|
128
|
+
return false if Internal.marshal_protocol_method?(name)
|
|
129
|
+
method_missing(:respond_to?, name, include_private)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Replacing the holder's value can make this false again.
|
|
133
|
+
# @return [Boolean] whether this proxy and its current target are frozen
|
|
134
|
+
def frozen? = super && method_missing(:frozen?)
|
|
135
|
+
|
|
136
|
+
# Freeze the current target, then this proxy. The value holder may remain mutable.
|
|
137
|
+
# @return [self] this object
|
|
138
|
+
def freeze
|
|
139
|
+
method_missing(:freeze)
|
|
140
|
+
super
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
private
|
|
144
|
+
|
|
145
|
+
def initialize_dup(other)
|
|
146
|
+
super
|
|
147
|
+
@value = Reference.deref(other).dup
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def initialize_clone(other, freeze: nil)
|
|
151
|
+
super
|
|
152
|
+
@value = Reference.deref(other).clone
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Delegates all methods to the referenced value
|
|
156
|
+
def method_missing(...) = @value.value.__send__(...) # rubocop:disable Style/MissingRespondToMissing
|
|
157
|
+
end
|
|
158
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# shareable_constant_value: literal
|
|
3
|
+
# warn_indent: true
|
|
4
|
+
|
|
5
|
+
require "farce/internal/storage"
|
|
6
|
+
|
|
7
|
+
module Farce
|
|
8
|
+
module Resolv
|
|
9
|
+
# Ractor-compatible DNS resolver
|
|
10
|
+
class DNS < ::Resolv::DNS
|
|
11
|
+
include Internal::Noncopyable
|
|
12
|
+
|
|
13
|
+
# @api private
|
|
14
|
+
# Share reservations between threads in this Ractor without sharing mutable Ruby objects.
|
|
15
|
+
def self.allocate_request_id(host, port)
|
|
16
|
+
mutex, requests = Internal::Storage.store_if_absent(self) { [Thread::Mutex.new, {}] }
|
|
17
|
+
mutex.synchronize do
|
|
18
|
+
ids = (requests[[host, port]] ||= {})
|
|
19
|
+
loop do
|
|
20
|
+
id = random(0..65_535)
|
|
21
|
+
next if ids.key?(id)
|
|
22
|
+
ids[id] = true
|
|
23
|
+
break id
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @api private
|
|
29
|
+
# Release reservations when upstream Resolv closes a requester.
|
|
30
|
+
def self.free_request_id(host, port, id)
|
|
31
|
+
mutex, requests = Internal::Storage.store_if_absent(self) { [Thread::Mutex.new, {}] }
|
|
32
|
+
mutex.synchronize do
|
|
33
|
+
key = [host, port]
|
|
34
|
+
if ids = requests[key]
|
|
35
|
+
ids.delete(id)
|
|
36
|
+
requests.delete(key) if ids.empty?
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
data/lib/farce/resolv.rb
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# shareable_constant_value: literal
|
|
3
|
+
# warn_indent: true
|
|
4
|
+
|
|
5
|
+
require "resolv"
|
|
6
|
+
|
|
7
|
+
module Farce
|
|
8
|
+
# Small module wrapping Ruby's resolver in a way that permits it to be used outside of the main ractor.
|
|
9
|
+
# Just replace calls to `Resolv` with `Farce::Resolv`.
|
|
10
|
+
module Resolv
|
|
11
|
+
autoload :DNS, "farce/resolv/dns"
|
|
12
|
+
|
|
13
|
+
Hosts = ::Resolv::Hosts
|
|
14
|
+
VERSION = ::Resolv::VERSION
|
|
15
|
+
IDENTIFIER = Internal::Counter.new
|
|
16
|
+
DEFAULT_HOSTS = Ractor.make_shareable(::Resolv::Hosts::DefaultFileName, copy: true)
|
|
17
|
+
DEFAULT_CONFIG =
|
|
18
|
+
if RUBY_PLATFORM.match?(/mswin|mingw/)
|
|
19
|
+
Ractor.make_shareable(::Resolv::DNS::Config.default_config_hash, copy: true)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Patch only message IDs and request-ID storage, including standard Resolv callers.
|
|
23
|
+
module MessageExtension
|
|
24
|
+
def initialize(id = IDENTIFIER.add(1) & 0xffff) = super
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Upstream requesters name ::Resolv::DNS directly, so forward their ID calls.
|
|
28
|
+
module RequestIDExtension
|
|
29
|
+
def allocate_request_id(...) = DNS.allocate_request_id(...)
|
|
30
|
+
def free_request_id(...) = DNS.free_request_id(...)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
::Resolv::DNS::Message.prepend(MessageExtension)
|
|
34
|
+
::Resolv::DNS.singleton_class.prepend(RequestIDExtension)
|
|
35
|
+
private_constant :DEFAULT_CONFIG, :DEFAULT_HOSTS, :IDENTIFIER, :MessageExtension, :RequestIDExtension
|
|
36
|
+
|
|
37
|
+
# @return [::Resolv] the resolver instance for the current ractor
|
|
38
|
+
def self.resolver = Internal::Storage.store_if_absent(self) { new }
|
|
39
|
+
|
|
40
|
+
# @return [::Resolv] a new resolver instance
|
|
41
|
+
def self.new(resolvers = nil, **config)
|
|
42
|
+
if resolvers.nil? || resolvers.is_a?(Hash)
|
|
43
|
+
defaults = DEFAULT_CONFIG || DNS::Config.default_config_hash
|
|
44
|
+
config = defaults.merge(resolvers || config)
|
|
45
|
+
resolvers = [Hosts.new(DEFAULT_HOSTS), DNS.new(config)]
|
|
46
|
+
end
|
|
47
|
+
::Resolv.new(resolvers)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# @!method getaddress(name)
|
|
51
|
+
# @!scope class
|
|
52
|
+
# Resolves a hostname to its corresponding IP address.
|
|
53
|
+
# @param name [String] the name to resolve
|
|
54
|
+
# @return [String] the resolved address
|
|
55
|
+
# @!method getaddresses(name)
|
|
56
|
+
# @!scope class
|
|
57
|
+
# Resolves a hostname to its corresponding IP addresses.
|
|
58
|
+
# @param name [String] the name to resolve
|
|
59
|
+
# @return [Array<String>] the resolved addresses
|
|
60
|
+
# @!method each_address(name)
|
|
61
|
+
# @!scope class
|
|
62
|
+
# Resolves a hostname to its corresponding IP addresses one by one.
|
|
63
|
+
# @param name [String] the name to resolve
|
|
64
|
+
# @yield [address] each name corresponding to the given address
|
|
65
|
+
# @yieldparam address [String] the resolved address
|
|
66
|
+
# @!method getname(address)
|
|
67
|
+
# @!scope class
|
|
68
|
+
# Resolves an IP address to its corresponding host name.
|
|
69
|
+
# @param address [String] the address to resolve
|
|
70
|
+
# @return [String] the resolved name
|
|
71
|
+
# @!method getnames(address)
|
|
72
|
+
# @!scope class
|
|
73
|
+
# Resolves an IP address to its corresponding host names.
|
|
74
|
+
# @param address [String] the address to resolve
|
|
75
|
+
# @return [Array<String>] the resolved names
|
|
76
|
+
# @!method each_name(address)
|
|
77
|
+
# @!scope class
|
|
78
|
+
# Resolves an IP address to its corresponding host names one by one.
|
|
79
|
+
# @param address [String] the address to resolve
|
|
80
|
+
# @yield [name] each name corresponding to the given address
|
|
81
|
+
# @yieldparam name [String] the resolved name
|
|
82
|
+
Internal.delegate(singleton_class, :resolver, :getaddress, :getaddresses, :each_address, :getname, :getnames,
|
|
83
|
+
:each_name)
|
|
84
|
+
end
|
|
85
|
+
end
|