1'use strict'; 2 3var __fs__ = require('fs'); 4var __path__ = require('path'); 5var __util__ = require('util'); 6var __glob__ = require('glob'); 7var __os__ = require('os'); 8var __xmlhttprequest__ = require('unxhr'); 9 10(function(global_object) { 11 12 // @note 13 // A few conventions for the documentation of this file: 14 // 1. Always use "//" (in contrast with "/**/") 15 // 2. The syntax used is Yardoc (yardoc.org), which is intended for Ruby (se below) 16 // 3. `@param` and `@return` types should be preceded by `JS.` when referring to 17 // JavaScript constructors (e.g. `JS.Function`) otherwise Ruby is assumed. 18 // 4. `nil` and `null` being unambiguous refer to the respective 19 // objects/values in Ruby and JavaScript 20 // 5. This is still WIP :) so please give feedback and suggestions on how 21 // to improve or for alternative solutions 22 // 23 // The way the code is digested before going through Yardoc is a secret kept 24 // in the docs repo (https://github.com/opal/docs/tree/master). 25 26 var console; 27 28 // Detect the global object 29 if (typeof(globalThis) !== 'undefined') { global_object = globalThis; } 30 else if (typeof(global) !== 'undefined') { global_object = global; } 31 else if (typeof(window) !== 'undefined') { global_object = window; } 32 33 // Setup a dummy console object if missing 34 if (global_object.console == null) { 35 global_object.console = {}; 36 } 37 38 if (typeof(global_object.console) === 'object') { 39 console = global_object.console; 40 } else { 41 console = {}; 42 } 43 44 if (!('log' in console)) { console.log = function () {}; } 45 if (!('warn' in console)) { console.warn = console.log; } 46 47 if (typeof(global_object.Opal) !== 'undefined') { 48 console.warn('Opal already loaded. Loading twice can cause troubles, please fix your setup.'); 49 return global_object.Opal; 50 } 51 52 var nil; 53 54 // The actual class for BasicObject 55 var BasicObject; 56 57 // The actual Object class. 58 // The leading underscore is to avoid confusion with window.Object() 59 var _Object; 60 61 // The actual Module class 62 var Module; 63 64 // The actual Class class 65 var Class; 66 67 // The Opal.Opal class (helpers etc.) 68 var _Opal; 69 70 // The Kernel module 71 var Kernel; 72 73 // The Opal object that is exposed globally 74 var Opal = global_object.Opal = {}; 75 76 // This is a useful reference to global object inside ruby files 77 Opal.global = global_object; 78 79 // Configure runtime behavior with regards to require and unsupported features 80 Opal.config = { 81 missing_require_severity: 'error', // error, warning, ignore 82 unsupported_features_severity: 'warning', // error, warning, ignore 83 experimental_features_severity: 'warning',// warning, ignore 84 enable_stack_trace: true // true, false 85 }; 86 87 // Minify common function calls 88 var $call = Function.prototype.call; 89 var $bind = Function.prototype.bind; 90 var $has_own = Object.hasOwn || $call.bind(Object.prototype.hasOwnProperty); 91 var $set_proto = Object.setPrototypeOf; 92 var $slice = $call.bind(Array.prototype.slice); 93 var $splice = $call.bind(Array.prototype.splice); 94 95 // Nil object id is always 4 96 var nil_id = 4; 97 98 // Generates even sequential numbers greater than 4 99 // (nil_id) to serve as unique ids for ruby objects 100 var unique_id = nil_id; 101 102 // Return next unique id 103 function $uid() { 104 unique_id += 2; 105 return unique_id; 106 } Opal.uid = $uid; 107 108 // Retrieve or assign the id of an object 109 Opal.id = function(obj) { 110 if (obj.$$is_number) return (obj * 2)+1; 111 if (obj.$$id == null) { 112 $prop(obj, '$$id', $uid()); 113 } 114 return obj.$$id; 115 }; 116 117 // Globals table 118 var $gvars = Opal.gvars = {}; 119 120 // Exit function, this should be replaced by platform specific implementation 121 // (See nodejs and chrome for examples) 122 Opal.exit = function(status) { if ($gvars.DEBUG) console.log('Exited with status '+status); }; 123 124 // keeps track of exceptions for $! 125 Opal.exceptions = []; 126 127 // @private 128 // Pops an exception from the stack and updates `$!`. 129 Opal.pop_exception = function() { 130 var exception = Opal.exceptions.pop(); 131 if (exception) { 132 $gvars["!"] = exception; 133 $gvars["@"] = exception.$backtrace(); 134 } 135 else { 136 $gvars["!"] = $gvars["@"] = nil; 137 } 138 }; 139 140 // A helper function for raising things, that gracefully degrades if necessary 141 // functionality is not yet loaded. 142 function $raise(klass, message) { 143 // Raise Exception, so we can know that something wrong is going on. 144 if (!klass) klass = Opal.Exception || Error; 145 146 if (Kernel && Kernel.$raise) { 147 if (arguments.length > 2) { 148 Kernel.$raise(klass.$new.apply(klass, $slice(arguments, 1))); 149 } 150 else { 151 Kernel.$raise(klass, message); 152 } 153 } 154 else if (!klass.$new) { 155 throw new klass(message); 156 } 157 else { 158 throw klass.$new(message); 159 } 160 } 161 162 function $prop(object, name, initialValue) { 163 if (typeof(object) === "string") { 164 // Special case for: 165 // s = "string" 166 // def s.m; end 167 // String class is the only class that: 168 // + compiles to JS primitive 169 // + allows method definition directly on instances 170 // numbers, true, false and null do not support it. 171 object[name] = initialValue; 172 } else { 173 Object.defineProperty(object, name, { 174 value: initialValue, 175 enumerable: false, 176 configurable: true, 177 writable: true 178 }); 179 } 180 } 181 182 Opal.prop = $prop; 183 184 // @deprecated 185 Opal.defineProperty = Opal.prop; 186 187 Opal.slice = $slice; 188 189 // Helpers 190 // ----- 191 192 var $truthy = Opal.truthy = function(val) { 193 return false !== val && nil !== val && undefined !== val && null !== val && (!(val instanceof Boolean) || true === val.valueOf()); 194 }; 195 196 Opal.falsy = function(val) { 197 return !$truthy(val); 198 }; 199 200 Opal.type_error = function(object, type, method, coerced) { 201 object = object.$$class; 202 203 if (coerced && method) { 204 coerced = coerced.$$class; 205 $raise(Opal.TypeError, 206 "can't convert " + object + " into " + type + 207 " (" + object + "#" + method + " gives " + coerced + ")" 208 ); 209 } else { 210 $raise(Opal.TypeError, 211 "no implicit conversion of " + object + " into " + type 212 ); 213 } 214 }; 215 216 Opal.coerce_to = function(object, type, method, args) { 217 var body; 218 219 if (method === 'to_int' && type === Opal.Integer && object.$$is_number) 220 return object < 0 ? Math.ceil(object) : Math.floor(object); 221 222 if (method === 'to_str' && type === Opal.String && object.$$is_string) 223 return object; 224 225 if (Opal.is_a(object, type)) return object; 226 227 // Fast path for the most common situation 228 if (object['$respond_to?'].$$pristine && object.$method_missing.$$pristine) { 229 body = object[$jsid(method)]; 230 if (body == null || body.$$stub) Opal.type_error(object, type); 231 return body.apply(object, args); 232 } 233 234 if (!object['$respond_to?'](method)) { 235 Opal.type_error(object, type); 236 } 237 238 if (args == null) args = []; 239 return Opal.send(object, method, args); 240 }; 241 242 Opal.respond_to = function(obj, jsid, include_all) { 243 if (obj == null || !obj.$$class) return false; 244 include_all = !!include_all; 245 var body = obj[jsid]; 246 247 if (obj['$respond_to?'].$$pristine) { 248 if (typeof(body) === "function" && !body.$$stub) { 249 return true; 250 } 251 if (!obj['$respond_to_missing?'].$$pristine) { 252 return Opal.send(obj, obj['$respond_to_missing?'], [jsid.substr(1), include_all]); 253 } 254 } else { 255 return Opal.send(obj, obj['$respond_to?'], [jsid.substr(1), include_all]); 256 } 257 }; 258 259 // TracePoint support 260 // ------------------ 261 // 262 // Support for `TracePoint.trace(:class) do ... end` 263 Opal.trace_class = false; 264 Opal.tracers_for_class = []; 265 266 function invoke_tracers_for_class(klass_or_module) { 267 var i, ii, tracer; 268 269 for(i = 0, ii = Opal.tracers_for_class.length; i < ii; i++) { 270 tracer = Opal.tracers_for_class[i]; 271 tracer.trace_object = klass_or_module; 272 tracer.block.$call(tracer); 273 } 274 } 275 276 function handle_autoload(cref, name) { 277 if (!cref.$$autoload[name].loaded) { 278 cref.$$autoload[name].loaded = true; 279 try { 280 Opal.Kernel.$require(cref.$$autoload[name].path); 281 } catch (e) { 282 cref.$$autoload[name].exception = e; 283 throw e; 284 } 285 cref.$$autoload[name].required = true; 286 if (cref.$$const[name] != null) { 287 cref.$$autoload[name].success = true; 288 return cref.$$const[name]; 289 } 290 } else if (cref.$$autoload[name].loaded && !cref.$$autoload[name].required) { 291 if (cref.$$autoload[name].exception) { throw cref.$$autoload[name].exception; } 292 } 293 } 294 295 // Constants 296 // --------- 297 // 298 // For future reference: 299 // - The Rails autoloading guide (http://guides.rubyonrails.org/v5.0/autoloading_and_reloading_constants.html) 300 // - @ConradIrwin's 2012 post on “Everything you ever wanted to know about constant lookup in Ruby” (http://cirw.in/blog/constant-lookup.html) 301 // 302 // Legend of MRI concepts/names: 303 // - constant reference (cref): the module/class that acts as a namespace 304 // - nesting: the namespaces wrapping the current scope, e.g. nesting inside 305 // `module A; module B::C; end; end` is `[B::C, A]` 306 307 // Get the constant in the scope of the current cref 308 function const_get_name(cref, name) { 309 if (cref) { 310 if (cref.$$const[name] != null) { return cref.$$const[name]; } 311 if (cref.$$autoload && cref.$$autoload[name]) { 312 return handle_autoload(cref, name); 313 } 314 } 315 } 316 317 // Walk up the nesting array looking for the constant 318 function const_lookup_nesting(nesting, name) { 319 var i, ii, constant; 320 321 if (nesting.length === 0) return; 322 323 // If the nesting is not empty the constant is looked up in its elements 324 // and in order. The ancestors of those elements are ignored. 325 for (i = 0, ii = nesting.length; i < ii; i++) { 326 constant = nesting[i].$$const[name]; 327 if (constant != null) { 328 return constant; 329 } else if (nesting[i].$$autoload && nesting[i].$$autoload[name]) { 330 return handle_autoload(nesting[i], name); 331 } 332 } 333 } 334 335 // Walk up the ancestors chain looking for the constant 336 function const_lookup_ancestors(cref, name) { 337 var i, ii, ancestors; 338 339 if (cref == null) return; 340 341 ancestors = $ancestors(cref); 342 343 for (i = 0, ii = ancestors.length; i < ii; i++) { 344 if (ancestors[i].$$const && $has_own(ancestors[i].$$const, name)) { 345 return ancestors[i].$$const[name]; 346 } else if (ancestors[i].$$autoload && ancestors[i].$$autoload[name]) { 347 return handle_autoload(ancestors[i], name); 348 } 349 } 350 } 351 352 // Walk up Object's ancestors chain looking for the constant, 353 // but only if cref is missing or a module. 354 function const_lookup_Object(cref, name) { 355 if (cref == null || cref.$$is_module) { 356 return const_lookup_ancestors(_Object, name); 357 } 358 } 359 360 // Call const_missing if nothing else worked 361 function const_missing(cref, name) { 362 return (cref || _Object).$const_missing(name); 363 } 364 365 // Look for the constant just in the current cref or call `#const_missing` 366 Opal.const_get_local = function(cref, name, skip_missing) { 367 var result; 368 369 if (cref == null) return; 370 371 if (cref === '::') cref = _Object; 372 373 if (!cref.$$is_module && !cref.$$is_class) { 374 $raise(Opal.TypeError, cref.toString() + " is not a class/module"); 375 } 376 377 result = const_get_name(cref, name); 378 return result != null || skip_missing ? result : const_missing(cref, name); 379 }; 380 381 // Look for the constant relative to a cref or call `#const_missing` (when the 382 // constant is prefixed by `::`). 383 Opal.const_get_qualified = function(cref, name, skip_missing) { 384 var result, cache, cached, current_version = Opal.const_cache_version; 385 386 if (name == null) { 387 // A shortpath for calls like ::String => $$$("String") 388 result = const_get_name(_Object, cref); 389 390 if (result != null) return result; 391 return Opal.const_get_qualified(_Object, cref, skip_missing); 392 } 393 394 if (cref == null) return; 395 396 if (cref === '::') cref = _Object; 397 398 if (!cref.$$is_module && !cref.$$is_class) { 399 $raise(Opal.TypeError, cref.toString() + " is not a class/module"); 400 } 401 402 if ((cache = cref.$$const_cache) == null) { 403 $prop(cref, '$$const_cache', Object.create(null)); 404 cache = cref.$$const_cache; 405 } 406 cached = cache[name]; 407 408 if (cached == null || cached[0] !== current_version) { 409 ((result = const_get_name(cref, name)) != null) || 410 ((result = const_lookup_ancestors(cref, name)) != null); 411 cache[name] = [current_version, result]; 412 } else { 413 result = cached[1]; 414 } 415 416 return result != null || skip_missing ? result : const_missing(cref, name); 417 }; 418 419 // Initialize the top level constant cache generation counter 420 Opal.const_cache_version = 1; 421 422 // Look for the constant in the open using the current nesting and the nearest 423 // cref ancestors or call `#const_missing` (when the constant has no :: prefix). 424 Opal.const_get_relative = function(nesting, name, skip_missing) { 425 var cref = nesting[0], result, current_version = Opal.const_cache_version, cache, cached; 426 427 if ((cache = nesting.$$const_cache) == null) { 428 $prop(nesting, '$$const_cache', Object.create(null)); 429 cache = nesting.$$const_cache; 430 } 431 cached = cache[name]; 432 433 if (cached == null || cached[0] !== current_version) { 434 ((result = const_get_name(cref, name)) != null) || 435 ((result = const_lookup_nesting(nesting, name)) != null) || 436 ((result = const_lookup_ancestors(cref, name)) != null) || 437 ((result = const_lookup_Object(cref, name)) != null); 438 439 cache[name] = [current_version, result]; 440 } else { 441 result = cached[1]; 442 } 443 444 return result != null || skip_missing ? result : const_missing(cref, name); 445 }; 446 447 // Register the constant on a cref and opportunistically set the name of 448 // unnamed classes/modules. 449 function $const_set(cref, name, value) { 450 var new_const = true; 451 452 if (cref == null || cref === '::') cref = _Object; 453 454 if (value.$$is_a_module) { 455 if (value.$$name == null || value.$$name === nil) value.$$name = name; 456 if (value.$$base_module == null) value.$$base_module = cref; 457 } 458 459 cref.$$const = (cref.$$const || Object.create(null)); 460 461 if (name in cref.$$const || ("$$autoload" in cref && name in cref.$$autoload)) { 462 new_const = false; 463 } 464 465 cref.$$const[name] = value; 466 467 // Add a short helper to navigate constants manually. 468 // @example 469 // Opal.$$.Regexp.$$.IGNORECASE 470 cref.$$ = cref.$$const; 471 472 Opal.const_cache_version++; 473 474 // Expose top level constants onto the Opal object 475 if (cref === _Object) Opal[name] = value; 476 477 // Name new class directly onto current scope (Opal.Foo.Baz = klass) 478 $prop(cref, name, value); 479 480 if (new_const && cref.$const_added && !cref.$const_added.$$pristine) { 481 cref.$const_added(name); 482 } 483 484 return value; 485 } 486 Opal.const_set = $const_set; 487 488 // Get all the constants reachable from a given cref, by default will include 489 // inherited constants. 490 Opal.constants = function(cref, inherit) { 491 if (inherit == null) inherit = true; 492 493 var module, modules = [cref], i, ii, constants = {}, constant; 494 495 if (inherit) modules = modules.concat($ancestors(cref)); 496 if (inherit && cref.$$is_module) modules = modules.concat([Opal.Object]).concat($ancestors(Opal.Object)); 497 498 for (i = 0, ii = modules.length; i < ii; i++) { 499 module = modules[i]; 500 501 // Do not show Objects constants unless we're querying Object itself 502 if (cref !== _Object && module == _Object) break; 503 504 for (constant in module.$$const) { 505 constants[constant] = true; 506 } 507 if (module.$$autoload) { 508 for (constant in module.$$autoload) { 509 constants[constant] = true; 510 } 511 } 512 } 513 514 return Object.keys(constants); 515 }; 516 517 // Remove a constant from a cref. 518 Opal.const_remove = function(cref, name) { 519 Opal.const_cache_version++; 520 521 if (cref.$$const[name] != null) { 522 var old = cref.$$const[name]; 523 delete cref.$$const[name]; 524 return old; 525 } 526 527 if (cref.$$autoload && cref.$$autoload[name]) { 528 delete cref.$$autoload[name]; 529 return nil; 530 } 531 532 $raise(Opal.NameError, "constant "+cref+"::"+cref.$name()+" not defined"); 533 }; 534 535 // Generates a function that is a curried const_get_relative. 536 Opal.const_get_relative_factory = function(nesting) { 537 return function(name, skip_missing) { 538 return Opal.$$(nesting, name, skip_missing); 539 } 540 }; 541 542 // Setup some shortcuts to reduce compiled size 543 Opal.$$ = Opal.const_get_relative; 544 Opal.$$$ = Opal.const_get_qualified; 545 Opal.$r = Opal.const_get_relative_factory; 546 547 // Modules & Classes 548 // ----------------- 549 550 // A `class Foo; end` expression in ruby is compiled to call this runtime 551 // method which either returns an existing class of the given name, or creates 552 // a new class in the given `base` scope. 553 // 554 // If a constant with the given name exists, then we check to make sure that 555 // it is a class and also that the superclasses match. If either of these 556 // fail, then we raise a `TypeError`. Note, `superclass` may be null if one 557 // was not specified in the ruby code. 558 // 559 // We pass a constructor to this method of the form `function ClassName() {}` 560 // simply so that classes show up with nicely formatted names inside debuggers 561 // in the web browser (or node/sprockets). 562 // 563 // The `scope` is the current `self` value where the class is being created 564 // from. We use this to get the scope for where the class should be created. 565 // If `scope` is an object (not a class/module), we simple get its class and 566 // use that as the scope instead. 567 // 568 // @param scope [Object] where the class is being created 569 // @param superclass [Class,null] superclass of the new class (may be null) 570 // @param singleton [Boolean,null] a true value denotes we want to allocate 571 // a singleton 572 // 573 // @return new [Class] or existing ruby class 574 // 575 function $allocate_class(name, superclass, singleton) { 576 var klass; 577 578 if (superclass != null && superclass.$$bridge) { 579 // Inheritance from bridged classes requires 580 // calling original JS constructors 581 klass = function() { 582 var args = $slice(arguments), 583 self = new ($bind.apply(superclass.$$constructor, [null].concat(args)))(); 584 585 // and replacing a __proto__ manually 586 $set_proto(self, klass.$$prototype); 587 return self; 588 }; 589 } else { 590 klass = function(){}; 591 } 592 593 if (name && name !== nil) { 594 $prop(klass, 'displayName', '::'+name); 595 } 596 597 $prop(klass, '$$name', name); 598 $prop(klass, '$$constructor', klass); 599 $prop(klass, '$$prototype', klass.prototype); 600 $prop(klass, '$$const', {}); 601 $prop(klass, '$$is_class', true); 602 $prop(klass, '$$is_a_module', true); 603 $prop(klass, '$$super', superclass); 604 $prop(klass, '$$cvars', {}); 605 $prop(klass, '$$own_included_modules', []); 606 $prop(klass, '$$own_prepended_modules', []); 607 $prop(klass, '$$ancestors', []); 608 $prop(klass, '$$ancestors_cache_version', null); 609 $prop(klass, '$$subclasses', []); 610 611 $prop(klass.$$prototype, '$$class', klass); 612 613 // By default if there are no singleton class methods 614 // __proto__ is Class.prototype 615 // Later singleton methods generate a singleton_class 616 // and inject it into ancestors chain 617 if (Opal.Class) { 618 $set_proto(klass, Opal.Class.prototype); 619 } 620 621 if (superclass != null) { 622 $set_proto(klass.$$prototype, superclass.$$prototype); 623 624 if (singleton !== true) { 625 // Let's not forbid GC from cleaning up our 626 // subclasses. 627 if (typeof WeakRef !== 'undefined') { 628 // First, let's clean up our array from empty objects. 629 var i, subclass, rebuilt_subclasses = []; 630 for (i = 0; i < superclass.$$subclasses.length; i++) { 631 subclass = superclass.$$subclasses[i]; 632 if (subclass.deref() !== undefined) { 633 rebuilt_subclasses.push(subclass); 634 } 635 } 636 // Now, let's add our class. 637 rebuilt_subclasses.push(new WeakRef(klass)); 638 superclass.$$subclasses = rebuilt_subclasses; 639 } 640 else { 641 superclass.$$subclasses.push(klass); 642 } 643 } 644 645 if (superclass.$$meta) { 646 // If superclass has metaclass then we have explicitely inherit it. 647 Opal.build_class_singleton_class(klass); 648 } 649 } 650 651 return klass; 652 } Opal.allocate_class = $allocate_class; 653 654 655 function find_existing_class(scope, name) { 656 // Try to find the class in the current scope 657 var klass = const_get_name(scope, name); 658 659 // If the class exists in the scope, then we must use that 660 if (klass) { 661 // Make sure the existing constant is a class, or raise error 662 if (!klass.$$is_class) { 663 $raise(Opal.TypeError, name + " is not a class"); 664 } 665 666 return klass; 667 } 668 } 669 670 function ensureSuperclassMatch(klass, superclass) { 671 if (klass.$$super !== superclass) { 672 $raise(Opal.TypeError, "superclass mismatch for class " + klass.$$name); 673 } 674 } 675 676 Opal.klass = function(scope, superclass, name) { 677 var bridged; 678 679 if (scope == null || scope == '::') { 680 // Global scope 681 scope = _Object; 682 } else if (!scope.$$is_class && !scope.$$is_module) { 683 // Scope is an object, use its class 684 scope = scope.$$class; 685 } 686 687 // If the superclass is not an Opal-generated class then we're bridging a native JS class 688 if ( 689 superclass != null && (!superclass.hasOwnProperty || ( 690 superclass.hasOwnProperty && !superclass.hasOwnProperty('$$is_class') 691 )) 692 ) { 693 if (superclass.constructor && superclass.constructor.name == "Function") { 694 bridged = superclass; 695 superclass = _Object; 696 } else { 697 $raise(Opal.TypeError, "superclass must be a Class (" + ( 698 (superclass.constructor && (superclass.constructor.name || superclass.constructor.$$name)) || 699 typeof(superclass) 700 ) + " given)"); 701 } 702 } 703 704 var klass = find_existing_class(scope, name); 705 706 if (klass != null) { 707 if (superclass) { 708 // Make sure existing class has same superclass 709 ensureSuperclassMatch(klass, superclass); 710 } 711 } 712 else { 713 // Class doesn't exist, create a new one with given superclass... 714 715 // Not specifying a superclass means we can assume it to be Object 716 if (superclass == null) { 717 superclass = _Object; 718 } 719 720 // Create the class object (instance of Class) 721 klass = $allocate_class(name, superclass); 722 $const_set(scope, name, klass); 723 724 // Call .inherited() hook with new class on the superclass 725 if (superclass.$inherited) { 726 superclass.$inherited(klass); 727 } 728 729 if (bridged) { 730 Opal.bridge(bridged, klass); 731 } 732 } 733 734 if (Opal.trace_class) { invoke_tracers_for_class(klass); } 735 736 return klass; 737 }; 738 739 // Define new module (or return existing module). The given `scope` is basically 740 // the current `self` value the `module` statement was defined in. If this is 741 // a ruby module or class, then it is used, otherwise if the scope is a ruby 742 // object then that objects real ruby class is used (e.g. if the scope is the 743 // main object, then the top level `Object` class is used as the scope). 744 // 745 // If a module of the given name is already defined in the scope, then that 746 // instance is just returned. 747 // 748 // If there is a class of the given name in the scope, then an error is 749 // generated instead (cannot have a class and module of same name in same scope). 750 // 751 // Otherwise, a new module is created in the scope with the given name, and that 752 // new instance is returned back (to be referenced at runtime). 753 // 754 // @param scope [Module, Class] class or module this definition is inside 755 // @param id [String] the name of the new (or existing) module 756 // 757 // @return [Module] 758 function $allocate_module(name) { 759 var constructor = function(){}; 760 var module = constructor; 761 762 if (name) 763 $prop(constructor, 'displayName', name+'.constructor'); 764 765 $prop(module, '$$name', name); 766 $prop(module, '$$prototype', constructor.prototype); 767 $prop(module, '$$const', {}); 768 $prop(module, '$$is_module', true); 769 $prop(module, '$$is_a_module', true); 770 $prop(module, '$$cvars', {}); 771 $prop(module, '$$iclasses', []); 772 $prop(module, '$$own_included_modules', []); 773 $prop(module, '$$own_prepended_modules', []); 774 $prop(module, '$$ancestors', [module]); 775 $prop(module, '$$ancestors_cache_version', null); 776 777 $set_proto(module, Opal.Module.prototype); 778 779 return module; 780 } Opal.allocate_module = $allocate_module; 781 782 function find_existing_module(scope, name) { 783 var module = const_get_name(scope, name); 784 if (module == null && scope === _Object) module = const_lookup_ancestors(_Object, name); 785 786 if (module) { 787 if (!module.$$is_module && module !== _Object) { 788 $raise(Opal.TypeError, name + " is not a module"); 789 } 790 } 791 792 return module; 793 } 794 795 Opal.module = function(scope, name) { 796 var module; 797 798 if (scope == null || scope == '::') { 799 // Global scope 800 scope = _Object; 801 } else if (!scope.$$is_class && !scope.$$is_module) { 802 // Scope is an object, use its class 803 scope = scope.$$class; 804 } 805 806 module = find_existing_module(scope, name); 807 808 if (module == null) { 809 // Module doesnt exist, create a new one... 810 module = $allocate_module(name); 811 $const_set(scope, name, module); 812 } 813 814 if (Opal.trace_class) { invoke_tracers_for_class(module); } 815 816 return module; 817 }; 818 819 // Return the singleton class for the passed object. 820 // 821 // If the given object alredy has a singleton class, then it will be stored on 822 // the object as the `$$meta` property. If this exists, then it is simply 823 // returned back. 824 // 825 // Otherwise, a new singleton object for the class or object is created, set on 826 // the object at `$$meta` for future use, and then returned. 827 // 828 // @param object [Object] the ruby object 829 // @return [Class] the singleton class for object 830 Opal.get_singleton_class = function(object) { 831 if (object.$$is_number) { 832 $raise(Opal.TypeError, "can't define singleton"); 833 } 834 if (object.$$meta) { 835 return object.$$meta; 836 } 837 838 if (object.hasOwnProperty('$$is_class')) { 839 return Opal.build_class_singleton_class(object); 840 } else if (object.hasOwnProperty('$$is_module')) { 841 return Opal.build_module_singleton_class(object); 842 } else { 843 return Opal.build_object_singleton_class(object); 844 } 845 }; 846 847 // helper to set $$meta on klass, module or instance 848 function set_meta(obj, meta) { 849 if (obj.hasOwnProperty('$$meta')) { 850 obj.$$meta = meta; 851 } else { 852 $prop(obj, '$$meta', meta); 853 } 854 if (obj.$$frozen) { 855 // If a object is frozen (sealed), freeze $$meta too. 856 // No need to inject $$meta.$$prototype in the prototype chain, 857 // as $$meta cannot be modified anyway. 858 obj.$$meta.$freeze(); 859 } else { 860 $set_proto(obj, meta.$$prototype); 861 } 862 } 863 // Build the singleton class for an existing class. Class object are built 864 // with their singleton class already in the prototype chain and inheriting 865 // from their superclass object (up to `Class` itself). 866 // 867 // NOTE: Actually in MRI a class' singleton class inherits from its 868 // superclass' singleton class which in turn inherits from Class. 869 // 870 // @param klass [Class] 871 // @return [Class] 872 Opal.build_class_singleton_class = function(klass) { 873 if (klass.$$meta) { 874 return klass.$$meta; 875 } 876 877 // The singleton_class superclass is the singleton_class of its superclass; 878 // but BasicObject has no superclass (its `$$super` is null), thus we 879 // fallback on `Class`. 880 var superclass = klass === BasicObject ? Class : Opal.get_singleton_class(klass.$$super); 881 882 var meta = $allocate_class(null, superclass, true); 883 884 $prop(meta, '$$is_singleton', true); 885 $prop(meta, '$$singleton_of', klass); 886 set_meta(klass, meta); 887 // Restoring ClassName.class 888 $prop(klass, '$$class', Opal.Class); 889 890 return meta; 891 }; 892 893 Opal.build_module_singleton_class = function(mod) { 894 if (mod.$$meta) { 895 return mod.$$meta; 896 } 897 898 var meta = $allocate_class(null, Opal.Module, true); 899 900 $prop(meta, '$$is_singleton', true); 901 $prop(meta, '$$singleton_of', mod); 902 set_meta(mod, meta); 903 // Restoring ModuleName.class 904 $prop(mod, '$$class', Opal.Module); 905 906 return meta; 907 }; 908 909 // Build the singleton class for a Ruby (non class) Object. 910 // 911 // @param object [Object] 912 // @return [Class] 913 Opal.build_object_singleton_class = function(object) { 914 var superclass = object.$$class, 915 klass = $allocate_class(nil, superclass, true); 916 917 $prop(klass, '$$is_singleton', true); 918 $prop(klass, '$$singleton_of', object); 919 920 delete klass.$$prototype.$$class; 921 922 set_meta(object, klass); 923 924 return klass; 925 }; 926 927 Opal.is_method = function(prop) { 928 return (prop[0] === '$' && prop[1] !== '$'); 929 }; 930 931 Opal.instance_methods = function(mod) { 932 var exclude = [], results = [], ancestors = $ancestors(mod); 933 934 for (var i = 0, l = ancestors.length; i < l; i++) { 935 var ancestor = ancestors[i], 936 proto = ancestor.$$prototype; 937 938 if (proto.hasOwnProperty('$$dummy')) { 939 proto = proto.$$define_methods_on; 940 } 941 942 var props = Object.getOwnPropertyNames(proto); 943 944 for (var j = 0, ll = props.length; j < ll; j++) { 945 var prop = props[j]; 946 947 if (Opal.is_method(prop)) { 948 var method_name = prop.slice(1), 949 method = proto[prop]; 950 951 if (method.$$stub && exclude.indexOf(method_name) === -1) { 952 exclude.push(method_name); 953 } 954 955 if (!method.$$stub && results.indexOf(method_name) === -1 && exclude.indexOf(method_name) === -1) { 956 results.push(method_name); 957 } 958 } 959 } 960 } 961 962 return results; 963 }; 964 965 Opal.own_instance_methods = function(mod) { 966 var results = [], 967 proto = mod.$$prototype; 968 969 if (proto.hasOwnProperty('$$dummy')) { 970 proto = proto.$$define_methods_on; 971 } 972 973 var props = Object.getOwnPropertyNames(proto); 974 975 for (var i = 0, length = props.length; i < length; i++) { 976 var prop = props[i]; 977 978 if (Opal.is_method(prop)) { 979 var method = proto[prop]; 980 981 if (!method.$$stub) { 982 var method_name = prop.slice(1); 983 results.push(method_name); 984 } 985 } 986 } 987 988 return results; 989 }; 990 991 Opal.methods = function(obj) { 992 return Opal.instance_methods(obj.$$meta || obj.$$class); 993 }; 994 995 Opal.own_methods = function(obj) { 996 return obj.$$meta ? Opal.own_instance_methods(obj.$$meta) : []; 997 }; 998 999 Opal.receiver_methods = function(obj) { 1000 var mod = Opal.get_singleton_class(obj); 1001 var singleton_methods = Opal.own_instance_methods(mod); 1002 var instance_methods = Opal.own_instance_methods(mod.$$super); 1003 return singleton_methods.concat(instance_methods); 1004 }; 1005 1006 // Returns an object containing all pairs of names/values 1007 // for all class variables defined in provided +module+ 1008 // and its ancestors. 1009 // 1010 // @param module [Module] 1011 // @return [Object] 1012 Opal.class_variables = function(module) { 1013 var ancestors = $ancestors(module), 1014 i, length = ancestors.length, 1015 result = {}; 1016 1017 for (i = length - 1; i >= 0; i--) { 1018 var ancestor = ancestors[i]; 1019 1020 for (var cvar in ancestor.$$cvars) { 1021 result[cvar] = ancestor.$$cvars[cvar]; 1022 } 1023 } 1024 1025 return result; 1026 }; 1027 1028 // Sets class variable with specified +name+ to +value+ 1029 // in provided +module+ 1030 // 1031 // @param module [Module] 1032 // @param name [String] 1033 // @param value [Object] 1034 Opal.class_variable_set = function(module, name, value) { 1035 var ancestors = $ancestors(module), 1036 i, length = ancestors.length; 1037 1038 for (i = length - 2; i >= 0; i--) { 1039 var ancestor = ancestors[i]; 1040 1041 if ($has_own(ancestor.$$cvars, name)) { 1042 ancestor.$$cvars[name] = value; 1043 return value; 1044 } 1045 } 1046 1047 module.$$cvars[name] = value; 1048 1049 return value; 1050 }; 1051 1052 // Gets class variable with specified +name+ from provided +module+ 1053 // 1054 // @param module [Module] 1055 // @param name [String] 1056 Opal.class_variable_get = function(module, name, tolerant) { 1057 if ($has_own(module.$$cvars, name)) 1058 return module.$$cvars[name]; 1059 1060 var ancestors = $ancestors(module), 1061 i, length = ancestors.length; 1062 1063 for (i = 0; i < length; i++) { 1064 var ancestor = ancestors[i]; 1065 1066 if ($has_own(ancestor.$$cvars, name)) { 1067 return ancestor.$$cvars[name]; 1068 } 1069 } 1070 1071 if (!tolerant) 1072 $raise(Opal.NameError, 'uninitialized class variable '+name+' in '+module.$name()); 1073 1074 return nil; 1075 }; 1076 1077 function isRoot(proto) { 1078 return proto.hasOwnProperty('$$iclass') && proto.hasOwnProperty('$$root'); 1079 } 1080 1081 function own_included_modules(module) { 1082 var result = [], mod, proto = Object.getPrototypeOf(module.$$prototype); 1083 1084 while (proto) { 1085 if (proto.hasOwnProperty('$$class')) { 1086 // superclass 1087 break; 1088 } 1089 mod = protoToModule(proto); 1090 if (mod) { 1091 result.push(mod); 1092 } 1093 proto = Object.getPrototypeOf(proto); 1094 } 1095 1096 return result; 1097 } 1098 1099 function own_prepended_modules(module) { 1100 var result = [], mod, proto = Object.getPrototypeOf(module.$$prototype); 1101 1102 if (module.$$prototype.hasOwnProperty('$$dummy')) { 1103 while (proto) { 1104 if (proto === module.$$prototype.$$define_methods_on) { 1105 break; 1106 } 1107 1108 mod = protoToModule(proto); 1109 if (mod) { 1110 result.push(mod); 1111 } 1112 1113 proto = Object.getPrototypeOf(proto); 1114 } 1115 } 1116 1117 return result; 1118 } 1119 1120 1121 // The actual inclusion of a module into a class. 1122 // 1123 // ## Class `$$parent` and `iclass` 1124 // 1125 // To handle `super` calls, every class has a `$$parent`. This parent is 1126 // used to resolve the next class for a super call. A normal class would 1127 // have this point to its superclass. However, if a class includes a module 1128 // then this would need to take into account the module. The module would 1129 // also have to then point its `$$parent` to the actual superclass. We 1130 // cannot modify modules like this, because it might be included in more 1131 // then one class. To fix this, we actually insert an `iclass` as the class' 1132 // `$$parent` which can then point to the superclass. The `iclass` acts as 1133 // a proxy to the actual module, so the `super` chain can then search it for 1134 // the required method. 1135 // 1136 // @param module [Module] the module to include 1137 // @param includer [Module] the target class to include module into 1138 // @return [null] 1139 Opal.append_features = function(module, includer) { 1140 var module_ancestors = $ancestors(module); 1141 var iclasses = []; 1142 1143 if (module_ancestors.indexOf(includer) !== -1) { 1144 $raise(Opal.ArgumentError, 'cyclic include detected'); 1145 } 1146 1147 for (var i = 0, length = module_ancestors.length; i < length; i++) { 1148 var ancestor = module_ancestors[i], iclass = create_iclass(ancestor); 1149 $prop(iclass, '$$included', true); 1150 iclasses.push(iclass); 1151 } 1152 var includer_ancestors = $ancestors(includer), 1153 chain = chain_iclasses(iclasses), 1154 start_chain_after, 1155 end_chain_on; 1156 1157 if (includer_ancestors.indexOf(module) === -1) { 1158 // first time include 1159 1160 // includer -> chain.first -> ...chain... -> chain.last -> includer.parent 1161 start_chain_after = includer.$$prototype; 1162 end_chain_on = Object.getPrototypeOf(includer.$$prototype); 1163 } else { 1164 // The module has been already included, 1165 // we don't need to put it into the ancestors chain again, 1166 // but this module may have new included modules. 1167 // If it's true we need to copy them. 1168 // 1169 // The simplest way is to replace ancestors chain from 1170 // parent 1171 // | 1172 // `module` iclass (has a $$root flag) 1173 // | 1174 // ...previos chain of module.included_modules ... 1175 // | 1176 // "next ancestor" (has a $$root flag or is a real class) 1177 // 1178 // to 1179 // parent 1180 // | 1181 // `module` iclass (has a $$root flag) 1182 // | 1183 // ...regenerated chain of module.included_modules 1184 // | 1185 // "next ancestor" (has a $$root flag or is a real class) 1186 // 1187 // because there are no intermediate classes between `parent` and `next ancestor`. 1188 // It doesn't break any prototypes of other objects as we don't change class references. 1189 1190 var parent = includer.$$prototype, module_iclass = Object.getPrototypeOf(parent); 1191 1192 while (module_iclass != null) { 1193 if (module_iclass.$$module === module && isRoot(module_iclass)) { 1194 break; 1195 } 1196 1197 parent = module_iclass; 1198 module_iclass = Object.getPrototypeOf(module_iclass); 1199 } 1200 1201 if (module_iclass) { 1202 // module has been directly included 1203 var next_ancestor = Object.getPrototypeOf(module_iclass); 1204 1205 // skip non-root iclasses (that were recursively included) 1206 while (next_ancestor.hasOwnProperty('$$iclass') && !isRoot(next_ancestor)) { 1207 next_ancestor = Object.getPrototypeOf(next_ancestor); 1208 } 1209 1210 start_chain_after = parent; 1211 end_chain_on = next_ancestor; 1212 } else { 1213 // module has not been directly included but was in ancestor chain because it was included by another module 1214 // include it directly 1215 start_chain_after = includer.$$prototype; 1216 end_chain_on = Object.getPrototypeOf(includer.$$prototype); 1217 } 1218 } 1219 1220 $set_proto(start_chain_after, chain.first); 1221 $set_proto(chain.last, end_chain_on); 1222 1223 // recalculate own_included_modules cache 1224 includer.$$own_included_modules = own_included_modules(includer); 1225 1226 Opal.const_cache_version++; 1227 }; 1228 1229 Opal.prepend_features = function(module, prepender) { 1230 // Here we change the ancestors chain from 1231 // 1232 // prepender 1233 // | 1234 // parent 1235 // 1236 // to: 1237 // 1238 // dummy(prepender) 1239 // | 1240 // iclass(module) 1241 // | 1242 // iclass(prepender) 1243 // | 1244 // parent 1245 var module_ancestors = $ancestors(module); 1246 var iclasses = []; 1247 1248 if (module_ancestors.indexOf(prepender) !== -1) { 1249 $raise(Opal.ArgumentError, 'cyclic prepend detected'); 1250 } 1251 1252 for (var i = 0, length = module_ancestors.length; i < length; i++) { 1253 var ancestor = module_ancestors[i], iclass = create_iclass(ancestor); 1254 $prop(iclass, '$$prepended', true); 1255 iclasses.push(iclass); 1256 } 1257 1258 var chain = chain_iclasses(iclasses), 1259 dummy_prepender = prepender.$$prototype, 1260 previous_parent = Object.getPrototypeOf(dummy_prepender), 1261 prepender_iclass, 1262 start_chain_after, 1263 end_chain_on; 1264 1265 if (dummy_prepender.hasOwnProperty('$$dummy')) { 1266 // The module already has some prepended modules 1267 // which means that we don't need to make it "dummy" 1268 prepender_iclass = dummy_prepender.$$define_methods_on; 1269 } else { 1270 // Making the module "dummy" 1271 prepender_iclass = create_dummy_iclass(prepender); 1272 flush_methods_in(prepender); 1273 $prop(dummy_prepender, '$$dummy', true); 1274 $prop(dummy_prepender, '$$define_methods_on', prepender_iclass); 1275 1276 // Converting 1277 // dummy(prepender) -> previous_parent 1278 // to 1279 // dummy(prepender) -> iclass(prepender) -> previous_parent 1280 $set_proto(dummy_prepender, prepender_iclass); 1281 $set_proto(prepender_iclass, previous_parent); 1282 } 1283 1284 var prepender_ancestors = $ancestors(prepender); 1285 1286 if (prepender_ancestors.indexOf(module) === -1) { 1287 // first time prepend 1288 1289 start_chain_after = dummy_prepender; 1290 1291 // next $$root or prepender_iclass or non-$$iclass 1292 end_chain_on = Object.getPrototypeOf(dummy_prepender); 1293 while (end_chain_on != null) { 1294 if ( 1295 end_chain_on.hasOwnProperty('$$root') || 1296 end_chain_on === prepender_iclass || 1297 !end_chain_on.hasOwnProperty('$$iclass') 1298 ) { 1299 break; 1300 } 1301 1302 end_chain_on = Object.getPrototypeOf(end_chain_on); 1303 } 1304 } else { 1305 $raise(Opal.RuntimeError, "Prepending a module multiple times is not supported"); 1306 } 1307 1308 $set_proto(start_chain_after, chain.first); 1309 $set_proto(chain.last, end_chain_on); 1310 1311 // recalculate own_prepended_modules cache 1312 prepender.$$own_prepended_modules = own_prepended_modules(prepender); 1313 1314 Opal.const_cache_version++; 1315 }; 1316 1317 function flush_methods_in(module) { 1318 var proto = module.$$prototype, 1319 props = Object.getOwnPropertyNames(proto); 1320 1321 for (var i = 0; i < props.length; i++) { 1322 var prop = props[i]; 1323 if (Opal.is_method(prop)) { 1324 delete proto[prop]; 1325 } 1326 } 1327 } 1328 1329 function create_iclass(module) { 1330 var iclass = create_dummy_iclass(module); 1331 1332 if (module.$$is_module) { 1333 module.$$iclasses.push(iclass); 1334 } 1335 1336 return iclass; 1337 } 1338 1339 // Dummy iclass doesn't receive updates when the module gets a new method. 1340 function create_dummy_iclass(module) { 1341 var iclass = {}, 1342 proto = module.$$prototype; 1343 1344 if (proto.hasOwnProperty('$$dummy')) { 1345 proto = proto.$$define_methods_on; 1346 } 1347 1348 var props = Object.getOwnPropertyNames(proto), 1349 length = props.length, i; 1350 1351 for (i = 0; i < length; i++) { 1352 var prop = props[i]; 1353 $prop(iclass, prop, proto[prop]); 1354 } 1355 1356 $prop(iclass, '$$iclass', true); 1357 $prop(iclass, '$$module', module); 1358 1359 return iclass; 1360 } 1361 1362 function chain_iclasses(iclasses) { 1363 var length = iclasses.length, first = iclasses[0]; 1364 1365 $prop(first, '$$root', true); 1366 1367 if (length === 1) { 1368 return { first: first, last: first }; 1369 } 1370 1371 var previous = first; 1372 1373 for (var i = 1; i < length; i++) { 1374 var current = iclasses[i]; 1375 $set_proto(previous, current); 1376 previous = current; 1377 } 1378 1379 1380 return { first: iclasses[0], last: iclasses[length - 1] }; 1381 } 1382 1383 // For performance, some core Ruby classes are toll-free bridged to their 1384 // native JavaScript counterparts (e.g. a Ruby Array is a JavaScript Array). 1385 // 1386 // This method is used to setup a native constructor (e.g. Array), to have 1387 // its prototype act like a normal Ruby class. Firstly, a new Ruby class is 1388 // created using the native constructor so that its prototype is set as the 1389 // target for the new class. Note: all bridged classes are set to inherit 1390 // from Object. 1391 // 1392 // Example: 1393 // 1394 // Opal.bridge(self, Function); 1395 // 1396 // @param klass [Class] the Ruby class to bridge 1397 // @param constructor [JS.Function] native JavaScript constructor to use 1398 // @return [Class] returns the passed Ruby class 1399 // 1400 Opal.bridge = function(native_klass, klass) { 1401 if (native_klass.hasOwnProperty('$$bridge')) { 1402 $raise(Opal.ArgumentError, "already bridged"); 1403 } 1404 1405 // constructor is a JS function with a prototype chain like: 1406 // - constructor 1407 // - super 1408 // 1409 // What we need to do is to inject our class (with its prototype chain) 1410 // between constructor and super. For example, after injecting ::Object 1411 // into JS String we get: 1412 // 1413 // - constructor (window.String) 1414 // - Opal.Object 1415 // - Opal.Kernel 1416 // - Opal.BasicObject 1417 // - super (window.Object) 1418 // - null 1419 // 1420 $prop(native_klass, '$$bridge', klass); 1421 $set_proto(native_klass.prototype, (klass.$$super || Opal.Object).$$prototype); 1422 $prop(klass, '$$prototype', native_klass.prototype); 1423 1424 $prop(klass.$$prototype, '$$class', klass); 1425 $prop(klass, '$$constructor', native_klass); 1426 $prop(klass, '$$bridge', true); 1427 }; 1428 1429 function protoToModule(proto) { 1430 if (proto.hasOwnProperty('$$dummy')) { 1431 return; 1432 } else if (proto.hasOwnProperty('$$iclass')) { 1433 return proto.$$module; 1434 } else if (proto.hasOwnProperty('$$class')) { 1435 return proto.$$class; 1436 } 1437 } 1438 1439 function own_ancestors(module) { 1440 return module.$$own_prepended_modules.concat([module]).concat(module.$$own_included_modules); 1441 } 1442 1443 // The Array of ancestors for a given module/class 1444 function $ancestors(module) { 1445 if (!module) { return []; } 1446 1447 if (module.$$ancestors_cache_version === Opal.const_cache_version) { 1448 return module.$$ancestors; 1449 } 1450 1451 var result = [], i, mods, length; 1452 1453 for (i = 0, mods = own_ancestors(module), length = mods.length; i < length; i++) { 1454 result.push(mods[i]); 1455 } 1456 1457 if (module.$$super) { 1458 for (i = 0, mods = $ancestors(module.$$super), length = mods.length; i < length; i++) { 1459 result.push(mods[i]); 1460 } 1461 } 1462 1463 module.$$ancestors_cache_version = Opal.const_cache_version; 1464 module.$$ancestors = result; 1465 1466 return result; 1467 } Opal.ancestors = $ancestors; 1468 1469 Opal.included_modules = function(module) { 1470 var result = [], mod = null, proto = Object.getPrototypeOf(module.$$prototype); 1471 1472 for (; proto && Object.getPrototypeOf(proto); proto = Object.getPrototypeOf(proto)) { 1473 mod = protoToModule(proto); 1474 if (mod && mod.$$is_module && proto.$$iclass && proto.$$included) { 1475 result.push(mod); 1476 } 1477 } 1478 1479 return result; 1480 }; 1481 1482 1483 // Method Missing 1484 // -------------- 1485 1486 // Methods stubs are used to facilitate method_missing in opal. A stub is a 1487 // placeholder function which just calls `method_missing` on the receiver. 1488 // If no method with the given name is actually defined on an object, then it 1489 // is obvious to say that the stub will be called instead, and then in turn 1490 // method_missing will be called. 1491 // 1492 // When a file in ruby gets compiled to javascript, it includes a call to 1493 // this function which adds stubs for every method name in the compiled file. 1494 // It should then be safe to assume that method_missing will work for any 1495 // method call detected. 1496 // 1497 // Method stubs are added to the BasicObject prototype, which every other 1498 // ruby object inherits, so all objects should handle method missing. A stub 1499 // is only added if the given property name (method name) is not already 1500 // defined. 1501 // 1502 // Note: all ruby methods have a `$` prefix in javascript, so all stubs will 1503 // have this prefix as well (to make this method more performant). 1504 // 1505 // Opal.add_stubs("foo,bar,baz="); 1506 // 1507 // All stub functions will have a private `$$stub` property set to true so 1508 // that other internal methods can detect if a method is just a stub or not. 1509 // `Kernel#respond_to?` uses this property to detect a methods presence. 1510 // 1511 // @param stubs [Array] an array of method stubs to add 1512 // @return [undefined] 1513 Opal.add_stubs = function(stubs) { 1514 var proto = Opal.BasicObject.$$prototype; 1515 var stub, existing_method; 1516 stubs = stubs.split(','); 1517 1518 for (var i = 0, length = stubs.length; i < length; i++) { 1519 stub = $jsid(stubs[i]), existing_method = proto[stub]; 1520 1521 if (existing_method == null || existing_method.$$stub) { 1522 Opal.add_stub_for(proto, stub); 1523 } 1524 } 1525 }; 1526 1527 // Add a method_missing stub function to the given prototype for the 1528 // given name. 1529 // 1530 // @param prototype [Prototype] the target prototype 1531 // @param stub [String] stub name to add (e.g. "$foo") 1532 // @return [undefined] 1533 Opal.add_stub_for = function(prototype, stub) { 1534 // Opal.stub_for(stub) is the method_missing_stub 1535 $prop(prototype, stub, Opal.stub_for(stub)); 1536 }; 1537 1538 // Generate the method_missing stub for a given method name. 1539 // 1540 // @param method_name [String] The js-name of the method to stub (e.g. "$foo") 1541 // @return [undefined] 1542 Opal.stub_for = function(method_name) { 1543 1544 function method_missing_stub() { 1545 // Copy any given block onto the method_missing dispatcher 1546 this.$method_missing.$$p = method_missing_stub.$$p; 1547 1548 // Set block property to null ready for the next call (stop false-positives) 1549 method_missing_stub.$$p = null; 1550 1551 // call method missing with correct args (remove '$' prefix on method name) 1552 var args_ary = new Array(arguments.length); 1553 for(var i = 0, l = args_ary.length; i < l; i++) { args_ary[i] = arguments[i]; } 1554 1555 return this.$method_missing.apply(this, [method_name.slice(1)].concat(args_ary)); 1556 } 1557 1558 method_missing_stub.$$stub = true; 1559 1560 return method_missing_stub; 1561 }; 1562 1563 1564 // Methods 1565 // ------- 1566 1567 // Arity count error dispatcher for methods 1568 // 1569 // @param actual [Fixnum] number of arguments given to method 1570 // @param expected [Fixnum] expected number of arguments 1571 // @param object [Object] owner of the method +meth+ 1572 // @param meth [String] method name that got wrong number of arguments 1573 // @raise [ArgumentError] 1574 Opal.ac = function(actual, expected, object, meth) { 1575 var inspect = ''; 1576 if (object.$$is_a_module) { 1577 inspect += object.$$name + '.'; 1578 } 1579 else { 1580 inspect += object.$$class.$$name + '#'; 1581 } 1582 inspect += meth; 1583 1584 $raise(Opal.ArgumentError, '[' + inspect + '] wrong number of arguments (given ' + actual + ', expected ' + expected + ')'); 1585 }; 1586 1587 // Arity count error dispatcher for blocks 1588 // 1589 // @param actual [Fixnum] number of arguments given to block 1590 // @param expected [Fixnum] expected number of arguments 1591 // @param context [Object] context of the block definition 1592 // @raise [ArgumentError] 1593 Opal.block_ac = function(actual, expected, context) { 1594 var inspect = "`block in " + context + "'"; 1595 1596 $raise(Opal.ArgumentError, inspect + ': wrong number of arguments (given ' + actual + ', expected ' + expected + ')'); 1597 }; 1598 1599 function get_ancestors(obj) { 1600 if (obj.hasOwnProperty('$$meta') && obj.$$meta !== null) { 1601 return $ancestors(obj.$$meta); 1602 } else { 1603 return $ancestors(obj.$$class); 1604 } 1605 } 1606 // Super dispatcher 1607 Opal.find_super = function(obj, mid, current_func, defcheck, allow_stubs) { 1608 var jsid = $jsid(mid), ancestors, super_method; 1609 1610 ancestors = get_ancestors(obj); 1611 1612 var current_index = ancestors.indexOf(current_func.$$owner); 1613 1614 for (var i = current_index + 1; i < ancestors.length; i++) { 1615 var ancestor = ancestors[i], 1616 proto = ancestor.$$prototype; 1617 1618 if (proto.hasOwnProperty('$$dummy')) { 1619 proto = proto.$$define_methods_on; 1620 } 1621 1622 if (proto.hasOwnProperty(jsid)) { 1623 super_method = proto[jsid]; 1624 break; 1625 } 1626 } 1627 1628 if (!defcheck && super_method && super_method.$$stub && obj.$method_missing.$$pristine) { 1629 // method_missing hasn't been explicitly defined 1630 $raise(Opal.NoMethodError, 'super: no superclass method `'+mid+"' for "+obj, mid); 1631 } 1632 1633 return (super_method.$$stub && !allow_stubs) ? null : super_method; 1634 }; 1635 1636 // Iter dispatcher for super in a block 1637 Opal.find_block_super = function(obj, jsid, current_func, defcheck, implicit) { 1638 var call_jsid = jsid; 1639 1640 if (!current_func) { 1641 $raise(Opal.RuntimeError, "super called outside of method"); 1642 } 1643 1644 if (implicit && current_func.$$define_meth) { 1645 $raise(Opal.RuntimeError, 1646 "implicit argument passing of super from method defined by define_method() is not supported. " + 1647 "Specify all arguments explicitly" 1648 ); 1649 } 1650 1651 if (current_func.$$def) { 1652 call_jsid = current_func.$$jsid; 1653 } 1654 1655 return Opal.find_super(obj, call_jsid, current_func, defcheck); 1656 }; 1657 1658 // @deprecated 1659 Opal.find_super_dispatcher = Opal.find_super; 1660 1661 // @deprecated 1662 Opal.find_iter_super_dispatcher = Opal.find_block_super; 1663 1664 // handles yield calls for 1 yielded arg 1665 Opal.yield1 = function(block, arg) { 1666 if (typeof(block) !== "function") { 1667 $raise(Opal.LocalJumpError, "no block given"); 1668 } 1669 1670 var has_mlhs = block.$$has_top_level_mlhs_arg, 1671 has_trailing_comma = block.$$has_trailing_comma_in_args; 1672 1673 if (block.length > 1 || ((has_mlhs || has_trailing_comma) && block.length === 1)) { 1674 arg = Opal.to_ary(arg); 1675 } 1676 1677 if ((block.length > 1 || (has_trailing_comma && block.length === 1)) && arg.$$is_array) { 1678 return block.apply(null, arg); 1679 } 1680 else { 1681 return block(arg); 1682 } 1683 }; 1684 1685 // handles yield for > 1 yielded arg 1686 Opal.yieldX = function(block, args) { 1687 if (typeof(block) !== "function") { 1688 $raise(Opal.LocalJumpError, "no block given"); 1689 } 1690 1691 if (block.length > 1 && args.length === 1) { 1692 if (args[0].$$is_array) { 1693 return block.apply(null, args[0]); 1694 } 1695 } 1696 1697 if (!args.$$is_array) { 1698 var args_ary = new Array(args.length); 1699 for(var i = 0, l = args_ary.length; i < l; i++) { args_ary[i] = args[i]; } 1700 1701 return block.apply(null, args_ary); 1702 } 1703 1704 return block.apply(null, args); 1705 }; 1706 1707 // Finds the corresponding exception match in candidates. Each candidate can 1708 // be a value, or an array of values. Returns null if not found. 1709 Opal.rescue = function(exception, candidates) { 1710 for (var i = 0; i < candidates.length; i++) { 1711 var candidate = candidates[i]; 1712 1713 if (candidate.$$is_array) { 1714 var result = Opal.rescue(exception, candidate); 1715 1716 if (result) { 1717 return result; 1718 } 1719 } 1720 else if (candidate === Opal.JS.Error || candidate['$==='](exception)) { 1721 return candidate; 1722 } 1723 } 1724 1725 return null; 1726 }; 1727 1728 Opal.is_a = function(object, klass) { 1729 if (klass != null && object.$$meta === klass || object.$$class === klass) { 1730 return true; 1731 } 1732 1733 if (object.$$is_number && klass.$$is_number_class) { 1734 return (klass.$$is_integer_class) ? (object % 1) === 0 : true; 1735 } 1736 1737 var ancestors = $ancestors(object.$$is_class ? Opal.get_singleton_class(object) : (object.$$meta || object.$$class)); 1738 1739 return ancestors.indexOf(klass) !== -1; 1740 }; 1741 1742 // Helpers for extracting kwsplats 1743 // Used for: { **h } 1744 Opal.to_hash = function(value) { 1745 if (value.$$is_hash) { 1746 return value; 1747 } 1748 else if (value['$respond_to?']('to_hash', true)) { 1749 var hash = value.$to_hash(); 1750 if (hash.$$is_hash) { 1751 return hash; 1752 } 1753 else { 1754 $raise(Opal.TypeError, "Can't convert " + value.$$class + 1755 " to Hash (" + value.$$class + "#to_hash gives " + hash.$$class + ")"); 1756 } 1757 } 1758 else { 1759 $raise(Opal.TypeError, "no implicit conversion of " + value.$$class + " into Hash"); 1760 } 1761 }; 1762 1763 // Helpers for implementing multiple assignment 1764 // Our code for extracting the values and assigning them only works if the 1765 // return value is a JS array. 1766 // So if we get an Array subclass, extract the wrapped JS array from it 1767 1768 // Used for: a, b = something (no splat) 1769 Opal.to_ary = function(value) { 1770 if (value.$$is_array) { 1771 return value; 1772 } 1773 else if (value['$respond_to?']('to_ary', true)) { 1774 var ary = value.$to_ary(); 1775 if (ary === nil) { 1776 return [value]; 1777 } 1778 else if (ary.$$is_array) { 1779 return ary; 1780 } 1781 else { 1782 $raise(Opal.TypeError, "Can't convert " + value.$$class + 1783 " to Array (" + value.$$class + "#to_ary gives " + ary.$$class + ")"); 1784 } 1785 } 1786 else { 1787 return [value]; 1788 } 1789 }; 1790 1791 // Used for: a, b = *something (with splat) 1792 Opal.to_a = function(value) { 1793 if (value.$$is_array) { 1794 // A splatted array must be copied 1795 return value.slice(); 1796 } 1797 else if (value['$respond_to?']('to_a', true)) { 1798 var ary = value.$to_a(); 1799 if (ary === nil) { 1800 return [value]; 1801 } 1802 else if (ary.$$is_array) { 1803 return ary; 1804 } 1805 else { 1806 $raise(Opal.TypeError, "Can't convert " + value.$$class + 1807 " to Array (" + value.$$class + "#to_a gives " + ary.$$class + ")"); 1808 } 1809 } 1810 else { 1811 return [value]; 1812 } 1813 }; 1814 1815 // Used for extracting keyword arguments from arguments passed to 1816 // JS function. If provided +arguments+ list doesn't have a Hash 1817 // as a last item, returns a blank Hash. 1818 // 1819 // @param parameters [Array] 1820 // @return [Hash] 1821 // 1822 Opal.extract_kwargs = function(parameters) { 1823 var kwargs = parameters[parameters.length - 1]; 1824 if (kwargs != null && Opal.respond_to(kwargs, '$to_hash', true)) { 1825 $splice(parameters, parameters.length - 1); 1826 return kwargs; 1827 } 1828 }; 1829 1830 // Used to get a list of rest keyword arguments. Method takes the given 1831 // keyword args, i.e. the hash literal passed to the method containing all 1832 // keyword arguemnts passed to method, as well as the used args which are 1833 // the names of required and optional arguments defined. This method then 1834 // just returns all key/value pairs which have not been used, in a new 1835 // hash literal. 1836 // 1837 // @param given_args [Hash] all kwargs given to method 1838 // @param used_args [Object<String: true>] all keys used as named kwargs 1839 // @return [Hash] 1840 // 1841 Opal.kwrestargs = function(given_args, used_args) { 1842 var keys = [], 1843 map = {}, 1844 key , 1845 given_map = given_args.$$smap; 1846 1847 for (key in given_map) { 1848 if (!used_args[key]) { 1849 keys.push(key); 1850 map[key] = given_map[key]; 1851 } 1852 } 1853 1854 return Opal.hash2(keys, map); 1855 }; 1856 1857 function apply_blockopts(block, blockopts) { 1858 if (typeof(blockopts) === 'number') { 1859 block.$$arity = blockopts; 1860 } 1861 else if (typeof(blockopts) === 'object') { 1862 Object.assign(block, blockopts); 1863 } 1864 } 1865 1866 // Optimization for a costly operation of prepending '$' to method names 1867 var jsid_cache = {}; 1868 function $jsid(name) { 1869 return jsid_cache[name] || (jsid_cache[name] = '$' + name); 1870 } 1871 Opal.jsid = $jsid; 1872 1873 // Calls passed method on a ruby object with arguments and block: 1874 // 1875 // Can take a method or a method name. 1876 // 1877 // 1. When method name gets passed it invokes it by its name 1878 // and calls 'method_missing' when object doesn't have this method. 1879 // Used internally by Opal to invoke method that takes a block or a splat. 1880 // 2. When method (i.e. method body) gets passed, it doesn't trigger 'method_missing' 1881 // because it doesn't know the name of the actual method. 1882 // Used internally by Opal to invoke 'super'. 1883 // 1884 // @example 1885 // var my_array = [1, 2, 3, 4] 1886 // Opal.send(my_array, 'length') # => 4 1887 // Opal.send(my_array, my_array.$length) # => 4 1888 // 1889 // Opal.send(my_array, 'reverse!') # => [4, 3, 2, 1] 1890 // Opal.send(my_array, my_array['$reverse!']') # => [4, 3, 2, 1] 1891 // 1892 // @param recv [Object] ruby object 1893 // @param method [Function, String] method body or name of the method 1894 // @param args [Array] arguments that will be passed to the method call 1895 // @param block [Function] ruby block 1896 // @param blockopts [Object, Number] optional properties to set on the block 1897 // @return [Object] returning value of the method call 1898 Opal.send = function(recv, method, args, block, blockopts) { 1899 var body; 1900 1901 if (typeof(method) === 'function') { 1902 body = method; 1903 method = null; 1904 } else if (typeof(method) === 'string') { 1905 body = recv[$jsid(method)]; 1906 } else { 1907 $raise(Opal.NameError, "Passed method should be a string or a function"); 1908 } 1909 1910 return Opal.send2(recv, body, method, args, block, blockopts); 1911 }; 1912 1913 Opal.send2 = function(recv, body, method, args, block, blockopts) { 1914 if (body == null && method != null && recv.$method_missing) { 1915 body = recv.$method_missing; 1916 args = [method].concat(args); 1917 } 1918 1919 apply_blockopts(block, blockopts); 1920 1921 if (typeof block === 'function') body.$$p = block; 1922 return body.apply(recv, args); 1923 }; 1924 1925 Opal.refined_send = function(refinement_groups, recv, method, args, block, blockopts) { 1926 var i, j, k, ancestors, ancestor, refinements, refinement, refine_modules, refine_module, body; 1927 1928 ancestors = get_ancestors(recv); 1929 1930 // For all ancestors that there are, starting from the closest to the furthest... 1931 for (i = 0; i < ancestors.length; i++) { 1932 ancestor = Opal.id(ancestors[i]); 1933 1934 // For all refinement groups there are, starting from the closest scope to the furthest... 1935 for (j = 0; j < refinement_groups.length; j++) { 1936 refinements = refinement_groups[j]; 1937 1938 // For all refinements there are, starting from the last `using` call to the furthest... 1939 for (k = refinements.length - 1; k >= 0; k--) { 1940 refinement = refinements[k]; 1941 if (typeof refinement.$$refine_modules === 'undefined') continue; 1942 1943 // A single module being given as an argument of the `using` call contains multiple 1944 // refinement modules 1945 refine_modules = refinement.$$refine_modules; 1946 1947 // Does this module refine a given call for a given ancestor module? 1948 if (typeof refine_modules[ancestor] === 'undefined') continue; 1949 refine_module = refine_modules[ancestor]; 1950 1951 // Does this module define a method we want to call? 1952 if (typeof refine_module.$$prototype[$jsid(method)] !== 'undefined') { 1953 body = refine_module.$$prototype[$jsid(method)]; 1954 return Opal.send2(recv, body, method, args, block, blockopts); 1955 } 1956 } 1957 } 1958 } 1959 1960 return Opal.send(recv, method, args, block, blockopts); 1961 }; 1962 1963 Opal.lambda = function(block, blockopts) { 1964 block.$$is_lambda = true; 1965 1966 apply_blockopts(block, blockopts); 1967 1968 return block; 1969 }; 1970 1971 // Used to define methods on an object. This is a helper method, used by the 1972 // compiled source to define methods on special case objects when the compiler 1973 // can not determine the destination object, or the object is a Module 1974 // instance. This can get called by `Module#define_method` as well. 1975 // 1976 // ## Modules 1977 // 1978 // Any method defined on a module will come through this runtime helper. 1979 // The method is added to the module body, and the owner of the method is 1980 // set to be the module itself. This is used later when choosing which 1981 // method should show on a class if more than 1 included modules define 1982 // the same method. Finally, if the module is in `module_function` mode, 1983 // then the method is also defined onto the module itself. 1984 // 1985 // ## Classes 1986 // 1987 // This helper will only be called for classes when a method is being 1988 // defined indirectly; either through `Module#define_method`, or by a 1989 // literal `def` method inside an `instance_eval` or `class_eval` body. In 1990 // either case, the method is simply added to the class' prototype. A special 1991 // exception exists for `BasicObject` and `Object`. These two classes are 1992 // special because they are used in toll-free bridged classes. In each of 1993 // these two cases, extra work is required to define the methods on toll-free 1994 // bridged class' prototypes as well. 1995 // 1996 // ## Objects 1997 // 1998 // If a simple ruby object is the object, then the method is simply just 1999 // defined on the object as a singleton method. This would be the case when 2000 // a method is defined inside an `instance_eval` block. 2001 // 2002 // @param obj [Object, Class] the actual obj to define method for 2003 // @param jsid [String] the JavaScript friendly method name (e.g. '$foo') 2004 // @param body [JS.Function] the literal JavaScript function used as method 2005 // @param blockopts [Object, Number] optional properties to set on the body 2006 // @return [null] 2007 // 2008 Opal.def = function(obj, jsid, body, blockopts) { 2009 apply_blockopts(body, blockopts); 2010 2011 // Special case for a method definition in the 2012 // top-level namespace 2013 if (obj === Opal.top) { 2014 return Opal.defn(Opal.Object, jsid, body); 2015 } 2016 // if instance_eval is invoked on a module/class, it sets inst_eval_mod 2017 else if (!obj.$$eval && obj.$$is_a_module) { 2018 return Opal.defn(obj, jsid, body); 2019 } 2020 else { 2021 return Opal.defs(obj, jsid, body); 2022 } 2023 }; 2024 2025 // Define method on a module or class (see Opal.def). 2026 Opal.defn = function(module, jsid, body) { 2027 $deny_frozen_access(module); 2028 2029 body.displayName = jsid; 2030 body.$$owner = module; 2031 2032 var name = jsid.substr(1); 2033 2034 var proto = module.$$prototype; 2035 if (proto.hasOwnProperty('$$dummy')) { 2036 proto = proto.$$define_methods_on; 2037 } 2038 $prop(proto, jsid, body); 2039 2040 if (module.$$is_module) { 2041 if (module.$$module_function) { 2042 Opal.defs(module, jsid, body); 2043 } 2044 2045 for (var i = 0, iclasses = module.$$iclasses, length = iclasses.length; i < length; i++) { 2046 var iclass = iclasses[i]; 2047 $prop(iclass, jsid, body); 2048 } 2049 } 2050 2051 var singleton_of = module.$$singleton_of; 2052 if (module.$method_added && !module.$method_added.$$stub && !singleton_of) { 2053 module.$method_added(name); 2054 } 2055 else if (singleton_of && singleton_of.$singleton_method_added && !singleton_of.$singleton_method_added.$$stub) { 2056 singleton_of.$singleton_method_added(name); 2057 } 2058 2059 return name; 2060 }; 2061 2062 // Define a singleton method on the given object (see Opal.def). 2063 Opal.defs = function(obj, jsid, body, blockopts) { 2064 apply_blockopts(body, blockopts); 2065 2066 if (obj.$$is_string || obj.$$is_number) { 2067 $raise(Opal.TypeError, "can't define singleton"); 2068 } 2069 return Opal.defn(Opal.get_singleton_class(obj), jsid, body); 2070 }; 2071 2072 // Called from #remove_method. 2073 Opal.rdef = function(obj, jsid) { 2074 if (!$has_own(obj.$$prototype, jsid)) { 2075 $raise(Opal.NameError, "method '" + jsid.substr(1) + "' not defined in " + obj.$name()); 2076 } 2077 2078 delete obj.$$prototype[jsid]; 2079 2080 if (obj.$$is_singleton) { 2081 if (obj.$$prototype.$singleton_method_removed && !obj.$$prototype.$singleton_method_removed.$$stub) { 2082 obj.$$prototype.$singleton_method_removed(jsid.substr(1)); 2083 } 2084 } 2085 else { 2086 if (obj.$method_removed && !obj.$method_removed.$$stub) { 2087 obj.$method_removed(jsid.substr(1)); 2088 } 2089 } 2090 }; 2091 2092 // Called from #undef_method. 2093 Opal.udef = function(obj, jsid) { 2094 if (!obj.$$prototype[jsid] || obj.$$prototype[jsid].$$stub) { 2095 $raise(Opal.NameError, "method '" + jsid.substr(1) + "' not defined in " + obj.$name()); 2096 } 2097 2098 Opal.add_stub_for(obj.$$prototype, jsid); 2099 2100 if (obj.$$is_singleton) { 2101 if (obj.$$prototype.$singleton_method_undefined && !obj.$$prototype.$singleton_method_undefined.$$stub) { 2102 obj.$$prototype.$singleton_method_undefined(jsid.substr(1)); 2103 } 2104 } 2105 else { 2106 if (obj.$method_undefined && !obj.$method_undefined.$$stub) { 2107 obj.$method_undefined(jsid.substr(1)); 2108 } 2109 } 2110 }; 2111 2112 function is_method_body(body) { 2113 return (typeof(body) === "function" && !body.$$stub); 2114 } 2115 2116 Opal.alias = function(obj, name, old) { 2117 var id = $jsid(name), 2118 old_id = $jsid(old), 2119 body, 2120 alias; 2121 2122 // Aliasing on main means aliasing on Object... 2123 if (typeof obj.$$prototype === 'undefined') { 2124 obj = Opal.Object; 2125 } 2126 2127 body = obj.$$prototype[old_id]; 2128 2129 // When running inside #instance_eval the alias refers to class methods. 2130 if (obj.$$eval) { 2131 return Opal.alias(Opal.get_singleton_class(obj), name, old); 2132 } 2133 2134 if (!is_method_body(body)) { 2135 var ancestor = obj.$$super; 2136 2137 while (typeof(body) !== "function" && ancestor) { 2138 body = ancestor[old_id]; 2139 ancestor = ancestor.$$super; 2140 } 2141 2142 if (!is_method_body(body) && obj.$$is_module) { 2143 // try to look into Object 2144 body = Opal.Object.$$prototype[old_id]; 2145 } 2146 2147 if (!is_method_body(body)) { 2148 $raise(Opal.NameError, "undefined method `" + old + "' for class `" + obj.$name() + "'"); 2149 } 2150 } 2151 2152 // If the body is itself an alias use the original body 2153 // to keep the max depth at 1. 2154 if (body.$$alias_of) body = body.$$alias_of; 2155 2156 // We need a wrapper because otherwise properties 2157 // would be overwritten on the original body. 2158 alias = function() { 2159 var block = alias.$$p, args, i, ii; 2160 2161 args = new Array(arguments.length); 2162 for(i = 0, ii = arguments.length; i < ii; i++) { 2163 args[i] = arguments[i]; 2164 } 2165 2166 alias.$$p = null; 2167 2168 return Opal.send(this, body, args, block); 2169 }; 2170 2171 // Assign the 'length' value with defineProperty because 2172 // in strict mode the property is not writable. 2173 // It doesn't work in older browsers (like Chrome 38), where 2174 // an exception is thrown breaking Opal altogether. 2175 try { 2176 Object.defineProperty(alias, 'length', { value: body.length }); 2177 } catch (e) {} 2178 2179 // Try to make the browser pick the right name 2180 alias.displayName = name; 2181 2182 alias.$$arity = body.$$arity == null ? body.length : body.$$arity; 2183 alias.$$parameters = body.$$parameters; 2184 alias.$$source_location = body.$$source_location; 2185 alias.$$alias_of = body; 2186 alias.$$alias_name = name; 2187 2188 Opal.defn(obj, id, alias); 2189 2190 return obj; 2191 }; 2192 2193 Opal.alias_gvar = function(new_name, old_name) { 2194 Object.defineProperty($gvars, new_name, { 2195 configurable: true, 2196 enumerable: true, 2197 get: function() { 2198 return $gvars[old_name]; 2199 }, 2200 set: function(new_value) { 2201 $gvars[old_name] = new_value; 2202 } 2203 }); 2204 return nil; 2205 }; 2206 2207 Opal.alias_native = function(obj, name, native_name) { 2208 var id = $jsid(name), 2209 body = obj.$$prototype[native_name]; 2210 2211 if (typeof(body) !== "function" || body.$$stub) { 2212 $raise(Opal.NameError, "undefined native method `" + native_name + "' for class `" + obj.$name() + "'"); 2213 } 2214 2215 Opal.defn(obj, id, body); 2216 2217 return obj; 2218 }; 2219 2220 2221 // Hashes 2222 // ------ 2223 2224 Opal.hash_init = function(hash) { 2225 hash.$$smap = Object.create(null); 2226 hash.$$map = Object.create(null); 2227 hash.$$keys = []; 2228 }; 2229 2230 Opal.hash_clone = function(from_hash, to_hash) { 2231 to_hash.$$none = from_hash.$$none; 2232 to_hash.$$proc = from_hash.$$proc; 2233 2234 for (var i = 0, keys = from_hash.$$keys, smap = from_hash.$$smap, len = keys.length, key, value; i < len; i++) { 2235 key = keys[i]; 2236 2237 if (key.$$is_string) { 2238 value = smap[key]; 2239 } else { 2240 value = key.value; 2241 key = key.key; 2242 } 2243 2244 Opal.hash_put(to_hash, key, value); 2245 } 2246 }; 2247 2248 Opal.hash_put = function(hash, key, value) { 2249 if (key.$$is_string) { 2250 if (!$has_own(hash.$$smap, key)) { 2251 hash.$$keys.push(key); 2252 } 2253 hash.$$smap[key] = value; 2254 return; 2255 } 2256 2257 var key_hash, bucket, last_bucket; 2258 key_hash = hash.$$by_identity ? Opal.id(key) : key.$hash(); 2259 2260 if (!$has_own(hash.$$map, key_hash)) { 2261 bucket = {key: key, key_hash: key_hash, value: value}; 2262 hash.$$keys.push(bucket); 2263 hash.$$map[key_hash] = bucket; 2264 return; 2265 } 2266 2267 bucket = hash.$$map[key_hash]; 2268 2269 while (bucket) { 2270 if (key === bucket.key || key['$eql?'](bucket.key)) { 2271 last_bucket = undefined; 2272 bucket.value = value; 2273 break; 2274 } 2275 last_bucket = bucket; 2276 bucket = bucket.next; 2277 } 2278 2279 if (last_bucket) { 2280 bucket = {key: key, key_hash: key_hash, value: value}; 2281 hash.$$keys.push(bucket); 2282 last_bucket.next = bucket; 2283 } 2284 }; 2285 2286 Opal.hash_get = function(hash, key) { 2287 if (key.$$is_string) { 2288 if ($has_own(hash.$$smap, key)) { 2289 return hash.$$smap[key]; 2290 } 2291 return; 2292 } 2293 2294 var key_hash, bucket; 2295 key_hash = hash.$$by_identity ? Opal.id(key) : key.$hash(); 2296 2297 if ($has_own(hash.$$map, key_hash)) { 2298 bucket = hash.$$map[key_hash]; 2299 2300 while (bucket) { 2301 if (key === bucket.key || key['$eql?'](bucket.key)) { 2302 return bucket.value; 2303 } 2304 bucket = bucket.next; 2305 } 2306 } 2307 }; 2308 2309 Opal.hash_delete = function(hash, key) { 2310 var i, keys = hash.$$keys, length = keys.length, value, key_tmp; 2311 2312 if (key.$$is_string) { 2313 if (typeof key !== "string") key = key.valueOf(); 2314 2315 if (!$has_own(hash.$$smap, key)) { 2316 return; 2317 } 2318 2319 for (i = 0; i < length; i++) { 2320 key_tmp = keys[i]; 2321 2322 if (key_tmp.$$is_string && typeof key_tmp !== "string") { 2323 key_tmp = key_tmp.valueOf(); 2324 } 2325 2326 if (key_tmp === key) { 2327 keys.splice(i, 1); 2328 break; 2329 } 2330 } 2331 2332 value = hash.$$smap[key]; 2333 delete hash.$$smap[key]; 2334 return value; 2335 } 2336 2337 var key_hash = key.$hash(); 2338 2339 if (!$has_own(hash.$$map, key_hash)) { 2340 return; 2341 } 2342 2343 var bucket = hash.$$map[key_hash], last_bucket; 2344 2345 while (bucket) { 2346 if (key === bucket.key || key['$eql?'](bucket.key)) { 2347 value = bucket.value; 2348 2349 for (i = 0; i < length; i++) { 2350 if (keys[i] === bucket) { 2351 keys.splice(i, 1); 2352 break; 2353 } 2354 } 2355 2356 if (last_bucket && bucket.next) { 2357 last_bucket.next = bucket.next; 2358 } 2359 else if (last_bucket) { 2360 delete last_bucket.next; 2361 } 2362 else if (bucket.next) { 2363 hash.$$map[key_hash] = bucket.next; 2364 } 2365 else { 2366 delete hash.$$map[key_hash]; 2367 } 2368 2369 return value; 2370 } 2371 last_bucket = bucket; 2372 bucket = bucket.next; 2373 } 2374 }; 2375 2376 Opal.hash_rehash = function(hash) { 2377 for (var i = 0, length = hash.$$keys.length, key_hash, bucket, last_bucket; i < length; i++) { 2378 2379 if (hash.$$keys[i].$$is_string) { 2380 continue; 2381 } 2382 2383 key_hash = hash.$$keys[i].key.$hash(); 2384 2385 if (key_hash === hash.$$keys[i].key_hash) { 2386 continue; 2387 } 2388 2389 bucket = hash.$$map[hash.$$keys[i].key_hash]; 2390 last_bucket = undefined; 2391 2392 while (bucket) { 2393 if (bucket === hash.$$keys[i]) { 2394 if (last_bucket && bucket.next) { 2395 last_bucket.next = bucket.next; 2396 } 2397 else if (last_bucket) { 2398 delete last_bucket.next; 2399 } 2400 else if (bucket.next) { 2401 hash.$$map[hash.$$keys[i].key_hash] = bucket.next; 2402 } 2403 else { 2404 delete hash.$$map[hash.$$keys[i].key_hash]; 2405 } 2406 break; 2407 } 2408 last_bucket = bucket; 2409 bucket = bucket.next; 2410 } 2411 2412 hash.$$keys[i].key_hash = key_hash; 2413 2414 if (!$has_own(hash.$$map, key_hash)) { 2415 hash.$$map[key_hash] = hash.$$keys[i]; 2416 continue; 2417 } 2418 2419 bucket = hash.$$map[key_hash]; 2420 last_bucket = undefined; 2421 2422 while (bucket) { 2423 if (bucket === hash.$$keys[i]) { 2424 last_bucket = undefined; 2425 break; 2426 } 2427 last_bucket = bucket; 2428 bucket = bucket.next; 2429 } 2430 2431 if (last_bucket) { 2432 last_bucket.next = hash.$$keys[i]; 2433 } 2434 } 2435 }; 2436 2437 Opal.hash = function() { 2438 var arguments_length = arguments.length, args, hash, i, length, key, value; 2439 2440 if (arguments_length === 1 && arguments[0].$$is_hash) { 2441 return arguments[0]; 2442 } 2443 2444 hash = new Opal.Hash(); 2445 Opal.hash_init(hash); 2446 2447 if (arguments_length === 1) { 2448 args = arguments[0]; 2449 2450 if (arguments[0].$$is_array) { 2451 length = args.length; 2452 2453 for (i = 0; i < length; i++) { 2454 if (args[i].length !== 2) { 2455 $raise(Opal.ArgumentError, "value not of length 2: " + args[i].$inspect()); 2456 } 2457 2458 key = args[i][0]; 2459 value = args[i][1]; 2460 2461 Opal.hash_put(hash, key, value); 2462 } 2463 2464 return hash; 2465 } 2466 else { 2467 args = arguments[0]; 2468 for (key in args) { 2469 if ($has_own(args, key)) { 2470 value = args[key]; 2471 2472 Opal.hash_put(hash, key, value); 2473 } 2474 } 2475 2476 return hash; 2477 } 2478 } 2479 2480 if (arguments_length % 2 !== 0) { 2481 $raise(Opal.ArgumentError, "odd number of arguments for Hash"); 2482 } 2483 2484 for (i = 0; i < arguments_length; i += 2) { 2485 key = arguments[i]; 2486 value = arguments[i + 1]; 2487 2488 Opal.hash_put(hash, key, value); 2489 } 2490 2491 return hash; 2492 }; 2493 2494 // A faster Hash creator for hashes that just use symbols and 2495 // strings as keys. The map and keys array can be constructed at 2496 // compile time, so they are just added here by the constructor 2497 // function. 2498 // 2499 Opal.hash2 = function(keys, smap) { 2500 var hash = new Opal.Hash(); 2501 2502 hash.$$smap = smap; 2503 hash.$$map = Object.create(null); 2504 hash.$$keys = keys; 2505 2506 return hash; 2507 }; 2508 2509 // Create a new range instance with first and last values, and whether the 2510 // range excludes the last value. 2511 // 2512 Opal.range = function(first, last, exc) { 2513 var range = new Opal.Range(); 2514 range.begin = first; 2515 range.end = last; 2516 range.excl = exc; 2517 2518 return range; 2519 }; 2520 2521 var reserved_ivar_names = [ 2522 // properties 2523 "constructor", "displayName", "__count__", "__noSuchMethod__", 2524 "__parent__", "__proto__", 2525 // methods 2526 "hasOwnProperty", "valueOf" 2527 ]; 2528 2529 // Get the ivar name for a given name. 2530 // Mostly adds a trailing $ to reserved names. 2531 // 2532 Opal.ivar = function(name) { 2533 if (reserved_ivar_names.indexOf(name) !== -1) { 2534 name += "$"; 2535 } 2536 2537 return name; 2538 }; 2539 2540 // Support for #freeze 2541 // ------------------- 2542 2543 // helper that can be used from methods 2544 function $deny_frozen_access(obj) { 2545 if (obj.$$frozen) { 2546 $raise(Opal.FrozenError, "can't modify frozen " + (obj.$class()) + ": " + (obj), Opal.hash2(["receiver"], {"receiver": obj})); 2547 } 2548 } Opal.deny_frozen_access = $deny_frozen_access; 2549 2550 // common #freeze runtime support 2551 Opal.freeze = function(obj) { 2552 $prop(obj, "$$frozen", true); 2553 2554 // set $$id 2555 if (!obj.hasOwnProperty('$$id')) { $prop(obj, '$$id', $uid()); } 2556 2557 if (obj.hasOwnProperty('$$meta')) { 2558 // freeze $$meta if it has already been set 2559 obj.$$meta.$freeze(); 2560 } else { 2561 // ensure $$meta can be set lazily, $$meta is frozen when set in runtime.js 2562 $prop(obj, '$$meta', null); 2563 } 2564 2565 // $$comparable is used internally and set multiple times 2566 // defining it before sealing ensures it can be modified later on 2567 if (!obj.hasOwnProperty('$$comparable')) { $prop(obj, '$$comparable', null); } 2568 2569 // seal the Object 2570 Object.seal(obj); 2571 2572 return obj; 2573 }; 2574 2575 // freze props, make setters of instance variables throw FrozenError 2576 Opal.freeze_props = function(obj) { 2577 var prop, prop_type, desc; 2578 2579 for(prop in obj) { 2580 prop_type = typeof(prop); 2581 2582 // prop_type "object" here is a String(), skip $ props 2583 if ((prop_type === "string" || prop_type === "object") && prop[0] === '$') { 2584 continue; 2585 } 2586 2587 desc = Object.getOwnPropertyDescriptor(obj, prop); 2588 if (desc && desc.enumerable && desc.writable) { 2589 // create closure to retain current value as cv 2590 // for Opal 2.0 let for cv should do the trick, instead of a function 2591 (function() { 2592 // set v to undefined, as if the property is not set 2593 var cv = obj[prop]; 2594 Object.defineProperty(obj, prop, { 2595 get: function() { return cv; }, 2596 set: function(_val) { $deny_frozen_access(obj); }, 2597 enumerable: true 2598 }); 2599 })(); 2600 } 2601 } 2602 }; 2603 2604 // Regexps 2605 // ------- 2606 2607 // Escape Regexp special chars letting the resulting string be used to build 2608 // a new Regexp. 2609 // 2610 Opal.escape_regexp = function(str) { 2611 return str.replace(/([-[\]\/{}()*+?.^$\\| ])/g, '\\$1') 2612 .replace(/[\n]/g, '\\n') 2613 .replace(/[\r]/g, '\\r') 2614 .replace(/[\f]/g, '\\f') 2615 .replace(/[\t]/g, '\\t'); 2616 }; 2617 2618 // Create a global Regexp from a RegExp object and cache the result 2619 // on the object itself ($$g attribute). 2620 // 2621 Opal.global_regexp = function(pattern) { 2622 if (pattern.global) { 2623 return pattern; // RegExp already has the global flag 2624 } 2625 if (pattern.$$g == null) { 2626 pattern.$$g = new RegExp(pattern.source, (pattern.multiline ? 'gm' : 'g') + (pattern.ignoreCase ? 'i' : '')); 2627 } else { 2628 pattern.$$g.lastIndex = null; // reset lastIndex property 2629 } 2630 return pattern.$$g; 2631 }; 2632 2633 // Create a global multiline Regexp from a RegExp object and cache the result 2634 // on the object itself ($$gm or $$g attribute). 2635 // 2636 Opal.global_multiline_regexp = function(pattern) { 2637 var result, flags; 2638 2639 // RegExp already has the global and multiline flag 2640 if (pattern.global && pattern.multiline) return pattern; 2641 2642 flags = 'gm' + (pattern.ignoreCase ? 'i' : ''); 2643 if (pattern.multiline) { 2644 // we are using the $$g attribute because the Regexp is already multiline 2645 if (pattern.$$g == null) { 2646 pattern.$$g = new RegExp(pattern.source, flags); 2647 } 2648 result = pattern.$$g; 2649 } else { 2650 if (pattern.$$gm == null) { 2651 pattern.$$gm = new RegExp(pattern.source, flags); 2652 } 2653 result = pattern.$$gm; 2654 } 2655 result.lastIndex = null; // reset lastIndex property 2656 return result; 2657 }; 2658 2659 // Combine multiple regexp parts together 2660 Opal.regexp = function(parts, flags) { 2661 var part; 2662 var ignoreCase = typeof flags !== 'undefined' && flags && flags.indexOf('i') >= 0; 2663 2664 for (var i = 0, ii = parts.length; i < ii; i++) { 2665 part = parts[i]; 2666 if (part instanceof RegExp) { 2667 if (part.ignoreCase !== ignoreCase) 2668 Opal.Kernel.$warn( 2669 "ignore case doesn't match for " + part.source.$inspect(), 2670 Opal.hash({uplevel: 1}) 2671 ); 2672 2673 part = part.source; 2674 } 2675 if (part === '') part = '(?:' + part + ')'; 2676 parts[i] = part; 2677 } 2678 2679 if (flags) { 2680 return new RegExp(parts.join(''), flags); 2681 } else { 2682 return new RegExp(parts.join('')); 2683 } 2684 }; 2685 2686 // Require system 2687 // -------------- 2688 2689 Opal.modules = {}; 2690 Opal.loaded_features = ['corelib/runtime']; 2691 Opal.current_dir = '.'; 2692 Opal.require_table = {'corelib/runtime': true}; 2693 2694 Opal.normalize = function(path) { 2695 var parts, part, new_parts = [], SEPARATOR = '/'; 2696 2697 if (Opal.current_dir !== '.') { 2698 path = Opal.current_dir.replace(/\/*$/, '/') + path; 2699 } 2700 2701 path = path.replace(/^\.\//, ''); 2702 path = path.replace(/\.(rb|opal|js)$/, ''); 2703 parts = path.split(SEPARATOR); 2704 2705 for (var i = 0, ii = parts.length; i < ii; i++) { 2706 part = parts[i]; 2707 if (part === '') continue; 2708 (part === '..') ? new_parts.pop() : new_parts.push(part); 2709 } 2710 2711 return new_parts.join(SEPARATOR); 2712 }; 2713 2714 Opal.loaded = function(paths) { 2715 var i, l, path; 2716 2717 for (i = 0, l = paths.length; i < l; i++) { 2718 path = Opal.normalize(paths[i]); 2719 2720 if (Opal.require_table[path]) { 2721 continue; 2722 } 2723 2724 Opal.loaded_features.push(path); 2725 Opal.require_table[path] = true; 2726 } 2727 }; 2728 2729 Opal.load_normalized = function(path) { 2730 Opal.loaded([path]); 2731 2732 var module = Opal.modules[path]; 2733 2734 if (module) { 2735 var retval = module(Opal); 2736 if (typeof Promise !== 'undefined' && retval instanceof Promise) { 2737 // A special case of require having an async top: 2738 // We will need to await it. 2739 return retval.then($return_val(true)); 2740 } 2741 } 2742 else { 2743 var severity = Opal.config.missing_require_severity; 2744 var message = 'cannot load such file -- ' + path; 2745 2746 if (severity === "error") { 2747 $raise(Opal.LoadError, message); 2748 } 2749 else if (severity === "warning") { 2750 console.warn('WARNING: LoadError: ' + message); 2751 } 2752 } 2753 2754 return true; 2755 }; 2756 2757 Opal.load = function(path) { 2758 path = Opal.normalize(path); 2759 2760 return Opal.load_normalized(path); 2761 }; 2762 2763 Opal.require = function(path) { 2764 path = Opal.normalize(path); 2765 2766 if (Opal.require_table[path]) { 2767 return false; 2768 } 2769 2770 return Opal.load_normalized(path); 2771 }; 2772 2773 2774 // Strings 2775 // ------- 2776 2777 Opal.encodings = Object.create(null); 2778 2779 // Sets the encoding on a string, will treat string literals as frozen strings 2780 // raising a FrozenError. 2781 // 2782 // @param str [String] the string on which the encoding should be set 2783 // @param name [String] the canonical name of the encoding 2784 // @param type [String] possible values are either `"encoding"`, `"internal_encoding"`, or `undefined 2785 Opal.set_encoding = function(str, name, type) { 2786 if (typeof type === "undefined") type = "encoding"; 2787 if (typeof str === 'string' || str.$$frozen === true) 2788 $raise(Opal.FrozenError, "can't modify frozen String"); 2789 2790 var encoding = Opal.find_encoding(name); 2791 2792 if (encoding === str[type]) { return str; } 2793 2794 str[type] = encoding; 2795 2796 return str; 2797 }; 2798 2799 // Fetches the encoding for the given name or raises ArgumentError. 2800 Opal.find_encoding = function(name) { 2801 var register = Opal.encodings; 2802 var encoding = register[name] || register[name.toUpperCase()]; 2803 if (!encoding) $raise(Opal.ArgumentError, "unknown encoding name - " + name); 2804 return encoding; 2805 }; 2806 2807 // @returns a String object with the encoding set from a string literal 2808 Opal.enc = function(str, name) { 2809 var dup = new String(str); 2810 dup = Opal.set_encoding(dup, name); 2811 dup.internal_encoding = dup.encoding; 2812 return dup 2813 }; 2814 2815 // @returns a String object with the internal encoding set to Binary 2816 Opal.binary = function(str) { 2817 var dup = new String(str); 2818 return Opal.set_encoding(dup, "binary", "internal_encoding"); 2819 }; 2820 2821 Opal.last_promise = null; 2822 Opal.promise_unhandled_exception = false; 2823 2824 // Run a block of code, but if it returns a Promise, don't run the next 2825 // one, but queue it. 2826 Opal.queue = function(proc) { 2827 if (Opal.last_promise) { 2828 // The async path is taken only if anything before returned a 2829 // Promise(V2). 2830 Opal.last_promise = Opal.last_promise.then(function() { 2831 if (!Opal.promise_unhandled_exception) return proc(Opal); 2832 })['catch'](function(error) { 2833 if (Opal.respond_to(error, '$full_message')) { 2834 error = error.$full_message(); 2835 } 2836 console.error(error); 2837 // Abort further execution 2838 Opal.promise_unhandled_exception = true; 2839 Opal.exit(1); 2840 }); 2841 return Opal.last_promise; 2842 } 2843 else { 2844 var ret = proc(Opal); 2845 if (typeof Promise === 'function' && typeof ret === 'object' && ret instanceof Promise) { 2846 Opal.last_promise = ret; 2847 } 2848 return ret; 2849 } 2850 }; 2851 2852 // Operator helpers 2853 // ---------------- 2854 2855 function are_both_numbers(l,r) { return typeof(l) === 'number' && typeof(r) === 'number' } 2856 2857 Opal.rb_plus = function(l,r) { return are_both_numbers(l,r) ? l + r : l['$+'](r); }; 2858 Opal.rb_minus = function(l,r) { return are_both_numbers(l,r) ? l - r : l['$-'](r); }; 2859 Opal.rb_times = function(l,r) { return are_both_numbers(l,r) ? l * r : l['$*'](r); }; 2860 Opal.rb_divide = function(l,r) { return are_both_numbers(l,r) ? l / r : l['$/'](r); }; 2861 Opal.rb_lt = function(l,r) { return are_both_numbers(l,r) ? l < r : l['$<'](r); }; 2862 Opal.rb_gt = function(l,r) { return are_both_numbers(l,r) ? l > r : l['$>'](r); }; 2863 Opal.rb_le = function(l,r) { return are_both_numbers(l,r) ? l <= r : l['$<='](r); }; 2864 Opal.rb_ge = function(l,r) { return are_both_numbers(l,r) ? l >= r : l['$>='](r); }; 2865 2866 // Optimized helpers for calls like $truthy((a)['$==='](b)) -> $eqeqeq(a, b) 2867 function are_both_numbers_or_strings(lhs, rhs) { 2868 return (typeof lhs === 'number' && typeof rhs === 'number') || 2869 (typeof lhs === 'string' && typeof rhs === 'string'); 2870 } 2871 2872 function $eqeq(lhs, rhs) { 2873 return are_both_numbers_or_strings(lhs,rhs) ? lhs === rhs : $truthy((lhs)['$=='](rhs)); 2874 } Opal.eqeq = $eqeq; 2875 Opal.eqeqeq = function(lhs, rhs) { 2876 return are_both_numbers_or_strings(lhs,rhs) ? lhs === rhs : $truthy((lhs)['$==='](rhs)); 2877 }; 2878 Opal.neqeq = function(lhs, rhs) { 2879 return are_both_numbers_or_strings(lhs,rhs) ? lhs !== rhs : $truthy((lhs)['$!='](rhs)); 2880 }; 2881 Opal.not = function(arg) { 2882 if (undefined === arg || null === arg || false === arg || nil === arg) return true; 2883 if (true === arg || arg['$!'].$$pristine) return false; 2884 return $truthy(arg['$!']()); 2885 }; 2886 2887 // Shortcuts - optimized function generators for simple kinds of functions 2888 function $return_val(arg) { 2889 return function() { 2890 return arg; 2891 } 2892 } 2893 Opal.return_val = $return_val; 2894 2895 Opal.return_self = function() { 2896 return this; 2897 }; 2898 Opal.return_ivar = function(ivar) { 2899 return function() { 2900 if (this[ivar] == null) { return nil; } 2901 return this[ivar]; 2902 } 2903 }; 2904 Opal.assign_ivar = function(ivar) { 2905 return function(val) { 2906 $deny_frozen_access(this); 2907 return this[ivar] = val; 2908 } 2909 }; 2910 Opal.assign_ivar_val = function(ivar, static_val) { 2911 return function() { 2912 $deny_frozen_access(this); 2913 return this[ivar] = static_val; 2914 } 2915 }; 2916 2917 // Primitives for handling parameters 2918 Opal.ensure_kwargs = function(kwargs) { 2919 if (kwargs == null) { 2920 return Opal.hash2([], {}); 2921 } else if (kwargs.$$is_hash) { 2922 return kwargs; 2923 } else { 2924 $raise(Opal.ArgumentError, 'expected kwargs'); 2925 } 2926 }; 2927 2928 Opal.get_kwarg = function(kwargs, key) { 2929 if (!$has_own(kwargs.$$smap, key)) { 2930 $raise(Opal.ArgumentError, 'missing keyword: '+key); 2931 } 2932 return kwargs.$$smap[key]; 2933 }; 2934 2935 // Arrays of size > 32 elements that contain only strings, 2936 // symbols, integers and nils are compiled as a self-extracting 2937 // string. 2938 Opal.large_array_unpack = function(str) { 2939 var array = str.split(","), length = array.length, i; 2940 for (i = 0; i < length; i++) { 2941 switch(array[i][0]) { 2942 case undefined: 2943 array[i] = nil; 2944 break; 2945 case '-': 2946 case '0': 2947 case '1': 2948 case '2': 2949 case '3': 2950 case '4': 2951 case '5': 2952 case '6': 2953 case '7': 2954 case '8': 2955 case '9': 2956 array[i] = +array[i]; 2957 } 2958 } 2959 return array; 2960 }; 2961 2962 // Initialization 2963 // -------------- 2964 Opal.BasicObject = BasicObject = $allocate_class('BasicObject', null); 2965 Opal.Object = _Object = $allocate_class('Object', Opal.BasicObject); 2966 Opal.Module = Module = $allocate_class('Module', Opal.Object); 2967 Opal.Class = Class = $allocate_class('Class', Opal.Module); 2968 Opal.Opal = _Opal = $allocate_module('Opal'); 2969 Opal.Kernel = Kernel = $allocate_module('Kernel'); 2970 2971 $set_proto(Opal.BasicObject, Opal.Class.$$prototype); 2972 $set_proto(Opal.Object, Opal.Class.$$prototype); 2973 $set_proto(Opal.Module, Opal.Class.$$prototype); 2974 $set_proto(Opal.Class, Opal.Class.$$prototype); 2975 2976 // BasicObject can reach itself, avoid const_set to skip the $$base_module logic 2977 BasicObject.$$const.BasicObject = BasicObject; 2978 2979 // Assign basic constants 2980 $const_set(_Object, "BasicObject", BasicObject); 2981 $const_set(_Object, "Object", _Object); 2982 $const_set(_Object, "Module", Module); 2983 $const_set(_Object, "Class", Class); 2984 $const_set(_Object, "Opal", _Opal); 2985 $const_set(_Object, "Kernel", Kernel); 2986 2987 // Fix booted classes to have correct .class value 2988 BasicObject.$$class = Class; 2989 _Object.$$class = Class; 2990 Module.$$class = Class; 2991 Class.$$class = Class; 2992 _Opal.$$class = Module; 2993 Kernel.$$class = Module; 2994 2995 // Forward .toString() to #to_s 2996 $prop(_Object.$$prototype, 'toString', function() { 2997 var to_s = this.$to_s(); 2998 if (to_s.$$is_string && typeof(to_s) === 'object') { 2999 // a string created using new String('string') 3000 return to_s.valueOf(); 3001 } else { 3002 return to_s; 3003 } 3004 }); 3005 3006 // Make Kernel#require immediately available as it's needed to require all the 3007 // other corelib files. 3008 $prop(_Object.$$prototype, '$require', Opal.require); 3009 3010 // Instantiate the main object 3011 Opal.top = new _Object(); 3012 Opal.top.$to_s = Opal.top.$inspect = $return_val('main'); 3013 Opal.top.$define_method = top_define_method; 3014 3015 // Foward calls to define_method on the top object to Object 3016 function top_define_method() { 3017 var args = $slice(arguments); 3018 var block = top_define_method.$$p; 3019 top_define_method.$$p = null; 3020 return Opal.send(_Object, 'define_method', args, block) 3021 } 3022 // Nil 3023 Opal.NilClass = $allocate_class('NilClass', Opal.Object); 3024 $const_set(_Object, 'NilClass', Opal.NilClass); 3025 nil = Opal.nil = new Opal.NilClass(); 3026 nil.$$id = nil_id; 3027 nil.call = nil.apply = function() { $raise(Opal.LocalJumpError, 'no block given'); }; 3028 nil.$$frozen = true; 3029 nil.$$comparable = false; 3030 Object.seal(nil); 3031 3032 Opal.thrower = function(type) { 3033 var thrower = new Error('unexpected '+type); 3034 thrower.$thrower_type = type; 3035 thrower.$throw = function(value) { 3036 if (value == null) value = nil; 3037 thrower.$v = value; 3038 throw thrower; 3039 }; 3040 return thrower; 3041 }; 3042 3043 Opal.t_eval_return = Opal.thrower("return"); 3044 3045 TypeError.$$super = Error; 3046 3047 // If enable-file-source-embed compiler option is enabled, each module loaded will add its 3048 // sources to this object 3049 Opal.file_sources = {}; 3050}).call(undefined); 3051Opal.loaded(["corelib/runtime.js"]); 3052Opal.modules["corelib/helpers"] = function(Opal) {/* Generated by Opal 1.7.3 */ 3053 var $type_error = Opal.type_error, $coerce_to = Opal.coerce_to, $module = Opal.module, $defs = Opal.defs, $slice = Opal.slice, $eqeqeq = Opal.eqeqeq, $Kernel = Opal.Kernel, $truthy = Opal.truthy, $Opal = Opal.Opal, nil = Opal.nil, $$$ = Opal.$$$; 3054 3055 Opal.add_stubs('===,raise,respond_to?,nil?,__send__,<=>,class,coerce_to!,new,to_s,__id__'); 3056 return (function($base) { 3057 var self = $module($base, 'Opal'); 3058 3059 3060 3061 $defs(self, '$bridge', function $$bridge(constructor, klass) { 3062 3063 return Opal.bridge(constructor, klass); 3064 }); 3065 $defs(self, '$coerce_to!', function $Opal_coerce_to$excl$1(object, type, method, $a) { 3066 var $post_args, args, coerced = nil; 3067 3068 3069 $post_args = $slice(arguments, 3); 3070 args = $post_args; 3071 coerced = $coerce_to(object, type, method, args); 3072 if (!$eqeqeq(type, coerced)) { 3073 $Kernel.$raise($type_error(object, type, method, coerced)); 3074 } return coerced; 3075 }, -4); 3076 $defs(self, '$coerce_to?', function $Opal_coerce_to$ques$2(object, type, method, $a) { 3077 var $post_args, args, coerced = nil; 3078 3079 3080 $post_args = $slice(arguments, 3); 3081 args = $post_args; 3082 if (!$truthy(object['$respond_to?'](method))) { 3083 return nil 3084 } coerced = $coerce_to(object, type, method, args); 3085 if ($truthy(coerced['$nil?']())) { 3086 return nil 3087 } if (!$eqeqeq(type, coerced)) { 3088 $Kernel.$raise($type_error(object, type, method, coerced)); 3089 } return coerced; 3090 }, -4); 3091 $defs(self, '$try_convert', function $$try_convert(object, type, method) { 3092 3093 3094 if ($eqeqeq(type, object)) { 3095 return object 3096 } if ($truthy(object['$respond_to?'](method))) { 3097 return object.$__send__(method) 3098 } else { 3099 return nil 3100 } }); 3101 $defs(self, '$compare', function $$compare(a, b) { 3102 var compare = nil; 3103 3104 3105 compare = a['$<=>'](b); 3106 if ($truthy(compare === nil)) { 3107 $Kernel.$raise($$$('ArgumentError'), "comparison of " + (a.$class()) + " with " + (b.$class()) + " failed"); 3108 } return compare; 3109 }); 3110 $defs(self, '$destructure', function $$destructure(args) { 3111 3112 3113 if (args.length == 1) { 3114 return args[0]; 3115 } 3116 else if (args.$$is_array) { 3117 return args; 3118 } 3119 else { 3120 var args_ary = new Array(args.length); 3121 for(var i = 0, l = args_ary.length; i < l; i++) { args_ary[i] = args[i]; } 3122 3123 return args_ary; 3124 } 3125 3126 }); 3127 $defs(self, '$respond_to?', function $Opal_respond_to$ques$3(obj, method, include_all) { 3128 3129 3130 if (include_all == null) include_all = false; 3131 3132 if (obj == null || !obj.$$class) { 3133 return false; 3134 } 3135 return obj['$respond_to?'](method, include_all); 3136 }, -3); 3137 $defs(self, '$instance_variable_name!', function $Opal_instance_variable_name$excl$4(name) { 3138 3139 3140 name = $Opal['$coerce_to!'](name, $$$('String'), "to_str"); 3141 if (!$truthy(/^@[a-zA-Z_][a-zA-Z0-9_]*?$/.test(name))) { 3142 $Kernel.$raise($$$('NameError').$new("'" + (name) + "' is not allowed as an instance variable name", name)); 3143 } return name; 3144 }); 3145 $defs(self, '$class_variable_name!', function $Opal_class_variable_name$excl$5(name) { 3146 3147 3148 name = $Opal['$coerce_to!'](name, $$$('String'), "to_str"); 3149 if ($truthy(name.length < 3 || name.slice(0,2) !== '@@')) { 3150 $Kernel.$raise($$$('NameError').$new("`" + (name) + "' is not allowed as a class variable name", name)); 3151 } return name; 3152 }); 3153 $defs(self, '$const_name?', function $Opal_const_name$ques$6(const_name) { 3154 3155 3156 if (typeof const_name !== 'string') { 3157 (const_name = $Opal['$coerce_to!'](const_name, $$$('String'), "to_str")); 3158 } 3159 3160 return const_name[0] === const_name[0].toUpperCase() 3161 3162 }); 3163 $defs(self, '$const_name!', function $Opal_const_name$excl$7(const_name) { 3164 var self = this; 3165 3166 3167 if ($truthy((($$$('::', 'String', 'skip_raise')) ? 'constant' : nil))) { 3168 const_name = $Opal['$coerce_to!'](const_name, $$$('String'), "to_str"); 3169 } 3170 if (!const_name || const_name[0] != const_name[0].toUpperCase()) { 3171 self.$raise($$$('NameError'), "wrong constant name " + (const_name)); 3172 } 3173 return const_name; 3174 }); 3175 $defs(self, '$pristine', function $$pristine(owner_class, $a) { 3176 var $post_args, method_names; 3177 3178 3179 $post_args = $slice(arguments, 1); 3180 method_names = $post_args; 3181 3182 var method_name, method; 3183 for (var i = method_names.length - 1; i >= 0; i--) { 3184 method_name = method_names[i]; 3185 method = owner_class.$$prototype[Opal.jsid(method_name)]; 3186 3187 if (method && !method.$$stub) { 3188 method.$$pristine = true; 3189 } 3190 } 3191 return nil; 3192 }, -2); 3193 var inspect_stack = []; 3194 return $defs(self, '$inspect', function $$inspect(value) { 3195 var e = nil; 3196 var pushed = false; 3197 3198 return (function() { try { 3199 try { 3200 3201 3202 if (value === null) { 3203 // JS null value 3204 return 'null'; 3205 } 3206 else if (value === undefined) { 3207 // JS undefined value 3208 return 'undefined'; 3209 } 3210 else if (typeof value.$$class === 'undefined') { 3211 // JS object / other value that is not bridged 3212 return Object.prototype.toString.apply(value); 3213 } 3214 else if (typeof value.$inspect !== 'function' || value.$inspect.$$stub) { 3215 // BasicObject and friends 3216 return "#<" + (value.$$class) + ":0x" + (value.$__id__().$to_s(16)) + ">" 3217 } 3218 else if (inspect_stack.indexOf(value.$__id__()) !== -1) { 3219 // inspect recursing inside inspect to find out about the 3220 // same object 3221 return "#<" + (value.$$class) + ":0x" + (value.$__id__().$to_s(16)) + ">" 3222 } 3223 else { 3224 // anything supporting Opal 3225 inspect_stack.push(value.$__id__()); 3226 pushed = true; 3227 return value.$inspect(); 3228 } 3229 ; 3230 return nil; 3231 } catch ($err) { 3232 if (Opal.rescue($err, [$$$('Exception')])) {(e = $err); 3233 try { 3234 return "#<" + (value.$$class) + ":0x" + (value.$__id__().$to_s(16)) + ">" 3235 } finally { Opal.pop_exception(); } 3236 } else { throw $err; } 3237 } 3238 } finally { 3239 if (pushed) inspect_stack.pop(); 3240 } })(); }, -1); 3241 })('::') 3242}; 3243 3244Opal.modules["corelib/module"] = function(Opal) {/* Generated by Opal 1.7.3 */ 3245 var $truthy = Opal.truthy, $coerce_to = Opal.coerce_to, $const_set = Opal.const_set, $Object = Opal.Object, $return_ivar = Opal.return_ivar, $assign_ivar = Opal.assign_ivar, $ivar = Opal.ivar, $deny_frozen_access = Opal.deny_frozen_access, $freeze = Opal.freeze, $prop = Opal.prop, $jsid = Opal.jsid, $klass = Opal.klass, $defs = Opal.defs, $send = Opal.send, $def = Opal.def, $eqeqeq = Opal.eqeqeq, $Module = Opal.Module, $Kernel = Opal.Kernel, $rb_lt = Opal.rb_lt, $rb_gt = Opal.rb_gt, $slice = Opal.slice, $to_a = Opal.to_a, $hash2 = Opal.hash2, $Opal = Opal.Opal, $return_val = Opal.return_val, $eqeq = Opal.eqeq, $lambda = Opal.lambda, $range = Opal.range, $send2 = Opal.send2, $find_super = Opal.find_super, $alias = Opal.alias, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 3246 3247 Opal.add_stubs('module_eval,to_proc,===,raise,equal?,<,>,nil?,attr_reader,attr_writer,warn,attr_accessor,const_name?,class_variable_name!,pristine,const_name!,=~,new,inject,split,const_get,==,start_with?,!~,bind,call,class,frozen?,name,append_features,included,cover?,size,merge,compile,proc,any?,prepend_features,prepended,to_s,__id__,constants,include?,copy_class_variables,copy_constants,class_exec,module_exec,inspect'); 3248 3249 (function($base, $super, $parent_nesting) { 3250 var self = $klass($base, $super, 'Module'); 3251 3252 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 3253 3254 3255 $defs(self, '$allocate', function $$allocate() { 3256 var self = this; 3257 3258 3259 var module = Opal.allocate_module(nil, function(){}); 3260 // Link the prototype of Module subclasses 3261 if (self !== Opal.Module) Object.setPrototypeOf(module, self.$$prototype); 3262 return module; 3263 3264 }); 3265 3266 $def(self, '$initialize', function $$initialize() { 3267 var block = $$initialize.$$p || nil, self = this; 3268 3269 $$initialize.$$p = null; 3270 if ((block !== nil)) { 3271 return $send(self, 'module_eval', [], block.$to_proc()) 3272 } else { 3273 return nil 3274 } }); 3275 3276 $def(self, '$===', function $Module_$eq_eq_eq$1(object) { 3277 var self = this; 3278 3279 3280 if ($truthy(object == null)) { 3281 return false 3282 } return Opal.is_a(object, self); }); 3283 3284 $def(self, '$<', function $Module_$lt$2(other) { 3285 var self = this; 3286 3287 3288 if (!$eqeqeq($Module, other)) { 3289 $Kernel.$raise($$$('TypeError'), "compared with non class/module"); 3290 } 3291 var working = self, 3292 ancestors, 3293 i, length; 3294 3295 if (working === other) { 3296 return false; 3297 } 3298 3299 for (i = 0, ancestors = Opal.ancestors(self), length = ancestors.length; i < length; i++) { 3300 if (ancestors[i] === other) { 3301 return true; 3302 } 3303 } 3304 3305 for (i = 0, ancestors = Opal.ancestors(other), length = ancestors.length; i < length; i++) { 3306 if (ancestors[i] === self) { 3307 return false; 3308 } 3309 } 3310 3311 return nil; 3312 }); 3313 3314 $def(self, '$<=', function $Module_$lt_eq$3(other) { 3315 var self = this, $ret_or_1 = nil; 3316 3317 if ($truthy(($ret_or_1 = self['$equal?'](other)))) { 3318 return $ret_or_1 3319 } else { 3320 return $rb_lt(self, other) 3321 } 3322 }); 3323 3324 $def(self, '$>', function $Module_$gt$4(other) { 3325 var self = this; 3326 3327 3328 if (!$eqeqeq($Module, other)) { 3329 $Kernel.$raise($$$('TypeError'), "compared with non class/module"); 3330 } return $rb_lt(other, self); 3331 }); 3332 3333 $def(self, '$>=', function $Module_$gt_eq$5(other) { 3334 var self = this, $ret_or_1 = nil; 3335 3336 if ($truthy(($ret_or_1 = self['$equal?'](other)))) { 3337 return $ret_or_1 3338 } else { 3339 return $rb_gt(self, other) 3340 } 3341 }); 3342 3343 $def(self, '$<=>', function $Module_$lt_eq_gt$6(other) { 3344 var self = this, lt = nil; 3345 3346 3347 3348 if (self === other) { 3349 return 0; 3350 } 3351 if (!$eqeqeq($Module, other)) { 3352 return nil 3353 } lt = $rb_lt(self, other); 3354 if ($truthy(lt['$nil?']())) { 3355 return nil 3356 } if ($truthy(lt)) { 3357 return -1 3358 } else { 3359 return 1 3360 } }); 3361 3362 $def(self, '$alias_method', function $$alias_method(newname, oldname) { 3363 var self = this; 3364 3365 3366 $deny_frozen_access(self); 3367 newname = $coerce_to(newname, $$$('String'), 'to_str'); 3368 oldname = $coerce_to(oldname, $$$('String'), 'to_str'); 3369 Opal.alias(self, newname, oldname); 3370 return self; 3371 }); 3372 3373 $def(self, '$alias_native', function $$alias_native(mid, jsid) { 3374 var self = this; 3375 3376 3377 if (jsid == null) jsid = mid; 3378 $deny_frozen_access(self); 3379 Opal.alias_native(self, mid, jsid); 3380 return self; 3381 }, -2); 3382 3383 $def(self, '$ancestors', function $$ancestors() { 3384 var self = this; 3385 3386 return Opal.ancestors(self); 3387 }); 3388 3389 $def(self, '$append_features', function $$append_features(includer) { 3390 var self = this; 3391 3392 3393 $deny_frozen_access(includer); 3394 Opal.append_features(self, includer); 3395 return self; 3396 }); 3397 3398 $def(self, '$attr_accessor', function $$attr_accessor($a) { 3399 var $post_args, names, self = this; 3400 3401 3402 $post_args = $slice(arguments); 3403 names = $post_args; 3404 $send(self, 'attr_reader', $to_a(names)); 3405 return $send(self, 'attr_writer', $to_a(names)); 3406 }, -1); 3407 3408 $def(self, '$attr', function $$attr($a) { 3409 var $post_args, args, self = this; 3410 3411 3412 $post_args = $slice(arguments); 3413 args = $post_args; 3414 3415 if (args.length == 2 && (args[1] === true || args[1] === false)) { 3416 self.$warn("optional boolean argument is obsoleted", $hash2(["uplevel"], {"uplevel": 1})); 3417 3418 args[1] ? self.$attr_accessor(args[0]) : self.$attr_reader(args[0]); 3419 return nil; 3420 } 3421 return $send(self, 'attr_reader', $to_a(args)); 3422 }, -1); 3423 3424 $def(self, '$attr_reader', function $$attr_reader($a) { 3425 var $post_args, names, self = this; 3426 3427 3428 $post_args = $slice(arguments); 3429 names = $post_args; 3430 3431 $deny_frozen_access(self); 3432 3433 var proto = self.$$prototype; 3434 3435 for (var i = names.length - 1; i >= 0; i--) { 3436 var name = names[i], 3437 id = $jsid(name), 3438 ivar = $ivar(name); 3439 3440 var body = $return_ivar(ivar); 3441 3442 // initialize the instance variable as nil 3443 Opal.prop(proto, ivar, nil); 3444 3445 body.$$parameters = []; 3446 body.$$arity = 0; 3447 3448 Opal.defn(self, id, body); 3449 } 3450 return nil; 3451 }, -1); 3452 3453 $def(self, '$attr_writer', function $$attr_writer($a) { 3454 var $post_args, names, self = this; 3455 3456 3457 $post_args = $slice(arguments); 3458 names = $post_args; 3459 3460 $deny_frozen_access(self); 3461 3462 var proto = self.$$prototype; 3463 3464 for (var i = names.length - 1; i >= 0; i--) { 3465 var name = names[i], 3466 id = $jsid(name + '='), 3467 ivar = $ivar(name); 3468 3469 var body = $assign_ivar(ivar); 3470 3471 body.$$parameters = [['req']]; 3472 body.$$arity = 1; 3473 3474 // initialize the instance variable as nil 3475 Opal.prop(proto, ivar, nil); 3476 3477 Opal.defn(self, id, body); 3478 } 3479 return nil; 3480 }, -1); 3481 3482 $def(self, '$autoload', function $$autoload(const$, path) { 3483 var self = this; 3484 3485 3486 $deny_frozen_access(self); 3487 3488 if (!$$('Opal')['$const_name?'](const$)) { 3489 $Kernel.$raise($$$('NameError'), "autoload must be constant name: " + (const$)); 3490 } 3491 3492 if (path == "") { 3493 $Kernel.$raise($$$('ArgumentError'), "empty file name"); 3494 } 3495 3496 if (!self.$$const.hasOwnProperty(const$)) { 3497 if (!self.$$autoload) { 3498 self.$$autoload = {}; 3499 } 3500 Opal.const_cache_version++; 3501 self.$$autoload[const$] = { path: path, loaded: false, required: false, success: false, exception: false }; 3502 3503 if (self.$const_added && !self.$const_added.$$pristine) { 3504 self.$const_added(const$); 3505 } 3506 } 3507 return nil; 3508 3509 }); 3510 3511 $def(self, '$autoload?', function $Module_autoload$ques$7(const$) { 3512 var self = this; 3513 3514 3515 if (self.$$autoload && self.$$autoload[const$] && !self.$$autoload[const$].required && !self.$$autoload[const$].success) { 3516 return self.$$autoload[const$].path; 3517 } 3518 3519 var ancestors = self.$ancestors(); 3520 3521 for (var i = 0, length = ancestors.length; i < length; i++) { 3522 if (ancestors[i].$$autoload && ancestors[i].$$autoload[const$] && !ancestors[i].$$autoload[const$].required && !ancestors[i].$$autoload[const$].success) { 3523 return ancestors[i].$$autoload[const$].path; 3524 } 3525 } 3526 return nil; 3527 3528 }); 3529 3530 $def(self, '$class_variables', function $$class_variables() { 3531 var self = this; 3532 3533 return Object.keys(Opal.class_variables(self)); 3534 }); 3535 3536 $def(self, '$class_variable_get', function $$class_variable_get(name) { 3537 var self = this; 3538 3539 3540 name = $Opal['$class_variable_name!'](name); 3541 return Opal.class_variable_get(self, name, false); }); 3542 3543 $def(self, '$class_variable_set', function $$class_variable_set(name, value) { 3544 var self = this; 3545 3546 3547 $deny_frozen_access(self); 3548 name = $Opal['$class_variable_name!'](name); 3549 return Opal.class_variable_set(self, name, value); }); 3550 3551 $def(self, '$class_variable_defined?', function $Module_class_variable_defined$ques$8(name) { 3552 var self = this; 3553 3554 3555 name = $Opal['$class_variable_name!'](name); 3556 return Opal.class_variables(self).hasOwnProperty(name); }); 3557 3558 $def(self, '$const_added', $return_val(nil)); 3559 $Opal.$pristine(self, "const_added"); 3560 3561 $def(self, '$remove_class_variable', function $$remove_class_variable(name) { 3562 var self = this; 3563 3564 3565 $deny_frozen_access(self); 3566 name = $Opal['$class_variable_name!'](name); 3567 3568 if (Opal.hasOwnProperty.call(self.$$cvars, name)) { 3569 var value = self.$$cvars[name]; 3570 delete self.$$cvars[name]; 3571 return value; 3572 } else { 3573 $Kernel.$raise($$$('NameError'), "cannot remove " + (name) + " for " + (self)); 3574 } 3575 }); 3576 3577 $def(self, '$constants', function $$constants(inherit) { 3578 var self = this; 3579 3580 3581 if (inherit == null) inherit = true; 3582 return Opal.constants(self, inherit); }, -1); 3583 $defs(self, '$constants', function $$constants(inherit) { 3584 var self = this; 3585 3586 if (inherit == null) { 3587 var nesting = (self.$$nesting || []).concat($Object), 3588 constant, constants = {}, 3589 i, ii; 3590 3591 for(i = 0, ii = nesting.length; i < ii; i++) { 3592 for (constant in nesting[i].$$const) { 3593 constants[constant] = true; 3594 } 3595 } 3596 return Object.keys(constants); 3597 } else { 3598 return Opal.constants(self, inherit) 3599 } 3600 }, -1); 3601 $defs(self, '$nesting', function $$nesting() { 3602 var self = this; 3603 3604 return self.$$nesting || []; 3605 }); 3606 3607 $def(self, '$const_defined?', function $Module_const_defined$ques$9(name, inherit) { 3608 var self = this; 3609 3610 3611 if (inherit == null) inherit = true; 3612 name = $$('Opal')['$const_name!'](name); 3613 if (!$truthy(name['$=~']($$$($Opal, 'CONST_NAME_REGEXP')))) { 3614 $Kernel.$raise($$$('NameError').$new("wrong constant name " + (name), name)); 3615 } 3616 var module, modules = [self], i, ii; 3617 3618 // Add up ancestors if inherit is true 3619 if (inherit) { 3620 modules = modules.concat(Opal.ancestors(self)); 3621 3622 // Add Object's ancestors if it's a module – modules have no ancestors otherwise 3623 if (self.$$is_module) { 3624 modules = modules.concat([$Object]).concat(Opal.ancestors($Object)); 3625 } 3626 } 3627 3628 for (i = 0, ii = modules.length; i < ii; i++) { 3629 module = modules[i]; 3630 if (module.$$const[name] != null) { return true; } 3631 if ( 3632 module.$$autoload && 3633 module.$$autoload[name] && 3634 !module.$$autoload[name].required && 3635 !module.$$autoload[name].success 3636 ) { 3637 return true; 3638 } 3639 } 3640 3641 return false; 3642 }, -2); 3643 3644 $def(self, '$const_get', function $$const_get(name, inherit) { 3645 var self = this; 3646 3647 3648 if (inherit == null) inherit = true; 3649 name = $$('Opal')['$const_name!'](name); 3650 3651 if (name.indexOf('::') === 0 && name !== '::'){ 3652 name = name.slice(2); 3653 } 3654 if ($truthy(name.indexOf('::') != -1 && name != '::')) { 3655 return $send(name.$split("::"), 'inject', [self], function $$10(o, c){ 3656 3657 if (o == null) o = nil; 3658 if (c == null) c = nil; 3659 return o.$const_get(c);}) 3660 } if (!$truthy(name['$=~']($$$($Opal, 'CONST_NAME_REGEXP')))) { 3661 $Kernel.$raise($$$('NameError').$new("wrong constant name " + (name), name)); 3662 } 3663 if (inherit) { 3664 return Opal.$$([self], name); 3665 } else { 3666 return Opal.const_get_local(self, name); 3667 } 3668 }, -2); 3669 3670 $def(self, '$const_missing', function $$const_missing(name) { 3671 var self = this, full_const_name = nil; 3672 3673 3674 full_const_name = ($eqeq(self, $Object) ? (name) : ("" + (self) + "::" + (name))); 3675 return $Kernel.$raise($$$('NameError').$new("uninitialized constant " + (full_const_name), name)); 3676 }); 3677 3678 $def(self, '$const_set', function $$const_set(name, value) { 3679 var self = this; 3680 3681 3682 $deny_frozen_access(self); 3683 name = $Opal['$const_name!'](name); 3684 if (($truthy(name['$!~']($$$($Opal, 'CONST_NAME_REGEXP'))) || ($truthy(name['$start_with?']("::"))))) { 3685 $Kernel.$raise($$$('NameError').$new("wrong constant name " + (name), name)); 3686 } $const_set(self, name, value); 3687 return value; 3688 }); 3689 3690 $def(self, '$public_constant', $return_val(nil)); 3691 3692 $def(self, '$define_method', function $$define_method(name, method) { 3693 var block = $$define_method.$$p || nil, self = this, $ret_or_1 = nil, $ret_or_2 = nil; 3694 3695 $$define_method.$$p = null; 3696 3697 $deny_frozen_access(self); 3698 3699 if (method === undefined && block === nil) 3700 $Kernel.$raise($$$('ArgumentError'), "tried to create a Proc object without a block") 3701 ; 3702 block = ($truthy(($ret_or_1 = block)) ? ($ret_or_1) : ($eqeqeq($$$('Proc'), ($ret_or_2 = method)) ? (method) : ($eqeqeq($$$('Method'), $ret_or_2) ? (method.$to_proc().$$unbound) : ($eqeqeq($$$('UnboundMethod'), $ret_or_2) ? ($lambda(function $$11($a){var $post_args, args, self = $$11.$$s == null ? this : $$11.$$s, bound = nil; 3703 3704 3705 $post_args = $slice(arguments); 3706 args = $post_args; 3707 bound = method.$bind(self); 3708 return $send(bound, 'call', $to_a(args));}, {$$arity: -1, $$s: self})) : ($Kernel.$raise($$$('TypeError'), "wrong argument type " + (block.$class()) + " (expected Proc/Method)")))))); 3709 3710 if (typeof(Proxy) !== 'undefined') { 3711 3712 block.$$proxy_target = block; 3713 block = new Proxy(block, { 3714 apply: function(target, self, args) { 3715 var old_name = target.$$jsid; 3716 target.$$jsid = name; 3717 try { 3718 return target.apply(self, args); 3719 } catch(e) { 3720 if (e === target.$$brk || e === target.$$ret) return e.$v; 3721 throw e; 3722 } finally { 3723 target.$$jsid = old_name; 3724 } 3725 } 3726 }); 3727 } 3728 3729 block.$$jsid = name; 3730 block.$$s = null; 3731 block.$$def = block; 3732 block.$$define_meth = true; 3733 3734 return Opal.defn(self, $jsid(name), block); 3735 }, -2); 3736 3737 $def(self, '$freeze', function $$freeze() { 3738 var self = this; 3739 3740 3741 if ($truthy(self['$frozen?']())) { 3742 return self 3743 } 3744 if (!self.hasOwnProperty('$$base_module')) { $prop(self, '$$base_module', null); } 3745 3746 return $freeze(self); 3747 }); 3748 3749 $def(self, '$remove_method', function $$remove_method($a) { 3750 var $post_args, names, self = this; 3751 3752 3753 $post_args = $slice(arguments); 3754 names = $post_args; 3755 3756 for (var i = 0; i < names.length; i++) { 3757 var name = names[i]; 3758 if (!(typeof name === "string" || name.$$is_string)) { 3759 self.$raise($$$('TypeError'), "" + (self.$name()) + " is not a symbol nor a string"); 3760 } 3761 $deny_frozen_access(self); 3762 3763 Opal.rdef(self, "$" + name); 3764 } 3765 return self; 3766 }, -1); 3767 3768 $def(self, '$singleton_class?', function $Module_singleton_class$ques$12() { 3769 var self = this; 3770 3771 return !!self.$$is_singleton; 3772 }); 3773 3774 $def(self, '$include', function $$include($a) { 3775 var $post_args, mods, self = this; 3776 3777 3778 $post_args = $slice(arguments); 3779 mods = $post_args; 3780 3781 for (var i = mods.length - 1; i >= 0; i--) { 3782 var mod = mods[i]; 3783 3784 if (!mod.$$is_module) { 3785 $Kernel.$raise($$$('TypeError'), "wrong argument type " + ((mod).$class()) + " (expected Module)"); 3786 } 3787 3788 (mod).$append_features(self); 3789 (mod).$included(self); 3790 } 3791 return self; 3792 }, -1); 3793 3794 $def(self, '$included_modules', function $$included_modules() { 3795 var self = this; 3796 3797 return Opal.included_modules(self); 3798 }); 3799 3800 $def(self, '$include?', function $Module_include$ques$13(mod) { 3801 var self = this; 3802 3803 3804 if (!mod.$$is_module) { 3805 $Kernel.$raise($$$('TypeError'), "wrong argument type " + ((mod).$class()) + " (expected Module)"); 3806 } 3807 3808 var i, ii, mod2, ancestors = Opal.ancestors(self); 3809 3810 for (i = 0, ii = ancestors.length; i < ii; i++) { 3811 mod2 = ancestors[i]; 3812 if (mod2 === mod && mod2 !== self) { 3813 return true; 3814 } 3815 } 3816 3817 return false; 3818 3819 }); 3820 3821 $def(self, '$instance_method', function $$instance_method(name) { 3822 var self = this; 3823 3824 3825 var meth = self.$$prototype[$jsid(name)]; 3826 3827 if (!meth || meth.$$stub) { 3828 $Kernel.$raise($$$('NameError').$new("undefined method `" + (name) + "' for class `" + (self.$name()) + "'", name)); 3829 } 3830 3831 return $$$('UnboundMethod').$new(self, meth.$$owner || self, meth, name); 3832 3833 }); 3834 3835 $def(self, '$instance_methods', function $$instance_methods(include_super) { 3836 var self = this; 3837 3838 3839 if (include_super == null) include_super = true; 3840 3841 if ($truthy(include_super)) { 3842 return Opal.instance_methods(self); 3843 } else { 3844 return Opal.own_instance_methods(self); 3845 } 3846 }, -1); 3847 3848 $def(self, '$included', $return_val(nil)); 3849 3850 $def(self, '$extended', $return_val(nil)); 3851 3852 $def(self, '$extend_object', function $$extend_object(object) { 3853 3854 3855 $deny_frozen_access(object); 3856 return nil; 3857 }); 3858 3859 $def(self, '$method_added', function $$method_added($a) { 3860 3861 3862 $slice(arguments); 3863 return nil; 3864 }, -1); 3865 3866 $def(self, '$method_removed', function $$method_removed($a) { 3867 3868 3869 $slice(arguments); 3870 return nil; 3871 }, -1); 3872 3873 $def(self, '$method_undefined', function $$method_undefined($a) { 3874 3875 3876 $slice(arguments); 3877 return nil; 3878 }, -1); 3879 3880 $def(self, '$module_eval', function $$module_eval($a) { 3881 var block = $$module_eval.$$p || nil, $post_args, args, $b, self = this, string = nil, file = nil, default_eval_options = nil, $ret_or_1 = nil, compiling_options = nil, compiled = nil; 3882 3883 $$module_eval.$$p = null; 3884 $post_args = $slice(arguments); 3885 args = $post_args; 3886 if (($truthy(block['$nil?']()) && ($truthy(!!Opal.compile)))) { 3887 3888 if (!$truthy($range(1, 3, false)['$cover?'](args.$size()))) { 3889 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (0 for 1..3)"); 3890 } $b = [].concat($to_a(args)), (string = ($b[0] == null ? nil : $b[0])), (file = ($b[1] == null ? nil : $b[1])), (($b[2] == null ? nil : $b[2])); 3891 default_eval_options = $hash2(["file", "eval"], {"file": ($truthy(($ret_or_1 = file)) ? ($ret_or_1) : ("(eval)")), "eval": true}); 3892 compiling_options = Opal.hash({ arity_check: false }).$merge(default_eval_options); 3893 compiled = $Opal.$compile(string, compiling_options); 3894 block = $send($Kernel, 'proc', [], function $$14(){var self = $$14.$$s == null ? this : $$14.$$s; 3895 3896 return new Function("Opal,self", "return " + compiled)(Opal, self);}, {$$s: self}); 3897 } else if ($truthy(args['$any?']())) { 3898 $Kernel.$raise($$$('ArgumentError'), "" + ("wrong number of arguments (" + (args.$size()) + " for 0)") + "\n\n NOTE:If you want to enable passing a String argument please add \"require 'opal-parser'\" to your script\n"); 3899 } 3900 var old = block.$$s, 3901 result; 3902 3903 block.$$s = null; 3904 result = block.apply(self, [self]); 3905 block.$$s = old; 3906 3907 return result; 3908 }, -1); 3909 3910 $def(self, '$module_exec', function $$module_exec($a) { 3911 var block = $$module_exec.$$p || nil, $post_args, args, self = this; 3912 3913 $$module_exec.$$p = null; 3914 $post_args = $slice(arguments); 3915 args = $post_args; 3916 3917 if (block === nil) { 3918 $Kernel.$raise($$$('LocalJumpError'), "no block given"); 3919 } 3920 3921 var block_self = block.$$s, result; 3922 3923 block.$$s = null; 3924 result = block.apply(self, args); 3925 block.$$s = block_self; 3926 3927 return result; 3928 }, -1); 3929 3930 $def(self, '$method_defined?', function $Module_method_defined$ques$15(method) { 3931 var self = this; 3932 3933 3934 var body = self.$$prototype[$jsid(method)]; 3935 return (!!body) && !body.$$stub; 3936 3937 }); 3938 3939 $def(self, '$module_function', function $$module_function($a) { 3940 var $post_args, methods, self = this; 3941 3942 3943 $post_args = $slice(arguments); 3944 methods = $post_args; 3945 3946 $deny_frozen_access(self); 3947 3948 if (methods.length === 0) { 3949 self.$$module_function = true; 3950 return nil; 3951 } 3952 else { 3953 for (var i = 0, length = methods.length; i < length; i++) { 3954 var meth = methods[i], 3955 id = $jsid(meth), 3956 func = self.$$prototype[id]; 3957 3958 Opal.defs(self, id, func); 3959 } 3960 return methods.length === 1 ? methods[0] : methods; 3961 } 3962 }, -1); 3963 3964 $def(self, '$name', function $$name() { 3965 var self = this; 3966 3967 3968 if (self.$$full_name) { 3969 return self.$$full_name; 3970 } 3971 3972 var result = [], base = self; 3973 3974 while (base) { 3975 // Give up if any of the ancestors is unnamed 3976 if (base.$$name === nil || base.$$name == null) return nil; 3977 3978 result.unshift(base.$$name); 3979 3980 base = base.$$base_module; 3981 3982 if (base === $Object) { 3983 break; 3984 } 3985 } 3986 3987 if (result.length === 0) { 3988 return nil; 3989 } 3990 3991 return self.$$full_name = result.join('::'); 3992 3993 }); 3994 3995 $def(self, '$prepend', function $$prepend($a) { 3996 var $post_args, mods, self = this; 3997 3998 3999 $post_args = $slice(arguments); 4000 mods = $post_args; 4001 4002 if (mods.length === 0) { 4003 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (given 0, expected 1+)"); 4004 } 4005 4006 for (var i = mods.length - 1; i >= 0; i--) { 4007 var mod = mods[i]; 4008 4009 if (!mod.$$is_module) { 4010 $Kernel.$raise($$$('TypeError'), "wrong argument type " + ((mod).$class()) + " (expected Module)"); 4011 } 4012 4013 (mod).$prepend_features(self); 4014 (mod).$prepended(self); 4015 } 4016 return self; 4017 }, -1); 4018 4019 $def(self, '$prepend_features', function $$prepend_features(prepender) { 4020 var self = this; 4021 4022 4023 4024 $deny_frozen_access(prepender); 4025 4026 if (!self.$$is_module) { 4027 $Kernel.$raise($$$('TypeError'), "wrong argument type " + (self.$class()) + " (expected Module)"); 4028 } 4029 4030 Opal.prepend_features(self, prepender) 4031 ; 4032 return self; 4033 }); 4034 4035 $def(self, '$prepended', $return_val(nil)); 4036 4037 $def(self, '$remove_const', function $$remove_const(name) { 4038 var self = this; 4039 4040 4041 $deny_frozen_access(self); 4042 return Opal.const_remove(self, name); }); 4043 4044 $def(self, '$to_s', function $$to_s() { 4045 var self = this, $ret_or_1 = nil; 4046 4047 if ($truthy(($ret_or_1 = Opal.Module.$name.call(self)))) { 4048 return $ret_or_1 4049 } else { 4050 return "#<" + (self.$$is_module ? 'Module' : 'Class') + ":0x" + (self.$__id__().$to_s(16)) + ">" 4051 } 4052 }); 4053 4054 $def(self, '$undef_method', function $$undef_method($a) { 4055 var $post_args, names, self = this; 4056 4057 4058 $post_args = $slice(arguments); 4059 names = $post_args; 4060 4061 for (var i = 0; i < names.length; i++) { 4062 var name = names[i]; 4063 if (!(typeof name === "string" || name.$$is_string)) { 4064 self.$raise($$$('TypeError'), "" + (self.$name()) + " is not a symbol nor a string"); 4065 } 4066 $deny_frozen_access(self); 4067 4068 Opal.udef(self, "$" + names[i]); 4069 } 4070 return self; 4071 }, -1); 4072 4073 $def(self, '$instance_variables', function $$instance_variables() { 4074 var self = this, consts = nil; 4075 4076 4077 consts = (Opal.Module.$$nesting = $nesting, self.$constants()); 4078 4079 var result = []; 4080 4081 for (var name in self) { 4082 if (self.hasOwnProperty(name) && name.charAt(0) !== '$' && name !== 'constructor' && !consts['$include?'](name)) { 4083 result.push('@' + name); 4084 } 4085 } 4086 4087 return result; 4088 }); 4089 4090 $def(self, '$dup', function $$dup() { 4091 var $yield = $$dup.$$p || nil, self = this, copy = nil; 4092 4093 $$dup.$$p = null; 4094 4095 copy = $send2(self, $find_super(self, 'dup', $$dup, false, true), 'dup', [], $yield); 4096 copy.$copy_class_variables(self); 4097 copy.$copy_constants(self); 4098 return copy; 4099 }); 4100 4101 $def(self, '$copy_class_variables', function $$copy_class_variables(other) { 4102 var self = this; 4103 4104 4105 for (var name in other.$$cvars) { 4106 self.$$cvars[name] = other.$$cvars[name]; 4107 } 4108 4109 }); 4110 4111 $def(self, '$copy_constants', function $$copy_constants(other) { 4112 var self = this; 4113 4114 4115 var name, other_constants = other.$$const; 4116 4117 for (name in other_constants) { 4118 $const_set(self, name, other_constants[name]); 4119 } 4120 4121 }); 4122 4123 $def(self, '$refine', function $$refine(klass) { 4124 var block = $$refine.$$p || nil, $a, self = this, refinement_module = nil, m = nil, klass_id = nil; 4125 4126 $$refine.$$p = null; 4127 $a = [self, nil, nil], (refinement_module = $a[0]), (m = $a[1]), (klass_id = $a[2]); 4128 4129 klass_id = Opal.id(klass); 4130 if (typeof self.$$refine_modules === "undefined") { 4131 self.$$refine_modules = Object.create(null); 4132 } 4133 if (typeof self.$$refine_modules[klass_id] === "undefined") { 4134 m = self.$$refine_modules[klass_id] = $$$('Refinement').$new(); 4135 } 4136 else { 4137 m = self.$$refine_modules[klass_id]; 4138 } 4139 m.refinement_module = refinement_module; 4140 m.refined_class = klass 4141 ; 4142 $send(m, 'class_exec', [], block.$to_proc()); 4143 return m; 4144 }); 4145 4146 $def(self, '$refinements', function $$refinements() { 4147 var self = this; 4148 4149 4150 var refine_modules = self.$$refine_modules, hash = $hash2([], {}); if (typeof refine_modules === "undefined") return hash; 4151 for (var id in refine_modules) { 4152 hash['$[]='](refine_modules[id].refined_class, refine_modules[id]); 4153 } 4154 return hash; 4155 4156 }); 4157 4158 $def(self, '$using', function $$using(mod) { 4159 4160 return $Kernel.$raise("Module#using is not permitted in methods") 4161 }); 4162 $alias(self, "class_eval", "module_eval"); 4163 $alias(self, "class_exec", "module_exec"); 4164 return $alias(self, "inspect", "to_s"); 4165 })('::', null, $nesting); 4166 return (function($base, $super) { 4167 var self = $klass($base, $super, 'Refinement'); 4168 4169 var $proto = self.$$prototype; 4170 4171 $proto.refinement_module = $proto.refined_class = nil; 4172 4173 self.$attr_reader("refined_class"); 4174 return $def(self, '$inspect', function $$inspect() { 4175 var $yield = $$inspect.$$p || nil, self = this; 4176 4177 $$inspect.$$p = null; 4178 if ($truthy(self.refinement_module)) { 4179 return "#<refinement:" + (self.refined_class.$inspect()) + "@" + (self.refinement_module.$inspect()) + ">" 4180 } else { 4181 return $send2(self, $find_super(self, 'inspect', $$inspect, false, true), 'inspect', [], $yield) 4182 } 4183 }); 4184 })('::', $Module); 4185}; 4186 4187Opal.modules["corelib/class"] = function(Opal) {/* Generated by Opal 1.7.3 */ 4188 var $klass = Opal.klass, $send = Opal.send, $defs = Opal.defs, $def = Opal.def, $rb_plus = Opal.rb_plus, $return_val = Opal.return_val, $slice = Opal.slice, $send2 = Opal.send2, $find_super = Opal.find_super, $Kernel = Opal.Kernel, $alias = Opal.alias, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 4189 4190 Opal.add_stubs('require,class_eval,to_proc,+,subclasses,flatten,map,initialize_copy,allocate,name,to_s,raise'); 4191 4192 self.$require("corelib/module"); 4193 return (function($base, $super, $parent_nesting) { 4194 var self = $klass($base, $super, 'Class'); 4195 4196 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 4197 4198 4199 $defs(self, '$new', function $Class_new$1(superclass) { 4200 var block = $Class_new$1.$$p || nil; 4201 4202 $Class_new$1.$$p = null; 4203 if (superclass == null) superclass = $$('Object'); 4204 4205 if (!superclass.$$is_class) { 4206 throw Opal.TypeError.$new("superclass must be a Class"); 4207 } 4208 4209 var klass = Opal.allocate_class(nil, superclass); 4210 superclass.$inherited(klass); 4211 ((block !== nil) ? ($send((klass), 'class_eval', [], block.$to_proc())) : nil); 4212 return klass; 4213 }, -1); 4214 4215 $def(self, '$allocate', function $$allocate() { 4216 var self = this; 4217 4218 4219 var obj = new self.$$constructor(); 4220 obj.$$id = Opal.uid(); 4221 return obj; 4222 4223 }); 4224 4225 $def(self, '$descendants', function $$descendants() { 4226 var self = this; 4227 4228 return $rb_plus(self.$subclasses(), $send(self.$subclasses(), 'map', [], "descendants".$to_proc()).$flatten()) 4229 }); 4230 4231 $def(self, '$inherited', $return_val(nil)); 4232 4233 $def(self, '$initialize_dup', function $$initialize_dup(original) { 4234 var self = this; 4235 4236 4237 self.$initialize_copy(original); 4238 4239 self.$$name = null; 4240 self.$$full_name = null; 4241 }); 4242 4243 $def(self, '$new', function $Class_new$2($a) { 4244 var block = $Class_new$2.$$p || nil, $post_args, args, self = this; 4245 4246 $Class_new$2.$$p = null; 4247 $post_args = $slice(arguments); 4248 args = $post_args; 4249 4250 var object = self.$allocate(); 4251 Opal.send(object, object.$initialize, args, block); 4252 return object; 4253 }, -1); 4254 4255 $def(self, '$subclasses', function $$subclasses() { 4256 var self = this; 4257 4258 4259 if (typeof WeakRef !== 'undefined') { 4260 var i, subclass, out = []; 4261 for (i = 0; i < self.$$subclasses.length; i++) { 4262 subclass = self.$$subclasses[i].deref(); 4263 if (subclass !== undefined) { 4264 out.push(subclass); 4265 } 4266 } 4267 return out; 4268 } 4269 else { 4270 return self.$$subclasses; 4271 } 4272 4273 }); 4274 4275 $def(self, '$superclass', function $$superclass() { 4276 var self = this; 4277 4278 return self.$$super || nil; 4279 }); 4280 4281 $def(self, '$to_s', function $$to_s() { 4282 var self = this; 4283 4284 $$to_s.$$p = null; 4285 4286 var singleton_of = self.$$singleton_of; 4287 4288 if (singleton_of && singleton_of.$$is_a_module) { 4289 return "#<Class:" + ((singleton_of).$name()) + ">"; 4290 } 4291 else if (singleton_of) { 4292 // a singleton class created from an object 4293 return "#<Class:#<" + ((singleton_of.$$class).$name()) + ":0x" + ((Opal.id(singleton_of)).$to_s(16)) + ">>"; 4294 } 4295 4296 return $send2(self, $find_super(self, 'to_s', $$to_s, false, true), 'to_s', [], null); 4297 4298 }); 4299 4300 $def(self, '$attached_object', function $$attached_object() { 4301 var self = this; 4302 4303 4304 if (self.$$singleton_of != null) { 4305 return self.$$singleton_of; 4306 } 4307 else { 4308 $Kernel.$raise($$$('TypeError'), "`" + (self) + "' is not a singleton class"); 4309 } 4310 4311 }); 4312 return $alias(self, "inspect", "to_s"); 4313 })('::', null, $nesting); 4314}; 4315 4316Opal.modules["corelib/basic_object"] = function(Opal) {/* Generated by Opal 1.7.3 */ 4317 var $klass = Opal.klass, $slice = Opal.slice, $def = Opal.def, $alias = Opal.alias, $return_val = Opal.return_val, $Opal = Opal.Opal, $truthy = Opal.truthy, $range = Opal.range, $Kernel = Opal.Kernel, $to_a = Opal.to_a, $hash2 = Opal.hash2, $send = Opal.send, $eqeq = Opal.eqeq, $rb_ge = Opal.rb_ge, nil = Opal.nil, $$$ = Opal.$$$; 4318 4319 Opal.add_stubs('==,raise,inspect,pristine,!,nil?,cover?,size,merge,compile,proc,[],first,>=,length,instance_variable_get,any?,new,caller'); 4320 return (function($base, $super) { 4321 var self = $klass($base, $super, 'BasicObject'); 4322 4323 4324 4325 4326 $def(self, '$initialize', function $$initialize($a) { 4327 4328 4329 $slice(arguments); 4330 return nil; 4331 }, -1); 4332 4333 $def(self, '$==', function $BasicObject_$eq_eq$1(other) { 4334 var self = this; 4335 4336 return self === other; 4337 }); 4338 4339 $def(self, '$eql?', function $BasicObject_eql$ques$2(other) { 4340 var self = this; 4341 4342 return self['$=='](other) 4343 }); 4344 $alias(self, "equal?", "=="); 4345 4346 $def(self, '$__id__', function $$__id__() { 4347 var self = this; 4348 4349 4350 if (self.$$id != null) { 4351 return self.$$id; 4352 } 4353 Opal.prop(self, '$$id', Opal.uid()); 4354 return self.$$id; 4355 4356 }); 4357 4358 $def(self, '$__send__', function $$__send__(symbol, $a) { 4359 var block = $$__send__.$$p || nil, $post_args, args, self = this; 4360 4361 $$__send__.$$p = null; 4362 $post_args = $slice(arguments, 1); 4363 args = $post_args; 4364 4365 if (!symbol.$$is_string) { 4366 self.$raise($$$('TypeError'), "" + (self.$inspect()) + " is not a symbol nor a string"); 4367 } 4368 4369 var func = self[Opal.jsid(symbol)]; 4370 4371 if (func) { 4372 if (block !== nil) { 4373 func.$$p = block; 4374 } 4375 4376 return func.apply(self, args); 4377 } 4378 4379 if (block !== nil) { 4380 self.$method_missing.$$p = block; 4381 } 4382 4383 return self.$method_missing.apply(self, [symbol].concat(args)); 4384 }, -2); 4385 4386 $def(self, '$!', $return_val(false)); 4387 $Opal.$pristine("!"); 4388 4389 $def(self, '$!=', function $BasicObject_$not_eq$3(other) { 4390 var self = this; 4391 4392 return self['$=='](other)['$!']() 4393 }); 4394 4395 $def(self, '$instance_eval', function $$instance_eval($a) { 4396 var block = $$instance_eval.$$p || nil, $post_args, args, $b, self = this, string = nil, file = nil, default_eval_options = nil, $ret_or_1 = nil, compiling_options = nil, compiled = nil; 4397 4398 $$instance_eval.$$p = null; 4399 $post_args = $slice(arguments); 4400 args = $post_args; 4401 if (($truthy(block['$nil?']()) && ($truthy(!!Opal.compile)))) { 4402 4403 if (!$truthy($range(1, 3, false)['$cover?'](args.$size()))) { 4404 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (0 for 1..3)"); 4405 } $b = [].concat($to_a(args)), (string = ($b[0] == null ? nil : $b[0])), (file = ($b[1] == null ? nil : $b[1])), (($b[2] == null ? nil : $b[2])); 4406 default_eval_options = $hash2(["file", "eval"], {"file": ($truthy(($ret_or_1 = file)) ? ($ret_or_1) : ("(eval)")), "eval": true}); 4407 compiling_options = Opal.hash({ arity_check: false }).$merge(default_eval_options); 4408 compiled = $Opal.$compile(string, compiling_options); 4409 block = $send($Kernel, 'proc', [], function $$4(){var self = $$4.$$s == null ? this : $$4.$$s; 4410 4411 return new Function("Opal,self", "return " + compiled)(Opal, self);}, {$$s: self}); 4412 } else if ((($truthy(block['$nil?']()) && ($truthy($rb_ge(args.$length(), 1)))) && ($eqeq(args.$first()['$[]'](0), "@")))) { 4413 return self.$instance_variable_get(args.$first()) 4414 } else if ($truthy(args['$any?']())) { 4415 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (args.$size()) + " for 0)"); 4416 } 4417 var old = block.$$s, 4418 result; 4419 4420 block.$$s = null; 4421 4422 // Need to pass $$eval so that method definitions know if this is 4423 // being done on a class/module. Cannot be compiler driven since 4424 // send(:instance_eval) needs to work. 4425 if (self.$$is_a_module) { 4426 self.$$eval = true; 4427 try { 4428 result = block.call(self, self); 4429 } 4430 finally { 4431 self.$$eval = false; 4432 } 4433 } 4434 else { 4435 result = block.call(self, self); 4436 } 4437 4438 block.$$s = old; 4439 4440 return result; 4441 }, -1); 4442 4443 $def(self, '$instance_exec', function $$instance_exec($a) { 4444 var block = $$instance_exec.$$p || nil, $post_args, args, self = this; 4445 4446 $$instance_exec.$$p = null; 4447 $post_args = $slice(arguments); 4448 args = $post_args; 4449 if (!$truthy(block)) { 4450 $Kernel.$raise($$$('ArgumentError'), "no block given"); 4451 } 4452 var block_self = block.$$s, 4453 result; 4454 4455 block.$$s = null; 4456 4457 if (self.$$is_a_module) { 4458 self.$$eval = true; 4459 try { 4460 result = block.apply(self, args); 4461 } 4462 finally { 4463 self.$$eval = false; 4464 } 4465 } 4466 else { 4467 result = block.apply(self, args); 4468 } 4469 4470 block.$$s = block_self; 4471 4472 return result; 4473 }, -1); 4474 4475 $def(self, '$singleton_method_added', function $$singleton_method_added($a) { 4476 4477 4478 $slice(arguments); 4479 return nil; 4480 }, -1); 4481 4482 $def(self, '$singleton_method_removed', function $$singleton_method_removed($a) { 4483 4484 4485 $slice(arguments); 4486 return nil; 4487 }, -1); 4488 4489 $def(self, '$singleton_method_undefined', function $$singleton_method_undefined($a) { 4490 4491 4492 $slice(arguments); 4493 return nil; 4494 }, -1); 4495 4496 $def(self, '$method_missing', function $$method_missing(symbol, $a) { 4497 var $post_args, args, self = this, inspect_result = nil; 4498 4499 $$method_missing.$$p = null; 4500 $post_args = $slice(arguments, 1); 4501 args = $post_args; 4502 inspect_result = $Opal.$inspect(self); 4503 return $Kernel.$raise($$$('NoMethodError').$new("undefined method `" + (symbol) + "' for " + (inspect_result), symbol, args), nil, $Kernel.$caller(1)); 4504 }, -2); 4505 $Opal.$pristine(self, "method_missing"); 4506 return $def(self, '$respond_to_missing?', function $BasicObject_respond_to_missing$ques$5(method_name, include_all) { 4507 return false; 4508 }, -2); 4509 })('::', null) 4510}; 4511 4512Opal.modules["corelib/kernel"] = function(Opal) {/* Generated by Opal 1.7.3 */ 4513 var $truthy = Opal.truthy, $coerce_to = Opal.coerce_to, $respond_to = Opal.respond_to, $Opal = Opal.Opal, $deny_frozen_access = Opal.deny_frozen_access, $freeze = Opal.freeze, $freeze_props = Opal.freeze_props, $jsid = Opal.jsid, $module = Opal.module, $return_val = Opal.return_val, $def = Opal.def, $Kernel = Opal.Kernel, $gvars = Opal.gvars, $slice = Opal.slice, $send = Opal.send, $to_a = Opal.to_a, $ensure_kwargs = Opal.ensure_kwargs, $eqeq = Opal.eqeq, $hash2 = Opal.hash2, $rb_plus = Opal.rb_plus, $eqeqeq = Opal.eqeqeq, $return_self = Opal.return_self, $rb_le = Opal.rb_le, $extract_kwargs = Opal.extract_kwargs, $rb_lt = Opal.rb_lt, $Object = Opal.Object, $alias = Opal.alias, $klass = Opal.klass, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 4514 4515 Opal.add_stubs('!,=~,==,object_id,raise,new,class,coerce_to?,<<,map,caller,nil?,allocate,copy_instance_variables,copy_singleton_methods,initialize_clone,frozen?,freeze,initialize_copy,define_method,singleton_class,to_proc,initialize_dup,for,empty?,pop,call,append_features,extend_object,extended,gets,__id__,include?,each,instance_variables,instance_variable_get,inspect,+,to_s,instance_variable_name!,respond_to?,to_int,coerce_to!,Integer,===,enum_for,result,any?,print,format,puts,<=,length,[],readline,<,first,split,to_str,exception,backtrace,rand,respond_to_missing?,pristine,try_convert!,expand_path,join,start_with?,new_seed,srand,tag,value,open,is_a?,__send__,yield_self,include'); 4516 4517 (function($base, $parent_nesting) { 4518 var self = $module($base, 'Kernel'); 4519 4520 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 4521 4522 4523 4524 $def(self, '$=~', $return_val(false)); 4525 4526 $def(self, '$!~', function $Kernel_$excl_tilde$1(obj) { 4527 var self = this; 4528 4529 return self['$=~'](obj)['$!']() 4530 }); 4531 4532 $def(self, '$===', function $Kernel_$eq_eq_eq$2(other) { 4533 var self = this, $ret_or_1 = nil; 4534 4535 if ($truthy(($ret_or_1 = self.$object_id()['$=='](other.$object_id())))) { 4536 return $ret_or_1 4537 } else { 4538 return self['$=='](other) 4539 } 4540 }); 4541 4542 $def(self, '$<=>', function $Kernel_$lt_eq_gt$3(other) { 4543 var self = this; 4544 4545 4546 // set guard for infinite recursion 4547 self.$$comparable = true; 4548 4549 var x = self['$=='](other); 4550 4551 if (x && x !== nil) { 4552 return 0; 4553 } 4554 4555 return nil; 4556 4557 }); 4558 4559 $def(self, '$method', function $$method(name) { 4560 var self = this; 4561 4562 4563 var meth = self[$jsid(name)]; 4564 4565 if (!meth || meth.$$stub) { 4566 $Kernel.$raise($$$('NameError').$new("undefined method `" + (name) + "' for class `" + (self.$class()) + "'", name)); 4567 } 4568 4569 return $$$('Method').$new(self, meth.$$owner || self.$class(), meth, name); 4570 4571 }); 4572 4573 $def(self, '$methods', function $$methods(all) { 4574 var self = this; 4575 4576 4577 if (all == null) all = true; 4578 4579 if ($truthy(all)) { 4580 return Opal.methods(self); 4581 } else { 4582 return Opal.own_methods(self); 4583 } 4584 }, -1); 4585 4586 $def(self, '$public_methods', function $$public_methods(all) { 4587 var self = this; 4588 4589 4590 if (all == null) all = true; 4591 4592 if ($truthy(all)) { 4593 return Opal.methods(self); 4594 } else { 4595 return Opal.receiver_methods(self); 4596 } 4597 }, -1); 4598 4599 $def(self, '$Array', function $$Array(object) { 4600 4601 4602 var coerced; 4603 4604 if (object === nil) { 4605 return []; 4606 } 4607 4608 if (object.$$is_array) { 4609 return object; 4610 } 4611 4612 coerced = $Opal['$coerce_to?'](object, $$$('Array'), "to_ary"); 4613 if (coerced !== nil) { return coerced; } 4614 4615 coerced = $Opal['$coerce_to?'](object, $$$('Array'), "to_a"); 4616 if (coerced !== nil) { return coerced; } 4617 4618 return [object]; 4619 4620 }); 4621 4622 $def(self, '$at_exit', function $$at_exit() { 4623 var block = $$at_exit.$$p || nil, $ret_or_1 = nil; 4624 if ($gvars.__at_exit__ == null) $gvars.__at_exit__ = nil; 4625 4626 $$at_exit.$$p = null; 4627 $gvars.__at_exit__ = ($truthy(($ret_or_1 = $gvars.__at_exit__)) ? ($ret_or_1) : ([])); 4628 $gvars.__at_exit__['$<<'](block); 4629 return block; 4630 }); 4631 4632 $def(self, '$caller', function $$caller(start, length) { 4633 4634 4635 if (start == null) start = 1; 4636 if (length == null) length = nil; 4637 4638 var stack, result; 4639 4640 stack = new Error().$backtrace(); 4641 result = []; 4642 4643 for (var i = start + 1, ii = stack.length; i < ii; i++) { 4644 if (!stack[i].match(/runtime\.js/)) { 4645 result.push(stack[i]); 4646 } 4647 } 4648 if (length != nil) result = result.slice(0, length); 4649 return result; 4650 }, -1); 4651 4652 $def(self, '$caller_locations', function $$caller_locations($a) { 4653 var $post_args, args, self = this; 4654 4655 4656 $post_args = $slice(arguments); 4657 args = $post_args; 4658 return $send($send(self, 'caller', $to_a(args)), 'map', [], function $$4(loc){ 4659 4660 if (loc == null) loc = nil; 4661 return $$$($$$($$$('Thread'), 'Backtrace'), 'Location').$new(loc);}); 4662 }, -1); 4663 4664 $def(self, '$class', function $Kernel_class$5() { 4665 var self = this; 4666 4667 return self.$$class; 4668 }); 4669 4670 $def(self, '$copy_instance_variables', function $$copy_instance_variables(other) { 4671 var self = this; 4672 4673 4674 var keys = Object.keys(other), i, ii, name; 4675 for (i = 0, ii = keys.length; i < ii; i++) { 4676 name = keys[i]; 4677 if (name.charAt(0) !== '$' && other.hasOwnProperty(name)) { 4678 self[name] = other[name]; 4679 } 4680 } 4681 4682 }); 4683 4684 $def(self, '$copy_singleton_methods', function $$copy_singleton_methods(other) { 4685 var self = this; 4686 4687 4688 var i, name, names, length; 4689 4690 if (other.hasOwnProperty('$$meta') && other.$$meta !== null) { 4691 var other_singleton_class = Opal.get_singleton_class(other); 4692 var self_singleton_class = Opal.get_singleton_class(self); 4693 names = Object.getOwnPropertyNames(other_singleton_class.$$prototype); 4694 4695 for (i = 0, length = names.length; i < length; i++) { 4696 name = names[i]; 4697 if (Opal.is_method(name)) { 4698 self_singleton_class.$$prototype[name] = other_singleton_class.$$prototype[name]; 4699 } 4700 } 4701 4702 self_singleton_class.$$const = Object.assign({}, other_singleton_class.$$const); 4703 Object.setPrototypeOf( 4704 self_singleton_class.$$prototype, 4705 Object.getPrototypeOf(other_singleton_class.$$prototype) 4706 ); 4707 } 4708 4709 for (i = 0, names = Object.getOwnPropertyNames(other), length = names.length; i < length; i++) { 4710 name = names[i]; 4711 if (name.charAt(0) === '$' && name.charAt(1) !== '$' && other.hasOwnProperty(name)) { 4712 self[name] = other[name]; 4713 } 4714 } 4715 4716 }); 4717 4718 $def(self, '$clone', function $$clone($kwargs) { 4719 var freeze, self = this, copy = nil; 4720 4721 4722 $kwargs = $ensure_kwargs($kwargs); 4723 4724 freeze = $kwargs.$$smap["freeze"];if (freeze == null) freeze = nil; 4725 if (!(($truthy(freeze['$nil?']()) || ($eqeq(freeze, true))) || ($eqeq(freeze, false)))) { 4726 self.$raise($$('ArgumentError'), "unexpected value for freeze: " + (freeze.$class())); 4727 } copy = self.$class().$allocate(); 4728 copy.$copy_instance_variables(self); 4729 copy.$copy_singleton_methods(self); 4730 copy.$initialize_clone(self, $hash2(["freeze"], {"freeze": freeze})); 4731 if (($eqeq(freeze, true) || (($truthy(freeze['$nil?']()) && ($truthy(self['$frozen?']())))))) { 4732 copy.$freeze(); 4733 } return copy; 4734 }, -1); 4735 4736 $def(self, '$initialize_clone', function $$initialize_clone(other, $kwargs) { 4737 var self = this; 4738 4739 4740 $kwargs = $ensure_kwargs($kwargs); 4741 4742 $kwargs.$$smap["freeze"]; self.$initialize_copy(other); 4743 return self; 4744 }, -2); 4745 4746 $def(self, '$define_singleton_method', function $$define_singleton_method(name, method) { 4747 var block = $$define_singleton_method.$$p || nil, self = this; 4748 4749 $$define_singleton_method.$$p = null; 4750 return $send(self.$singleton_class(), 'define_method', [name, method], block.$to_proc()); 4751 }, -2); 4752 4753 $def(self, '$dup', function $$dup() { 4754 var self = this, copy = nil; 4755 4756 4757 copy = self.$class().$allocate(); 4758 copy.$copy_instance_variables(self); 4759 copy.$initialize_dup(self); 4760 return copy; 4761 }); 4762 4763 $def(self, '$initialize_dup', function $$initialize_dup(other) { 4764 var self = this; 4765 4766 return self.$initialize_copy(other) 4767 }); 4768 4769 $def(self, '$enum_for', function $$enum_for($a, $b) { 4770 var block = $$enum_for.$$p || nil, $post_args, method, args, self = this; 4771 4772 $$enum_for.$$p = null; 4773 $post_args = $slice(arguments); 4774 4775 if ($post_args.length > 0) method = $post_args.shift();if (method == null) method = "each"; 4776 args = $post_args; 4777 return $send($$$('Enumerator'), 'for', [self, method].concat($to_a(args)), block.$to_proc()); 4778 }, -1); 4779 4780 $def(self, '$equal?', function $Kernel_equal$ques$6(other) { 4781 var self = this; 4782 4783 return self === other; 4784 }); 4785 4786 $def(self, '$exit', function $$exit(status) { 4787 var $ret_or_1 = nil, block = nil; 4788 if ($gvars.__at_exit__ == null) $gvars.__at_exit__ = nil; 4789 4790 4791 if (status == null) status = true; 4792 $gvars.__at_exit__ = ($truthy(($ret_or_1 = $gvars.__at_exit__)) ? ($ret_or_1) : ([])); 4793 while (!($truthy($gvars.__at_exit__['$empty?']()))) { 4794 4795 block = $gvars.__at_exit__.$pop(); 4796 block.$call(); 4797 } 4798 if (status.$$is_boolean) { 4799 status = status ? 0 : 1; 4800 } else { 4801 status = $coerce_to(status, $$$('Integer'), 'to_int'); 4802 } 4803 4804 Opal.exit(status); 4805 return nil; 4806 }, -1); 4807 4808 $def(self, '$extend', function $$extend($a) { 4809 var $post_args, mods, self = this; 4810 4811 4812 $post_args = $slice(arguments); 4813 mods = $post_args; 4814 4815 if (mods.length == 0) { 4816 self.$raise($$$('ArgumentError'), "wrong number of arguments (given 0, expected 1+)"); 4817 } 4818 4819 $deny_frozen_access(self); 4820 4821 var singleton = self.$singleton_class(); 4822 4823 for (var i = mods.length - 1; i >= 0; i--) { 4824 var mod = mods[i]; 4825 4826 if (!mod.$$is_module) { 4827 $Kernel.$raise($$$('TypeError'), "wrong argument type " + ((mod).$class()) + " (expected Module)"); 4828 } 4829 4830 (mod).$append_features(singleton); 4831 (mod).$extend_object(self); 4832 (mod).$extended(self); 4833 } 4834 return self; 4835 }, -1); 4836 4837 $def(self, '$freeze', function $$freeze() { 4838 var self = this; 4839 4840 4841 if ($truthy(self['$frozen?']())) { 4842 return self 4843 } 4844 if (typeof(self) === "object") { 4845 $freeze_props(self); 4846 return $freeze(self); 4847 } 4848 return self; 4849 }); 4850 4851 $def(self, '$frozen?', function $Kernel_frozen$ques$7() { 4852 var self = this; 4853 4854 4855 switch (typeof(self)) { 4856 case "string": 4857 case "symbol": 4858 case "number": 4859 case "boolean": 4860 return true; 4861 case "object": 4862 return (self.$$frozen || false); 4863 default: 4864 return false; 4865 } 4866 4867 }); 4868 4869 $def(self, '$gets', function $$gets($a) { 4870 var $post_args, args; 4871 if ($gvars.stdin == null) $gvars.stdin = nil; 4872 4873 4874 $post_args = $slice(arguments); 4875 args = $post_args; 4876 return $send($gvars.stdin, 'gets', $to_a(args)); 4877 }, -1); 4878 4879 $def(self, '$hash', function $$hash() { 4880 var self = this; 4881 4882 return self.$__id__() 4883 }); 4884 4885 $def(self, '$initialize_copy', $return_val(nil)); 4886 var inspect_stack = []; 4887 4888 $def(self, '$inspect', function $$inspect() { 4889 var self = this, ivs = nil, id = nil, pushed = nil, e = nil; 4890 4891 return (function() { try { 4892 try { 4893 4894 ivs = ""; 4895 id = self.$__id__(); 4896 if ($truthy((inspect_stack)['$include?'](id))) { 4897 ivs = " ..."; 4898 } else { 4899 4900 (inspect_stack)['$<<'](id); 4901 pushed = true; 4902 $send(self.$instance_variables(), 'each', [], function $$8(i){var self = $$8.$$s == null ? this : $$8.$$s, ivar = nil, inspect = nil; 4903 4904 4905 if (i == null) i = nil; 4906 ivar = self.$instance_variable_get(i); 4907 inspect = $$('Opal').$inspect(ivar); 4908 return (ivs = $rb_plus(ivs, " " + (i) + "=" + (inspect)));}, {$$s: self}); 4909 }; 4910 return "#<" + (self.$class()) + ":0x" + (id.$to_s(16)) + (ivs) + ">"; 4911 } catch ($err) { 4912 if (Opal.rescue($err, [$$('StandardError')])) {(e = $err); 4913 try { 4914 return "#<" + (self.$class()) + ":0x" + (id.$to_s(16)) + ">" 4915 } finally { Opal.pop_exception(); } 4916 } else { throw $err; } 4917 } 4918 } finally { 4919 ($truthy(pushed) ? ((inspect_stack).$pop()) : nil); 4920 } })() 4921 }); 4922 4923 $def(self, '$instance_of?', function $Kernel_instance_of$ques$9(klass) { 4924 var self = this; 4925 4926 4927 if (!klass.$$is_class && !klass.$$is_module) { 4928 $Kernel.$raise($$$('TypeError'), "class or module required"); 4929 } 4930 4931 return self.$$class === klass; 4932 4933 }); 4934 4935 $def(self, '$instance_variable_defined?', function $Kernel_instance_variable_defined$ques$10(name) { 4936 var self = this; 4937 4938 4939 name = $Opal['$instance_variable_name!'](name); 4940 return Opal.hasOwnProperty.call(self, name.substr(1)); }); 4941 4942 $def(self, '$instance_variable_get', function $$instance_variable_get(name) { 4943 var self = this; 4944 4945 4946 name = $Opal['$instance_variable_name!'](name); 4947 4948 var ivar = self[Opal.ivar(name.substr(1))]; 4949 4950 return ivar == null ? nil : ivar; 4951 }); 4952 4953 $def(self, '$instance_variable_set', function $$instance_variable_set(name, value) { 4954 var self = this; 4955 4956 4957 $deny_frozen_access(self); 4958 name = $Opal['$instance_variable_name!'](name); 4959 return self[Opal.ivar(name.substr(1))] = value; }); 4960 4961 $def(self, '$remove_instance_variable', function $$remove_instance_variable(name) { 4962 var self = this; 4963 4964 4965 name = $Opal['$instance_variable_name!'](name); 4966 4967 var key = Opal.ivar(name.substr(1)), 4968 val; 4969 if (self.hasOwnProperty(key)) { 4970 val = self[key]; 4971 delete self[key]; 4972 return val; 4973 } 4974 return $Kernel.$raise($$$('NameError'), "instance variable " + (name) + " not defined"); 4975 }); 4976 4977 $def(self, '$instance_variables', function $$instance_variables() { 4978 var self = this; 4979 4980 4981 var result = [], ivar; 4982 4983 for (var name in self) { 4984 if (self.hasOwnProperty(name) && name.charAt(0) !== '$') { 4985 if (name.substr(-1) === '$') { 4986 ivar = name.slice(0, name.length - 1); 4987 } else { 4988 ivar = name; 4989 } 4990 result.push('@' + ivar); 4991 } 4992 } 4993 4994 return result; 4995 4996 }); 4997 4998 $def(self, '$Integer', function $$Integer(value, base) { 4999 5000 var i, str, base_digits; 5001 5002 if (!value.$$is_string) { 5003 if (base !== undefined) { 5004 $Kernel.$raise($$$('ArgumentError'), "base specified for non string value"); 5005 } 5006 if (value === nil) { 5007 $Kernel.$raise($$$('TypeError'), "can't convert nil into Integer"); 5008 } 5009 if (value.$$is_number) { 5010 if (value === Infinity || value === -Infinity || isNaN(value)) { 5011 $Kernel.$raise($$$('FloatDomainError'), value); 5012 } 5013 return Math.floor(value); 5014 } 5015 if (value['$respond_to?']("to_int")) { 5016 i = value.$to_int(); 5017 if (i !== nil) { 5018 return i; 5019 } 5020 } 5021 return $Opal['$coerce_to!'](value, $$$('Integer'), "to_i"); 5022 } 5023 5024 if (value === "0") { 5025 return 0; 5026 } 5027 5028 if (base === undefined) { 5029 base = 0; 5030 } else { 5031 base = $coerce_to(base, $$$('Integer'), 'to_int'); 5032 if (base === 1 || base < 0 || base > 36) { 5033 $Kernel.$raise($$$('ArgumentError'), "invalid radix " + (base)); 5034 } 5035 } 5036 5037 str = value.toLowerCase(); 5038 5039 str = str.replace(/(\d)_(?=\d)/g, '$1'); 5040 5041 str = str.replace(/^(\s*[+-]?)(0[bodx]?)/, function (_, head, flag) { 5042 switch (flag) { 5043 case '0b': 5044 if (base === 0 || base === 2) { 5045 base = 2; 5046 return head; 5047 } 5048 // no-break 5049 case '0': 5050 case '0o': 5051 if (base === 0 || base === 8) { 5052 base = 8; 5053 return head; 5054 } 5055 // no-break 5056 case '0d': 5057 if (base === 0 || base === 10) { 5058 base = 10; 5059 return head; 5060 } 5061 // no-break 5062 case '0x': 5063 if (base === 0 || base === 16) { 5064 base = 16; 5065 return head; 5066 } 5067 // no-break 5068 } 5069 $Kernel.$raise($$$('ArgumentError'), "invalid value for Integer(): \"" + (value) + "\""); 5070 }); 5071 5072 base = (base === 0 ? 10 : base); 5073 5074 base_digits = '0-' + (base <= 10 ? base - 1 : '9a-' + String.fromCharCode(97 + (base - 11))); 5075 5076 if (!(new RegExp('^\\s*[+-]?[' + base_digits + ']+\\s*$')).test(str)) { 5077 $Kernel.$raise($$$('ArgumentError'), "invalid value for Integer(): \"" + (value) + "\""); 5078 } 5079 5080 i = parseInt(str, base); 5081 5082 if (isNaN(i)) { 5083 $Kernel.$raise($$$('ArgumentError'), "invalid value for Integer(): \"" + (value) + "\""); 5084 } 5085 5086 return i; 5087 }, -2); 5088 5089 $def(self, '$Float', function $$Float(value) { 5090 5091 5092 var str; 5093 5094 if (value === nil) { 5095 $Kernel.$raise($$$('TypeError'), "can't convert nil into Float"); 5096 } 5097 5098 if (value.$$is_string) { 5099 str = value.toString(); 5100 5101 str = str.replace(/(\d)_(?=\d)/g, '$1'); 5102 5103 //Special case for hex strings only: 5104 if (/^\s*[-+]?0[xX][0-9a-fA-F]+\s*$/.test(str)) { 5105 return $Kernel.$Integer(str); 5106 } 5107 5108 if (!/^\s*[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\s*$/.test(str)) { 5109 $Kernel.$raise($$$('ArgumentError'), "invalid value for Float(): \"" + (value) + "\""); 5110 } 5111 5112 return parseFloat(str); 5113 } 5114 5115 return $Opal['$coerce_to!'](value, $$$('Float'), "to_f"); 5116 5117 }); 5118 5119 $def(self, '$Hash', function $$Hash(arg) { 5120 5121 5122 if (($truthy(arg['$nil?']()) || ($eqeq(arg, [])))) { 5123 return $hash2([], {}) 5124 } if ($eqeqeq($$$('Hash'), arg)) { 5125 return arg 5126 } return $Opal['$coerce_to!'](arg, $$$('Hash'), "to_hash"); 5127 }); 5128 5129 $def(self, '$is_a?', function $Kernel_is_a$ques$11(klass) { 5130 var self = this; 5131 5132 5133 if (!klass.$$is_class && !klass.$$is_module) { 5134 $Kernel.$raise($$$('TypeError'), "class or module required"); 5135 } 5136 5137 return Opal.is_a(self, klass); 5138 5139 }); 5140 5141 $def(self, '$itself', $return_self); 5142 5143 $def(self, '$lambda', function $$lambda() { 5144 var block = $$lambda.$$p || nil; 5145 5146 $$lambda.$$p = null; 5147 return Opal.lambda(block); }); 5148 5149 $def(self, '$load', function $$load(file) { 5150 5151 5152 file = $Opal['$coerce_to!'](file, $$$('String'), "to_str"); 5153 return Opal.load(file); 5154 }); 5155 5156 $def(self, '$loop', function $$loop() { 5157 var $yield = $$loop.$$p || nil, self = this, e = nil; 5158 5159 $$loop.$$p = null; 5160 5161 if (!($yield !== nil)) { 5162 return $send(self, 'enum_for', ["loop"], function $$12(){ 5163 return $$$($$$('Float'), 'INFINITY')}) 5164 } while ($truthy(true)) { 5165 5166 try { 5167 Opal.yieldX($yield, []); 5168 } catch ($err) { 5169 if (Opal.rescue($err, [$$$('StopIteration')])) {(e = $err); 5170 try { 5171 return e.$result() 5172 } finally { Opal.pop_exception(); } 5173 } else { throw $err; } 5174 } } return self; 5175 }); 5176 5177 $def(self, '$nil?', $return_val(false)); 5178 5179 $def(self, '$printf', function $$printf($a) { 5180 var $post_args, args, self = this; 5181 5182 5183 $post_args = $slice(arguments); 5184 args = $post_args; 5185 if ($truthy(args['$any?']())) { 5186 self.$print($send(self, 'format', $to_a(args))); 5187 } return nil; 5188 }, -1); 5189 5190 $def(self, '$proc', function $$proc() { 5191 var block = $$proc.$$p || nil; 5192 5193 $$proc.$$p = null; 5194 if (!$truthy(block)) { 5195 $Kernel.$raise($$$('ArgumentError'), "tried to create Proc object without a block"); 5196 } block.$$is_lambda = false; 5197 return block; 5198 }); 5199 5200 $def(self, '$puts', function $$puts($a) { 5201 var $post_args, strs; 5202 if ($gvars.stdout == null) $gvars.stdout = nil; 5203 5204 5205 $post_args = $slice(arguments); 5206 strs = $post_args; 5207 return $send($gvars.stdout, 'puts', $to_a(strs)); 5208 }, -1); 5209 5210 $def(self, '$p', function $$p($a) { 5211 var $post_args, args; 5212 5213 5214 $post_args = $slice(arguments); 5215 args = $post_args; 5216 $send(args, 'each', [], function $$13(obj){ if ($gvars.stdout == null) $gvars.stdout = nil; 5217 5218 5219 if (obj == null) obj = nil; 5220 return $gvars.stdout.$puts(obj.$inspect());}); 5221 if ($truthy($rb_le(args.$length(), 1))) { 5222 return args['$[]'](0) 5223 } else { 5224 return args 5225 } }, -1); 5226 5227 $def(self, '$print', function $$print($a) { 5228 var $post_args, strs; 5229 if ($gvars.stdout == null) $gvars.stdout = nil; 5230 5231 5232 $post_args = $slice(arguments); 5233 strs = $post_args; 5234 return $send($gvars.stdout, 'print', $to_a(strs)); 5235 }, -1); 5236 5237 $def(self, '$readline', function $$readline($a) { 5238 var $post_args, args; 5239 if ($gvars.stdin == null) $gvars.stdin = nil; 5240 5241 5242 $post_args = $slice(arguments); 5243 args = $post_args; 5244 return $send($gvars.stdin, 'readline', $to_a(args)); 5245 }, -1); 5246 5247 $def(self, '$warn', function $$warn($a, $b) { 5248 var $post_args, $kwargs, strs, uplevel, $c, $d, self = this, location = nil; 5249 if ($gvars.VERBOSE == null) $gvars.VERBOSE = nil; 5250 if ($gvars.stderr == null) $gvars.stderr = nil; 5251 5252 5253 $post_args = $slice(arguments); 5254 $kwargs = $extract_kwargs($post_args); 5255 $kwargs = $ensure_kwargs($kwargs); 5256 strs = $post_args; 5257 5258 uplevel = $kwargs.$$smap["uplevel"];if (uplevel == null) uplevel = nil; 5259 if ($truthy(uplevel)) { 5260 5261 uplevel = $Opal['$coerce_to!'](uplevel, $$$('Integer'), "to_str"); 5262 if ($truthy($rb_lt(uplevel, 0))) { 5263 $Kernel.$raise($$$('ArgumentError'), "negative level (" + (uplevel) + ")"); 5264 } location = ($c = ($d = self.$caller($rb_plus(uplevel, 1), 1).$first(), ($d === nil || $d == null) ? nil : $d.$split(":in `")), ($c === nil || $c == null) ? nil : $c.$first()); 5265 if ($truthy(location)) { 5266 location = "" + (location) + ": "; 5267 } strs = $send(strs, 'map', [], function $$14(s){ 5268 5269 if (s == null) s = nil; 5270 return "" + (location) + "warning: " + (s);}); 5271 } if (($truthy($gvars.VERBOSE['$nil?']()) || ($truthy(strs['$empty?']())))) { 5272 return nil 5273 } else { 5274 return $send($gvars.stderr, 'puts', $to_a(strs)) 5275 } }, -1); 5276 5277 $def(self, '$raise', function $$raise(exception, string, backtrace) { 5278 if ($gvars["!"] == null) $gvars["!"] = nil; 5279 if ($gvars["@"] == null) $gvars["@"] = nil; 5280 if (string == null) string = nil; 5281 if (backtrace == null) backtrace = nil; 5282 5283 if (exception == null && $gvars["!"] !== nil) { 5284 throw $gvars["!"]; 5285 } 5286 if (exception == null) { 5287 exception = $$$('RuntimeError').$new(""); 5288 } 5289 else if ($respond_to(exception, '$to_str')) { 5290 exception = $$$('RuntimeError').$new(exception.$to_str()); 5291 } 5292 // using respond_to? and not an undefined check to avoid method_missing matching as true 5293 else if (exception.$$is_class && $respond_to(exception, '$exception')) { 5294 exception = exception.$exception(string); 5295 } 5296 else if (exception.$$is_exception) ; 5297 else { 5298 exception = $$$('TypeError').$new("exception class/object expected"); 5299 } 5300 5301 if (backtrace !== nil) { 5302 exception.$set_backtrace(backtrace); 5303 } 5304 5305 if ($gvars["!"] !== nil) { 5306 Opal.exceptions.push($gvars["!"]); 5307 } 5308 5309 $gvars["!"] = exception; 5310 $gvars["@"] = (exception).$backtrace(); 5311 5312 throw exception; 5313 }, -1); 5314 5315 $def(self, '$rand', function $$rand(max) { 5316 5317 if (max === undefined) { 5318 return $$$($$$('Random'), 'DEFAULT').$rand(); 5319 } 5320 5321 if (max.$$is_number) { 5322 if (max < 0) { 5323 max = Math.abs(max); 5324 } 5325 5326 if (max % 1 !== 0) { 5327 max = max.$to_i(); 5328 } 5329 5330 if (max === 0) { 5331 max = undefined; 5332 } 5333 } 5334 return $$$($$$('Random'), 'DEFAULT').$rand(max); 5335 }, -1); 5336 5337 $def(self, '$respond_to?', function $Kernel_respond_to$ques$15(name, include_all) { 5338 var self = this; 5339 5340 5341 if (include_all == null) include_all = false; 5342 5343 var body = self[$jsid(name)]; 5344 5345 if (typeof(body) === "function" && !body.$$stub) { 5346 return true; 5347 } 5348 5349 if (self['$respond_to_missing?'].$$pristine === true) { 5350 return false; 5351 } else { 5352 return self['$respond_to_missing?'](name, include_all); 5353 } 5354 }, -2); 5355 5356 $def(self, '$respond_to_missing?', function $Kernel_respond_to_missing$ques$16(method_name, include_all) { 5357 return false; 5358 }, -2); 5359 $Opal.$pristine(self, "respond_to?", "respond_to_missing?"); 5360 5361 $def(self, '$require', function $$require(file) { 5362 5363 5364 // As Object.require refers to Kernel.require once Kernel has been loaded the String 5365 // class may not be available yet, the coercion requires both String and Array to be loaded. 5366 if (typeof file !== 'string' && Opal.String && Opal.Array) { 5367 (file = $Opal['$coerce_to!'](file, $$$('String'), "to_str")); 5368 } 5369 return Opal.require(file) 5370 5371 }); 5372 5373 $def(self, '$require_relative', function $$require_relative(file) { 5374 5375 5376 $Opal['$try_convert!'](file, $$$('String'), "to_str"); 5377 file = $$$('File').$expand_path($$$('File').$join(Opal.current_file, "..", file)); 5378 return Opal.require(file); 5379 }); 5380 5381 $def(self, '$require_tree', function $$require_tree(path, $kwargs) { 5382 var autoload; 5383 5384 5385 $kwargs = $ensure_kwargs($kwargs); 5386 5387 autoload = $kwargs.$$smap["autoload"];if (autoload == null) autoload = false; 5388 5389 var result = []; 5390 5391 path = $$$('File').$expand_path(path); 5392 path = Opal.normalize(path); 5393 if (path === '.') path = ''; 5394 for (var name in Opal.modules) { 5395 if ((name)['$start_with?'](path)) { 5396 if(!autoload) { 5397 result.push([name, Opal.require(name)]); 5398 } else { 5399 result.push([name, true]); // do nothing, delegated to a autoloading 5400 } 5401 } 5402 } 5403 5404 return result; 5405 }, -2); 5406 5407 $def(self, '$singleton_class', function $$singleton_class() { 5408 var self = this; 5409 5410 return Opal.get_singleton_class(self); 5411 }); 5412 5413 $def(self, '$sleep', function $$sleep(seconds) { 5414 5415 5416 if (seconds == null) seconds = nil; 5417 5418 if (seconds === nil) { 5419 $Kernel.$raise($$$('TypeError'), "can't convert NilClass into time interval"); 5420 } 5421 if (!seconds.$$is_number) { 5422 $Kernel.$raise($$$('TypeError'), "can't convert " + (seconds.$class()) + " into time interval"); 5423 } 5424 if (seconds < 0) { 5425 $Kernel.$raise($$$('ArgumentError'), "time interval must be positive"); 5426 } 5427 var get_time = Opal.global.performance ? 5428 function() {return performance.now()} : 5429 function() {return new Date()}; 5430 5431 var t = get_time(); 5432 while (get_time() - t <= seconds * 1000); 5433 return Math.round(seconds); 5434 }, -1); 5435 5436 $def(self, '$srand', function $$srand(seed) { 5437 5438 5439 if (seed == null) seed = $$('Random').$new_seed(); 5440 return $$$('Random').$srand(seed); 5441 }, -1); 5442 5443 $def(self, '$String', function $$String(str) { 5444 var $ret_or_1 = nil; 5445 5446 if ($truthy(($ret_or_1 = $Opal['$coerce_to?'](str, $$$('String'), "to_str")))) { 5447 return $ret_or_1 5448 } else { 5449 return $Opal['$coerce_to!'](str, $$$('String'), "to_s") 5450 } 5451 }); 5452 5453 $def(self, '$tap', function $$tap() { 5454 var block = $$tap.$$p || nil, self = this; 5455 5456 $$tap.$$p = null; 5457 Opal.yield1(block, self); 5458 return self; 5459 }); 5460 5461 $def(self, '$to_proc', $return_self); 5462 5463 $def(self, '$to_s', function $$to_s() { 5464 var self = this; 5465 5466 return "#<" + (self.$class()) + ":0x" + (self.$__id__().$to_s(16)) + ">" 5467 }); 5468 5469 $def(self, '$catch', function $Kernel_catch$17(tag) { 5470 var $yield = $Kernel_catch$17.$$p || nil, $ret_or_1 = nil, e = nil; 5471 5472 $Kernel_catch$17.$$p = null; 5473 5474 if (tag == null) tag = nil; 5475 try { 5476 5477 tag = ($truthy(($ret_or_1 = tag)) ? ($ret_or_1) : ($Object.$new())); 5478 return Opal.yield1($yield, tag);; 5479 } catch ($err) { 5480 if (Opal.rescue($err, [$$$('UncaughtThrowError')])) {(e = $err); 5481 try { 5482 5483 if ($eqeq(e.$tag(), tag)) { 5484 return e.$value() 5485 }; 5486 return $Kernel.$raise(); 5487 } finally { Opal.pop_exception(); } 5488 } else { throw $err; } 5489 } }, -1); 5490 5491 $def(self, '$throw', function $Kernel_throw$18(tag, obj) { 5492 5493 5494 if (obj == null) obj = nil; 5495 return $Kernel.$raise($$$('UncaughtThrowError').$new(tag, obj)); 5496 }, -2); 5497 5498 $def(self, '$open', function $$open($a) { 5499 var block = $$open.$$p || nil, $post_args, args; 5500 5501 $$open.$$p = null; 5502 $post_args = $slice(arguments); 5503 args = $post_args; 5504 return $send($$$('File'), 'open', $to_a(args), block.$to_proc()); 5505 }, -1); 5506 5507 $def(self, '$yield_self', function $$yield_self() { 5508 var $yield = $$yield_self.$$p || nil, self = this; 5509 5510 $$yield_self.$$p = null; 5511 5512 if (!($yield !== nil)) { 5513 return $send(self, 'enum_for', ["yield_self"], $return_val(1)) 5514 } return Opal.yield1($yield, self); }); 5515 $alias(self, "fail", "raise"); 5516 $alias(self, "kind_of?", "is_a?"); 5517 $alias(self, "object_id", "__id__"); 5518 $alias(self, "public_send", "__send__"); 5519 $alias(self, "send", "__send__"); 5520 $alias(self, "then", "yield_self"); 5521 return $alias(self, "to_enum", "enum_for"); 5522 })('::', $nesting); 5523 return (function($base, $super) { 5524 var self = $klass($base, $super, 'Object'); 5525 5526 5527 5528 delete $Object.$$prototype.$require; 5529 return self.$include($Kernel); 5530 })('::', null); 5531}; 5532 5533Opal.modules["corelib/main"] = function(Opal) {/* Generated by Opal 1.7.3 */ 5534 var $return_val = Opal.return_val, $def = Opal.def, $Object = Opal.Object, $slice = Opal.slice, $Kernel = Opal.Kernel, self = Opal.top; Opal.nil; 5535 5536 Opal.add_stubs('include,raise'); 5537 return (function(self, $parent_nesting) { 5538 5539 5540 5541 $def(self, '$to_s', $return_val("main")); 5542 5543 $def(self, '$include', function $$include(mod) { 5544 5545 return $Object.$include(mod) 5546 }); 5547 5548 $def(self, '$autoload', function $$autoload($a) { 5549 var $post_args, args; 5550 5551 5552 $post_args = $slice(arguments); 5553 args = $post_args; 5554 return Opal.Object.$autoload.apply(Opal.Object, args); }, -1); 5555 return $def(self, '$using', function $$using(mod) { 5556 5557 return $Kernel.$raise("main.using is permitted only at toplevel") 5558 }); 5559 })(Opal.get_singleton_class(self)) 5560}; 5561 5562Opal.modules["corelib/error/errno"] = function(Opal) {/* Generated by Opal 1.7.3 */ 5563 var $module = Opal.module, $truthy = Opal.truthy, $rb_plus = Opal.rb_plus, $send2 = Opal.send2, $find_super = Opal.find_super, $def = Opal.def, $klass = Opal.klass, nil = Opal.nil, $$$ = Opal.$$$; 5564 5565 Opal.add_stubs('+,errno,class,attr_reader'); 5566 5567 (function($base, $parent_nesting) { 5568 var self = $module($base, 'Errno'); 5569 5570 var errors = nil, klass = nil; 5571 5572 5573 errors = [["EINVAL", "Invalid argument", 22], ["EEXIST", "File exists", 17], ["EISDIR", "Is a directory", 21], ["EMFILE", "Too many open files", 24], ["ESPIPE", "Illegal seek", 29], ["EACCES", "Permission denied", 13], ["EPERM", "Operation not permitted", 1], ["ENOENT", "No such file or directory", 2], ["ENAMETOOLONG", "File name too long", 36]]; 5574 klass = nil; 5575 5576 var i; 5577 for (i = 0; i < errors.length; i++) { 5578 (function() { // Create a closure 5579 var class_name = errors[i][0]; 5580 var default_message = errors[i][1]; 5581 var errno = errors[i][2]; 5582 5583 klass = Opal.klass(self, Opal.SystemCallError, class_name); 5584 klass.errno = errno; 5585 5586 (function(self, $parent_nesting) { 5587 5588 return $def(self, '$new', function $new$1(name) { 5589 var self = this, message = nil; 5590 5591 $new$1.$$p = null; 5592 5593 if (name == null) name = nil; 5594 message = default_message; 5595 if ($truthy(name)) { 5596 message = $rb_plus(message, " - " + (name)); 5597 } return $send2(self, $find_super(self, 'new', $new$1, false, true), 'new', [message], null); 5598 }, -1) 5599 })(Opal.get_singleton_class(klass)); 5600 })(); 5601 } 5602 })('::'); 5603 return (function($base, $super, $parent_nesting) { 5604 var self = $klass($base, $super, 'SystemCallError'); 5605 5606 5607 5608 $def(self, '$errno', function $$errno() { 5609 var self = this; 5610 5611 return self.$class().$errno() 5612 }); 5613 return (function(self, $parent_nesting) { 5614 5615 return self.$attr_reader("errno") 5616 })(Opal.get_singleton_class(self)); 5617 })('::', $$$('StandardError')); 5618}; 5619 5620Opal.modules["corelib/error"] = function(Opal) {/* Generated by Opal 1.7.3 */ 5621 var $klass = Opal.klass, $slice = Opal.slice, $gvars = Opal.gvars, $defs = Opal.defs, $send = Opal.send, $to_a = Opal.to_a, $def = Opal.def, $truthy = Opal.truthy, $hash2 = Opal.hash2, $Kernel = Opal.Kernel, $not = Opal.not, $rb_plus = Opal.rb_plus, $eqeq = Opal.eqeq, $Object = Opal.Object, $ensure_kwargs = Opal.ensure_kwargs, $send2 = Opal.send2, $find_super = Opal.find_super, $module = Opal.module, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 5622 5623 Opal.add_stubs('new,map,backtrace,clone,to_s,merge,tty?,[],include?,raise,dup,empty?,!,caller,shift,+,class,join,cause,full_message,==,reverse,split,autoload,attr_reader,inspect'); 5624 5625 (function($base, $super, $parent_nesting) { 5626 var self = $klass($base, $super, 'Exception'); 5627 5628 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype; 5629 5630 $proto.message = nil; 5631 5632 Opal.prop(self.$$prototype, '$$is_exception', true); 5633 var stack_trace_limit; 5634 Error.stackTraceLimit = 100; 5635 $defs(self, '$new', function $Exception_new$1($a) { 5636 var $post_args, args, self = this; 5637 if ($gvars["!"] == null) $gvars["!"] = nil; 5638 5639 5640 $post_args = $slice(arguments); 5641 args = $post_args; 5642 5643 var message = (args.length > 0) ? args[0] : nil; 5644 var error = new self.$$constructor(message); 5645 error.name = self.$$name; 5646 error.message = message; 5647 error.cause = $gvars["!"]; 5648 Opal.send(error, error.$initialize, args); 5649 5650 // Error.captureStackTrace() will use .name and .toString to build the 5651 // first line of the stack trace so it must be called after the error 5652 // has been initialized. 5653 // https://nodejs.org/dist/latest-v6.x/docs/api/errors.html 5654 if (Opal.config.enable_stack_trace && Error.captureStackTrace) { 5655 // Passing Kernel.raise will cut the stack trace from that point above 5656 Error.captureStackTrace(error, stack_trace_limit); 5657 } 5658 5659 return error; 5660 }, -1); 5661 stack_trace_limit = self.$new; 5662 $defs(self, '$exception', function $$exception($a) { 5663 var $post_args, args, self = this; 5664 5665 5666 $post_args = $slice(arguments); 5667 args = $post_args; 5668 return $send(self, 'new', $to_a(args)); 5669 }, -1); 5670 5671 $def(self, '$initialize', function $$initialize($a) { 5672 var $post_args, args, self = this; 5673 5674 5675 $post_args = $slice(arguments); 5676 args = $post_args; 5677 return self.message = (args.length > 0) ? args[0] : nil; }, -1); 5678 5679 // Convert backtrace from any format to Ruby format 5680 function correct_backtrace(backtrace) { 5681 var new_bt = [], m; 5682 5683 for (var i = 0; i < backtrace.length; i++) { 5684 var loc = backtrace[i]; 5685 if (!loc || !loc.$$is_string) ; 5686 /* Chromium format */ 5687 else if ((m = loc.match(/^ at (.*?) \((.*?)\)$/))) { 5688 new_bt.push(m[2] + ":in `" + m[1] + "'"); 5689 } 5690 else if ((m = loc.match(/^ at (.*?)$/))) { 5691 new_bt.push(m[1] + ":in `undefined'"); 5692 } 5693 /* Node format */ 5694 else if ((m = loc.match(/^ from (.*?)$/))) { 5695 new_bt.push(m[1]); 5696 } 5697 /* Mozilla/Apple format */ 5698 else if ((m = loc.match(/^(.*?)@(.*?)$/))) { 5699 new_bt.push(m[2] + ':in `' + m[1] + "'"); 5700 } 5701 } 5702 5703 return new_bt; 5704 } 5705 5706 $def(self, '$backtrace', function $$backtrace() { 5707 var self = this; 5708 5709 5710 if (self.backtrace) { 5711 // nil is a valid backtrace 5712 return self.backtrace; 5713 } 5714 5715 var backtrace = self.stack; 5716 5717 if (typeof(backtrace) !== 'undefined' && backtrace.$$is_string) { 5718 return self.backtrace = correct_backtrace(backtrace.split("\n")); 5719 } 5720 else if (backtrace) { 5721 return self.backtrace = correct_backtrace(backtrace); 5722 } 5723 5724 return []; 5725 5726 }); 5727 5728 $def(self, '$backtrace_locations', function $$backtrace_locations() { 5729 var $a, self = this; 5730 5731 5732 if (self.backtrace_locations) return self.backtrace_locations; 5733 self.backtrace_locations = ($a = self.$backtrace(), ($a === nil || $a == null) ? nil : $send($a, 'map', [], function $$2(loc){ 5734 5735 if (loc == null) loc = nil; 5736 return $$$($$$($$$('Thread'), 'Backtrace'), 'Location').$new(loc);})); 5737 return self.backtrace_locations; 5738 5739 }); 5740 5741 $def(self, '$cause', function $$cause() { 5742 var self = this; 5743 5744 return self.cause || nil; 5745 }); 5746 5747 $def(self, '$exception', function $$exception(str) { 5748 var self = this; 5749 5750 5751 if (str == null) str = nil; 5752 5753 if (str === nil || self === str) { 5754 return self; 5755 } 5756 5757 var cloned = self.$clone(); 5758 cloned.message = str; 5759 if (self.backtrace) cloned.backtrace = self.backtrace.$dup(); 5760 cloned.stack = self.stack; 5761 cloned.cause = self.cause; 5762 return cloned; 5763 }, -1); 5764 5765 $def(self, '$message', function $$message() { 5766 var self = this; 5767 5768 return self.$to_s() 5769 }); 5770 5771 $def(self, '$full_message', function $$full_message(kwargs) { 5772 var $b, self = this, $ret_or_1 = nil, highlight = nil, order = nil, bold_underline = nil, bold = nil, reset = nil, bt = nil, first = nil, msg = nil; 5773 if ($gvars.stderr == null) $gvars.stderr = nil; 5774 5775 5776 if (kwargs == null) kwargs = nil; 5777 if (!$truthy((($$('Hash', 'skip_raise')) ? 'constant' : nil))) { 5778 return "" + (self.message) + "\n" + (self.stack) 5779 } kwargs = $hash2(["highlight", "order"], {"highlight": $gvars.stderr['$tty?'](), "order": "top"}).$merge(($truthy(($ret_or_1 = kwargs)) ? ($ret_or_1) : ($hash2([], {})))); 5780 $b = [kwargs['$[]']("highlight"), kwargs['$[]']("order")], (highlight = $b[0]), (order = $b[1]); 5781 if (!$truthy([true, false]['$include?'](highlight))) { 5782 $Kernel.$raise($$$('ArgumentError'), "expected true or false as highlight: " + (highlight)); 5783 } if (!$truthy(["top", "bottom"]['$include?'](order))) { 5784 $Kernel.$raise($$$('ArgumentError'), "expected :top or :bottom as order: " + (order)); 5785 } if ($truthy(highlight)) { 5786 5787 bold_underline = "\u001b[1;4m"; 5788 bold = "\u001b[1m"; 5789 reset = "\u001b[m"; 5790 } else { 5791 bold_underline = (bold = (reset = "")); 5792 } bt = self.$backtrace().$dup(); 5793 if (($not(bt) || ($truthy(bt['$empty?']())))) { 5794 bt = self.$caller(); 5795 } first = bt.$shift(); 5796 msg = "" + (first) + ": "; 5797 msg = $rb_plus(msg, "" + (bold) + (self.$to_s()) + " (" + (bold_underline) + (self.$class()) + (reset) + (bold) + ")" + (reset) + "\n"); 5798 msg = $rb_plus(msg, $send(bt, 'map', [], function $$3(loc){ 5799 5800 if (loc == null) loc = nil; 5801 return "\tfrom " + (loc) + "\n";}).$join()); 5802 if ($truthy(self.$cause())) { 5803 msg = $rb_plus(msg, self.$cause().$full_message($hash2(["highlight"], {"highlight": highlight}))); 5804 } if ($eqeq(order, "bottom")) { 5805 5806 msg = msg.$split("\n").$reverse().$join("\n"); 5807 msg = $rb_plus("" + (bold) + "Traceback" + (reset) + " (most recent call last):\n", msg); 5808 } return msg; 5809 }, -1); 5810 5811 $def(self, '$inspect', function $$inspect() { 5812 var self = this, as_str = nil; 5813 5814 5815 as_str = self.$to_s(); 5816 if ($truthy(as_str['$empty?']())) { 5817 return self.$class().$to_s() 5818 } else { 5819 return "#<" + (self.$class().$to_s()) + ": " + (self.$to_s()) + ">" 5820 } }); 5821 5822 $def(self, '$set_backtrace', function $$set_backtrace(backtrace) { 5823 var self = this; 5824 5825 5826 var valid = true, i, ii; 5827 5828 if (backtrace === nil) { 5829 self.backtrace = nil; 5830 self.stack = ''; 5831 } else if (backtrace.$$is_string) { 5832 self.backtrace = [backtrace]; 5833 self.stack = ' from ' + backtrace; 5834 } else { 5835 if (backtrace.$$is_array) { 5836 for (i = 0, ii = backtrace.length; i < ii; i++) { 5837 if (!backtrace[i].$$is_string) { 5838 valid = false; 5839 break; 5840 } 5841 } 5842 } else { 5843 valid = false; 5844 } 5845 5846 if (valid === false) { 5847 $Kernel.$raise($$$('TypeError'), "backtrace must be Array of String"); 5848 } 5849 5850 self.backtrace = backtrace; 5851 self.stack = $send((backtrace), 'map', [], function $$4(i){ 5852 5853 if (i == null) i = nil; 5854 return $rb_plus(" from ", i);}).join("\n"); 5855 } 5856 5857 return backtrace; 5858 5859 }); 5860 return $def(self, '$to_s', function $$to_s() { 5861 var self = this, $ret_or_1 = nil, $ret_or_2 = nil; 5862 5863 if ($truthy(($ret_or_1 = ($truthy(($ret_or_2 = self.message)) ? (self.message.$to_s()) : ($ret_or_2))))) { 5864 return $ret_or_1 5865 } else { 5866 return self.$class().$to_s() 5867 } 5868 }); 5869 })('::', Error, $nesting); 5870 $klass('::', $$$('Exception'), 'ScriptError'); 5871 $klass('::', $$$('ScriptError'), 'SyntaxError'); 5872 $klass('::', $$$('ScriptError'), 'LoadError'); 5873 $klass('::', $$$('ScriptError'), 'NotImplementedError'); 5874 $klass('::', $$$('Exception'), 'SystemExit'); 5875 $klass('::', $$$('Exception'), 'NoMemoryError'); 5876 $klass('::', $$$('Exception'), 'SignalException'); 5877 $klass('::', $$$('SignalException'), 'Interrupt'); 5878 $klass('::', $$$('Exception'), 'SecurityError'); 5879 $klass('::', $$$('Exception'), 'SystemStackError'); 5880 $klass('::', $$$('Exception'), 'StandardError'); 5881 $klass('::', $$$('StandardError'), 'EncodingError'); 5882 $klass('::', $$$('StandardError'), 'ZeroDivisionError'); 5883 $klass('::', $$$('StandardError'), 'NameError'); 5884 $klass('::', $$$('NameError'), 'NoMethodError'); 5885 $klass('::', $$$('StandardError'), 'RuntimeError'); 5886 $klass('::', $$$('RuntimeError'), 'FrozenError'); 5887 $klass('::', $$$('StandardError'), 'LocalJumpError'); 5888 $klass('::', $$$('StandardError'), 'TypeError'); 5889 $klass('::', $$$('StandardError'), 'ArgumentError'); 5890 $klass('::', $$$('ArgumentError'), 'UncaughtThrowError'); 5891 $klass('::', $$$('StandardError'), 'IndexError'); 5892 $klass('::', $$$('IndexError'), 'StopIteration'); 5893 $klass('::', $$$('StopIteration'), 'ClosedQueueError'); 5894 $klass('::', $$$('IndexError'), 'KeyError'); 5895 $klass('::', $$$('StandardError'), 'RangeError'); 5896 $klass('::', $$$('RangeError'), 'FloatDomainError'); 5897 $klass('::', $$$('StandardError'), 'IOError'); 5898 $klass('::', $$$('IOError'), 'EOFError'); 5899 $klass('::', $$$('StandardError'), 'SystemCallError'); 5900 $klass('::', $$$('StandardError'), 'RegexpError'); 5901 $klass('::', $$$('StandardError'), 'ThreadError'); 5902 $klass('::', $$$('StandardError'), 'FiberError'); 5903 $Object.$autoload("Errno", "corelib/error/errno"); 5904 (function($base, $super) { 5905 var self = $klass($base, $super, 'FrozenError'); 5906 5907 5908 5909 self.$attr_reader("receiver"); 5910 return $def(self, '$initialize', function $$initialize(message, $kwargs) { 5911 var receiver, self = this; 5912 5913 $$initialize.$$p = null; 5914 5915 $kwargs = $ensure_kwargs($kwargs); 5916 5917 receiver = $kwargs.$$smap["receiver"];if (receiver == null) receiver = nil; 5918 $send2(self, $find_super(self, 'initialize', $$initialize, false, true), 'initialize', [message], null); 5919 return (self.receiver = receiver); 5920 }, -2); 5921 })('::', $$$('RuntimeError')); 5922 (function($base, $super) { 5923 var self = $klass($base, $super, 'UncaughtThrowError'); 5924 5925 var $proto = self.$$prototype; 5926 5927 $proto.tag = nil; 5928 5929 self.$attr_reader("tag", "value"); 5930 return $def(self, '$initialize', function $$initialize(tag, value) { 5931 var self = this; 5932 5933 $$initialize.$$p = null; 5934 5935 if (value == null) value = nil; 5936 self.tag = tag; 5937 self.value = value; 5938 return $send2(self, $find_super(self, 'initialize', $$initialize, false, true), 'initialize', ["uncaught throw " + (self.tag.$inspect())], null); 5939 }, -2); 5940 })('::', $$$('ArgumentError')); 5941 (function($base, $super) { 5942 var self = $klass($base, $super, 'NameError'); 5943 5944 5945 5946 self.$attr_reader("name"); 5947 return $def(self, '$initialize', function $$initialize(message, name) { 5948 var self = this; 5949 5950 $$initialize.$$p = null; 5951 5952 if (name == null) name = nil; 5953 $send2(self, $find_super(self, 'initialize', $$initialize, false, true), 'initialize', [message], null); 5954 return (self.name = name); 5955 }, -2); 5956 })('::', null); 5957 (function($base, $super) { 5958 var self = $klass($base, $super, 'NoMethodError'); 5959 5960 5961 5962 self.$attr_reader("args"); 5963 return $def(self, '$initialize', function $$initialize(message, name, args) { 5964 var self = this; 5965 5966 $$initialize.$$p = null; 5967 5968 if (name == null) name = nil; 5969 if (args == null) args = []; 5970 $send2(self, $find_super(self, 'initialize', $$initialize, false, true), 'initialize', [message, name], null); 5971 return (self.args = args); 5972 }, -2); 5973 })('::', null); 5974 (function($base, $super) { 5975 var self = $klass($base, $super, 'StopIteration'); 5976 5977 5978 return self.$attr_reader("result") 5979 })('::', null); 5980 (function($base, $super) { 5981 var self = $klass($base, $super, 'KeyError'); 5982 5983 var $proto = self.$$prototype; 5984 5985 $proto.receiver = $proto.key = nil; 5986 5987 5988 $def(self, '$initialize', function $$initialize(message, $kwargs) { 5989 var receiver, key, self = this; 5990 5991 $$initialize.$$p = null; 5992 5993 $kwargs = $ensure_kwargs($kwargs); 5994 5995 receiver = $kwargs.$$smap["receiver"];if (receiver == null) receiver = nil; 5996 5997 key = $kwargs.$$smap["key"];if (key == null) key = nil; 5998 $send2(self, $find_super(self, 'initialize', $$initialize, false, true), 'initialize', [message], null); 5999 self.receiver = receiver; 6000 return (self.key = key); 6001 }, -2); 6002 6003 $def(self, '$receiver', function $$receiver() { 6004 var self = this, $ret_or_1 = nil; 6005 6006 if ($truthy(($ret_or_1 = self.receiver))) { 6007 return $ret_or_1 6008 } else { 6009 return $Kernel.$raise($$$('ArgumentError'), "no receiver is available") 6010 } 6011 }); 6012 return $def(self, '$key', function $$key() { 6013 var self = this, $ret_or_1 = nil; 6014 6015 if ($truthy(($ret_or_1 = self.key))) { 6016 return $ret_or_1 6017 } else { 6018 return $Kernel.$raise($$$('ArgumentError'), "no key is available") 6019 } 6020 }); 6021 })('::', null); 6022 return (function($base, $parent_nesting) { 6023 var self = $module($base, 'JS'); 6024 6025 var $nesting = [self].concat($parent_nesting); 6026 6027 return ($klass($nesting[0], null, 'Error'), nil) 6028 })('::', $nesting); 6029}; 6030 6031Opal.modules["corelib/constants"] = function(Opal) {/* Generated by Opal 1.7.3 */ 6032 var $const_set = Opal.const_set; Opal.nil; var $$$ = Opal.$$$; 6033 6034 6035 $const_set('::', 'RUBY_PLATFORM', "opal"); 6036 $const_set('::', 'RUBY_ENGINE', "opal"); 6037 $const_set('::', 'RUBY_VERSION', "3.2.0"); 6038 $const_set('::', 'RUBY_ENGINE_VERSION', "1.7.3"); 6039 $const_set('::', 'RUBY_RELEASE_DATE', "2023-03-23"); 6040 $const_set('::', 'RUBY_PATCHLEVEL', 0); 6041 $const_set('::', 'RUBY_REVISION', "0"); 6042 $const_set('::', 'RUBY_COPYRIGHT', "opal - Copyright (C) 2011-2023 Adam Beynon and the Opal contributors"); 6043 return $const_set('::', 'RUBY_DESCRIPTION', "opal " + ($$$('RUBY_ENGINE_VERSION')) + " (" + ($$$('RUBY_RELEASE_DATE')) + " revision " + ($$$('RUBY_REVISION')) + ")"); 6044}; 6045 6046Opal.modules["opal/base"] = function(Opal) {/* Generated by Opal 1.7.3 */ 6047 var $Object = Opal.Object; Opal.nil; 6048 6049 Opal.add_stubs('require'); 6050 6051 $Object.$require("corelib/runtime"); 6052 $Object.$require("corelib/helpers"); 6053 $Object.$require("corelib/module"); 6054 $Object.$require("corelib/class"); 6055 $Object.$require("corelib/basic_object"); 6056 $Object.$require("corelib/kernel"); 6057 $Object.$require("corelib/main"); 6058 $Object.$require("corelib/error"); 6059 return $Object.$require("corelib/constants"); 6060}; 6061 6062Opal.modules["corelib/nil"] = function(Opal) {/* Generated by Opal 1.7.3 */ 6063 var $klass = Opal.klass, $Kernel = Opal.Kernel, $def = Opal.def, $return_val = Opal.return_val, $ensure_kwargs = Opal.ensure_kwargs, $NilClass = Opal.NilClass, $slice = Opal.slice, $truthy = Opal.truthy, $rb_gt = Opal.rb_gt, $alias = Opal.alias, nil = Opal.nil, $$$ = Opal.$$$; 6064 6065 Opal.add_stubs('raise,name,new,>,length,Rational,to_i'); 6066 return (function($base, $super, $parent_nesting) { 6067 var self = $klass($base, $super, 'NilClass'); 6068 6069 6070 self.$$prototype.$$meta = self; 6071 (function(self, $parent_nesting) { 6072 6073 6074 6075 $def(self, '$allocate', function $$allocate() { 6076 var self = this; 6077 6078 return $Kernel.$raise($$$('TypeError'), "allocator undefined for " + (self.$name())) 6079 }); 6080 6081 6082 Opal.udef(self, '$' + "new"); return nil; })(Opal.get_singleton_class(self)); 6083 6084 $def(self, '$!', $return_val(true)); 6085 6086 $def(self, '$&', $return_val(false)); 6087 6088 $def(self, '$|', function $NilClass_$$1(other) { 6089 6090 return other !== false && other !== nil; 6091 }); 6092 6093 $def(self, '$^', function $NilClass_$$2(other) { 6094 6095 return other !== false && other !== nil; 6096 }); 6097 6098 $def(self, '$==', function $NilClass_$eq_eq$3(other) { 6099 6100 return other === nil; 6101 }); 6102 6103 $def(self, '$dup', $return_val(nil)); 6104 6105 $def(self, '$clone', function $$clone($kwargs) { 6106 6107 6108 $kwargs = $ensure_kwargs($kwargs); 6109 6110 $kwargs.$$smap["freeze"]; return nil; 6111 }, -1); 6112 6113 $def(self, '$inspect', $return_val("nil")); 6114 6115 $def(self, '$nil?', $return_val(true)); 6116 6117 $def(self, '$singleton_class', function $$singleton_class() { 6118 6119 return $NilClass 6120 }); 6121 6122 $def(self, '$to_a', function $$to_a() { 6123 6124 return [] 6125 }); 6126 6127 $def(self, '$to_h', function $$to_h() { 6128 6129 return Opal.hash(); 6130 }); 6131 6132 $def(self, '$to_i', $return_val(0)); 6133 6134 $def(self, '$to_s', $return_val("")); 6135 6136 $def(self, '$to_c', function $$to_c() { 6137 6138 return $$$('Complex').$new(0, 0) 6139 }); 6140 6141 $def(self, '$rationalize', function $$rationalize($a) { 6142 var $post_args, args; 6143 6144 6145 $post_args = $slice(arguments); 6146 args = $post_args; 6147 if ($truthy($rb_gt(args.$length(), 1))) { 6148 $Kernel.$raise($$$('ArgumentError')); 6149 } return $Kernel.$Rational(0, 1); 6150 }, -1); 6151 6152 $def(self, '$to_r', function $$to_r() { 6153 6154 return $Kernel.$Rational(0, 1) 6155 }); 6156 6157 $def(self, '$instance_variables', function $$instance_variables() { 6158 6159 return [] 6160 }); 6161 return $alias(self, "to_f", "to_i"); 6162 })('::', null) 6163}; 6164 6165Opal.modules["corelib/boolean"] = function(Opal) {/* Generated by Opal 1.7.3 */ 6166 var $klass = Opal.klass, $Kernel = Opal.Kernel, $def = Opal.def, $return_self = Opal.return_self, $ensure_kwargs = Opal.ensure_kwargs, $slice = Opal.slice, $truthy = Opal.truthy, $send2 = Opal.send2, $find_super = Opal.find_super, $to_a = Opal.to_a, $alias = Opal.alias, nil = Opal.nil, $$$ = Opal.$$$; 6167 6168 Opal.add_stubs('raise,name,==,to_s,__id__'); 6169 6170 (function($base, $super, $parent_nesting) { 6171 var self = $klass($base, $super, 'Boolean'); 6172 6173 6174 Opal.prop(self.$$prototype, '$$is_boolean', true); 6175 6176 var properties = ['$$class', '$$meta']; 6177 6178 for (var i = 0; i < properties.length; i++) { 6179 Object.defineProperty(self.$$prototype, properties[i], { 6180 configurable: true, 6181 enumerable: false, 6182 get: function() { 6183 return this == true ? Opal.TrueClass : 6184 this == false ? Opal.FalseClass : 6185 Opal.Boolean; 6186 } 6187 }); 6188 } 6189 6190 Object.defineProperty(self.$$prototype, "$$id", { 6191 configurable: true, 6192 enumerable: false, 6193 get: function() { 6194 return this == true ? 2 : 6195 this == false ? 0 : 6196 nil; 6197 } 6198 }); 6199 (function(self, $parent_nesting) { 6200 6201 6202 6203 $def(self, '$allocate', function $$allocate() { 6204 var self = this; 6205 6206 return $Kernel.$raise($$$('TypeError'), "allocator undefined for " + (self.$name())) 6207 }); 6208 6209 6210 Opal.udef(self, '$' + "new"); return nil; })(Opal.get_singleton_class(self)); 6211 6212 $def(self, '$__id__', function $$__id__() { 6213 var self = this; 6214 6215 return self.valueOf() ? 2 : 0; 6216 }); 6217 6218 $def(self, '$!', function $Boolean_$excl$1() { 6219 var self = this; 6220 6221 return self != true; 6222 }); 6223 6224 $def(self, '$&', function $Boolean_$$2(other) { 6225 var self = this; 6226 6227 return (self == true) ? (other !== false && other !== nil) : false; 6228 }); 6229 6230 $def(self, '$|', function $Boolean_$$3(other) { 6231 var self = this; 6232 6233 return (self == true) ? true : (other !== false && other !== nil); 6234 }); 6235 6236 $def(self, '$^', function $Boolean_$$4(other) { 6237 var self = this; 6238 6239 return (self == true) ? (other === false || other === nil) : (other !== false && other !== nil); 6240 }); 6241 6242 $def(self, '$==', function $Boolean_$eq_eq$5(other) { 6243 var self = this; 6244 6245 return (self == true) === other.valueOf(); 6246 }); 6247 6248 $def(self, '$singleton_class', function $$singleton_class() { 6249 var self = this; 6250 6251 return self.$$meta; 6252 }); 6253 6254 $def(self, '$to_s', function $$to_s() { 6255 var self = this; 6256 6257 return (self == true) ? 'true' : 'false'; 6258 }); 6259 6260 $def(self, '$dup', $return_self); 6261 6262 $def(self, '$clone', function $$clone($kwargs) { 6263 var self = this; 6264 6265 6266 $kwargs = $ensure_kwargs($kwargs); 6267 6268 $kwargs.$$smap["freeze"]; return self; 6269 }, -1); 6270 6271 $def(self, '$method_missing', function $$method_missing(method, $a) { 6272 var block = $$method_missing.$$p || nil, $post_args, args, self = this; 6273 6274 $$method_missing.$$p = null; 6275 $post_args = $slice(arguments, 1); 6276 args = $post_args; 6277 var body = self.$$class.$$prototype[Opal.jsid(method)]; 6278 if (!$truthy(typeof body !== 'undefined' && !body.$$stub)) { 6279 $send2(self, $find_super(self, 'method_missing', $$method_missing, false, true), 'method_missing', [method].concat($to_a(args)), block); 6280 } return Opal.send(self, body, args, block); 6281 }, -2); 6282 6283 $def(self, '$respond_to_missing?', function $Boolean_respond_to_missing$ques$6(method, _include_all) { 6284 var self = this; 6285 var body = self.$$class.$$prototype[Opal.jsid(method)]; 6286 return typeof body !== 'undefined' && !body.$$stub; }, -2); 6287 $alias(self, "eql?", "=="); 6288 $alias(self, "equal?", "=="); 6289 $alias(self, "inspect", "to_s"); 6290 return $alias(self, "object_id", "__id__"); 6291 })('::', Boolean); 6292 $klass('::', $$$('Boolean'), 'TrueClass'); 6293 return ($klass('::', $$$('Boolean'), 'FalseClass'), nil); 6294}; 6295 6296Opal.modules["corelib/comparable"] = function(Opal) {/* Generated by Opal 1.7.3 */ 6297 var $truthy = Opal.truthy, $module = Opal.module, $rb_gt = Opal.rb_gt, $rb_lt = Opal.rb_lt, $eqeqeq = Opal.eqeqeq, $Kernel = Opal.Kernel, $def = Opal.def, nil = Opal.nil, $$$ = Opal.$$$; 6298 6299 Opal.add_stubs('>,<,===,raise,class,<=>,equal?'); 6300 return (function($base) { 6301 var self = $module($base, 'Comparable'); 6302 6303 var $ret_or_1 = nil; 6304 6305 6306 6307 function normalize(what) { 6308 if (Opal.is_a(what, Opal.Integer)) { return what; } 6309 6310 if ($rb_gt(what, 0)) { return 1; } 6311 if ($rb_lt(what, 0)) { return -1; } 6312 return 0; 6313 } 6314 6315 function fail_comparison(lhs, rhs) { 6316 var class_name; 6317 (($eqeqeq(nil, ($ret_or_1 = rhs)) || (($eqeqeq(true, $ret_or_1) || (($eqeqeq(false, $ret_or_1) || (($eqeqeq($$$('Integer'), $ret_or_1) || ($eqeqeq($$$('Float'), $ret_or_1))))))))) ? (class_name = rhs.$inspect()) : (class_name = rhs.$$class)); 6318 $Kernel.$raise($$$('ArgumentError'), "comparison of " + ((lhs).$class()) + " with " + (class_name) + " failed"); 6319 } 6320 6321 function cmp_or_fail(lhs, rhs) { 6322 var cmp = (lhs)['$<=>'](rhs); 6323 if (!$truthy(cmp)) fail_comparison(lhs, rhs); 6324 return normalize(cmp); 6325 } 6326 6327 $def(self, '$==', function $Comparable_$eq_eq$1(other) { 6328 var self = this, cmp = nil; 6329 6330 6331 if ($truthy(self['$equal?'](other))) { 6332 return true 6333 } 6334 if (self["$<=>"] == Opal.Kernel["$<=>"]) { 6335 return false; 6336 } 6337 6338 // check for infinite recursion 6339 if (self.$$comparable) { 6340 self.$$comparable = false; 6341 return false; 6342 } 6343 if (!$truthy((cmp = self['$<=>'](other)))) { 6344 return false 6345 } return normalize(cmp) == 0; }); 6346 6347 $def(self, '$>', function $Comparable_$gt$2(other) { 6348 var self = this; 6349 6350 return cmp_or_fail(self, other) > 0; 6351 }); 6352 6353 $def(self, '$>=', function $Comparable_$gt_eq$3(other) { 6354 var self = this; 6355 6356 return cmp_or_fail(self, other) >= 0; 6357 }); 6358 6359 $def(self, '$<', function $Comparable_$lt$4(other) { 6360 var self = this; 6361 6362 return cmp_or_fail(self, other) < 0; 6363 }); 6364 6365 $def(self, '$<=', function $Comparable_$lt_eq$5(other) { 6366 var self = this; 6367 6368 return cmp_or_fail(self, other) <= 0; 6369 }); 6370 6371 $def(self, '$between?', function $Comparable_between$ques$6(min, max) { 6372 var self = this; 6373 6374 6375 if ($rb_lt(self, min)) { 6376 return false 6377 } if ($rb_gt(self, max)) { 6378 return false 6379 } return true; 6380 }); 6381 return $def(self, '$clamp', function $$clamp(min, max) { 6382 var self = this; 6383 6384 6385 if (max == null) max = nil; 6386 6387 var c, excl; 6388 6389 if (max === nil) { 6390 // We are dealing with a new Ruby 2.7 behaviour that we are able to 6391 // provide a single Range argument instead of 2 Comparables. 6392 6393 if (!Opal.is_a(min, Opal.Range)) { 6394 $Kernel.$raise($$$('TypeError'), "wrong argument type " + (min.$class()) + " (expected Range)"); 6395 } 6396 6397 excl = min.excl; 6398 max = min.end; 6399 min = min.begin; 6400 6401 if (max !== nil && excl) { 6402 $Kernel.$raise($$$('ArgumentError'), "cannot clamp with an exclusive range"); 6403 } 6404 } 6405 6406 if (min !== nil && max !== nil && cmp_or_fail(min, max) > 0) { 6407 $Kernel.$raise($$$('ArgumentError'), "min argument must be smaller than max argument"); 6408 } 6409 6410 if (min !== nil) { 6411 c = cmp_or_fail(self, min); 6412 6413 if (c == 0) return self; 6414 if (c < 0) return min; 6415 } 6416 6417 if (max !== nil) { 6418 c = cmp_or_fail(self, max); 6419 6420 if (c > 0) return max; 6421 } 6422 6423 return self; 6424 }, -2); 6425 })('::') 6426}; 6427 6428Opal.modules["corelib/regexp"] = function(Opal) {/* Generated by Opal 1.7.3 */ 6429 var $coerce_to = Opal.coerce_to, $prop = Opal.prop, $freeze = Opal.freeze, $klass = Opal.klass, $const_set = Opal.const_set, $send2 = Opal.send2, $find_super = Opal.find_super, $def = Opal.def, $truthy = Opal.truthy, $gvars = Opal.gvars, $slice = Opal.slice, $Kernel = Opal.Kernel, $Opal = Opal.Opal, $alias = Opal.alias, $send = Opal.send, $hash2 = Opal.hash2, $rb_plus = Opal.rb_plus, $ensure_kwargs = Opal.ensure_kwargs, $rb_ge = Opal.rb_ge, $to_a = Opal.to_a, $eqeqeq = Opal.eqeqeq, $rb_minus = Opal.rb_minus, $return_ivar = Opal.return_ivar, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 6430 6431 Opal.add_stubs('nil?,[],raise,escape,options,to_str,new,join,coerce_to!,!,match,coerce_to?,begin,frozen?,uniq,map,scan,source,to_proc,transform_values,group_by,each_with_index,+,last,=~,==,attr_reader,>=,length,is_a?,include?,names,regexp,named_captures,===,captures,-,inspect,empty?,each,to_a'); 6432 6433 $klass('::', $$$('StandardError'), 'RegexpError'); 6434 (function($base, $super, $parent_nesting) { 6435 var self = $klass($base, $super, 'Regexp'); 6436 6437 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 6438 6439 6440 $const_set(self, 'IGNORECASE', 1); 6441 $const_set(self, 'EXTENDED', 2); 6442 $const_set(self, 'MULTILINE', 4); 6443 Opal.prop(self.$$prototype, '$$is_regexp', true); 6444 (function(self, $parent_nesting) { 6445 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 6446 6447 6448 6449 $def(self, '$allocate', function $$allocate() { 6450 var $yield = $$allocate.$$p || nil, self = this, allocated = nil; 6451 6452 $$allocate.$$p = null; 6453 6454 allocated = $send2(self, $find_super(self, 'allocate', $$allocate, false, true), 'allocate', [], $yield); 6455 allocated.uninitialized = true; 6456 return allocated; 6457 }); 6458 6459 $def(self, '$escape', function $$escape(string) { 6460 6461 return Opal.escape_regexp(string); 6462 }); 6463 6464 $def(self, '$last_match', function $$last_match(n) { 6465 if ($gvars["~"] == null) $gvars["~"] = nil; 6466 6467 6468 if (n == null) n = nil; 6469 if ($truthy(n['$nil?']())) { 6470 return $gvars["~"] 6471 } else if ($truthy($gvars["~"])) { 6472 return $gvars["~"]['$[]'](n) 6473 } else { 6474 return nil 6475 } }, -1); 6476 6477 $def(self, '$union', function $$union($a) { 6478 var $post_args, parts, self = this; 6479 6480 6481 $post_args = $slice(arguments); 6482 parts = $post_args; 6483 6484 var is_first_part_array, quoted_validated, part, options, each_part_options; 6485 if (parts.length == 0) { 6486 return /(?!)/; 6487 } 6488 // return fast if there's only one element 6489 if (parts.length == 1 && parts[0].$$is_regexp) { 6490 return parts[0]; 6491 } 6492 // cover the 2 arrays passed as arguments case 6493 is_first_part_array = parts[0].$$is_array; 6494 if (parts.length > 1 && is_first_part_array) { 6495 $Kernel.$raise($$$('TypeError'), "no implicit conversion of Array into String"); 6496 } 6497 // deal with splat issues (related to https://github.com/opal/opal/issues/858) 6498 if (is_first_part_array) { 6499 parts = parts[0]; 6500 } 6501 options = undefined; 6502 quoted_validated = []; 6503 for (var i=0; i < parts.length; i++) { 6504 part = parts[i]; 6505 if (part.$$is_string) { 6506 quoted_validated.push(self.$escape(part)); 6507 } 6508 else if (part.$$is_regexp) { 6509 each_part_options = (part).$options(); 6510 if (options != undefined && options != each_part_options) { 6511 $Kernel.$raise($$$('TypeError'), "All expressions must use the same options"); 6512 } 6513 options = each_part_options; 6514 quoted_validated.push('('+part.source+')'); 6515 } 6516 else { 6517 quoted_validated.push(self.$escape((part).$to_str())); 6518 } 6519 } 6520 return self.$new((quoted_validated).$join("|"), options); 6521 }, -1); 6522 6523 $def(self, '$new', function $new$1(regexp, options) { 6524 6525 if (regexp.$$is_regexp) { 6526 return new RegExp(regexp); 6527 } 6528 6529 regexp = $Opal['$coerce_to!'](regexp, $$$('String'), "to_str"); 6530 6531 if (regexp.charAt(regexp.length - 1) === '\\' && regexp.charAt(regexp.length - 2) !== '\\') { 6532 $Kernel.$raise($$$('RegexpError'), "too short escape sequence: /" + (regexp) + "/"); 6533 } 6534 6535 regexp = regexp.replace('\\A', '^').replace('\\z', '$'); 6536 6537 if (options === undefined || options['$!']()) { 6538 return new RegExp(regexp); 6539 } 6540 6541 if (options.$$is_number) { 6542 var temp = ''; 6543 if ($$('IGNORECASE') & options) { temp += 'i'; } 6544 if ($$('MULTILINE') & options) { temp += 'm'; } 6545 options = temp; 6546 } 6547 else { 6548 options = 'i'; 6549 } 6550 6551 return new RegExp(regexp, options); 6552 }, -2); 6553 $alias(self, "compile", "new"); 6554 return $alias(self, "quote", "escape"); 6555 })(Opal.get_singleton_class(self), $nesting); 6556 6557 $def(self, '$==', function $Regexp_$eq_eq$2(other) { 6558 var self = this; 6559 6560 return other instanceof RegExp && self.toString() === other.toString(); 6561 }); 6562 6563 $def(self, '$===', function $Regexp_$eq_eq_eq$3(string) { 6564 var self = this; 6565 6566 return self.$match($Opal['$coerce_to?'](string, $$$('String'), "to_str")) !== nil 6567 }); 6568 6569 $def(self, '$=~', function $Regexp_$eq_tilde$4(string) { 6570 var self = this, $ret_or_1 = nil; 6571 if ($gvars["~"] == null) $gvars["~"] = nil; 6572 6573 if ($truthy(($ret_or_1 = self.$match(string)))) { 6574 return $gvars["~"].$begin(0) 6575 } else { 6576 return $ret_or_1 6577 } 6578 }); 6579 6580 $def(self, '$freeze', function $$freeze() { 6581 var self = this; 6582 6583 6584 if ($truthy(self['$frozen?']())) { 6585 return self 6586 } 6587 if (!self.hasOwnProperty('$$g')) { $prop(self, '$$g', null); } 6588 if (!self.hasOwnProperty('$$gm')) { $prop(self, '$$gm', null); } 6589 6590 return $freeze(self); 6591 }); 6592 6593 $def(self, '$inspect', function $$inspect() { 6594 var self = this; 6595 6596 6597 var regexp_format = /^\/(.*)\/([^\/]*)$/; 6598 var value = self.toString(); 6599 var matches = regexp_format.exec(value); 6600 if (matches) { 6601 var regexp_pattern = matches[1]; 6602 var regexp_flags = matches[2]; 6603 var chars = regexp_pattern.split(''); 6604 var chars_length = chars.length; 6605 var char_escaped = false; 6606 var regexp_pattern_escaped = ''; 6607 for (var i = 0; i < chars_length; i++) { 6608 var current_char = chars[i]; 6609 if (!char_escaped && current_char == '/') { 6610 regexp_pattern_escaped = regexp_pattern_escaped.concat('\\'); 6611 } 6612 regexp_pattern_escaped = regexp_pattern_escaped.concat(current_char); 6613 if (current_char == '\\') { 6614 if (char_escaped) { 6615 // does not over escape 6616 char_escaped = false; 6617 } else { 6618 char_escaped = true; 6619 } 6620 } else { 6621 char_escaped = false; 6622 } 6623 } 6624 return '/' + regexp_pattern_escaped + '/' + regexp_flags; 6625 } else { 6626 return value; 6627 } 6628 6629 }); 6630 6631 $def(self, '$match', function $$match(string, pos) { 6632 var block = $$match.$$p || nil, self = this; 6633 if ($gvars["~"] == null) $gvars["~"] = nil; 6634 6635 $$match.$$p = null; 6636 6637 if (self.uninitialized) { 6638 $Kernel.$raise($$$('TypeError'), "uninitialized Regexp"); 6639 } 6640 6641 if (pos === undefined) { 6642 if (string === nil) return ($gvars["~"] = nil); 6643 var m = self.exec($coerce_to(string, $$$('String'), 'to_str')); 6644 if (m) { 6645 ($gvars["~"] = $$$('MatchData').$new(self, m)); 6646 return block === nil ? $gvars["~"] : Opal.yield1(block, $gvars["~"]); 6647 } else { 6648 return ($gvars["~"] = nil); 6649 } 6650 } 6651 6652 pos = $coerce_to(pos, $$$('Integer'), 'to_int'); 6653 6654 if (string === nil) { 6655 return ($gvars["~"] = nil); 6656 } 6657 6658 string = $coerce_to(string, $$$('String'), 'to_str'); 6659 6660 if (pos < 0) { 6661 pos += string.length; 6662 if (pos < 0) { 6663 return ($gvars["~"] = nil); 6664 } 6665 } 6666 6667 // global RegExp maintains state, so not using self/this 6668 var md, re = Opal.global_regexp(self); 6669 6670 while (true) { 6671 md = re.exec(string); 6672 if (md === null) { 6673 return ($gvars["~"] = nil); 6674 } 6675 if (md.index >= pos) { 6676 ($gvars["~"] = $$$('MatchData').$new(re, md)); 6677 return block === nil ? $gvars["~"] : Opal.yield1(block, $gvars["~"]); 6678 } 6679 re.lastIndex = md.index + 1; 6680 } 6681 }, -2); 6682 6683 $def(self, '$match?', function $Regexp_match$ques$5(string, pos) { 6684 var self = this; 6685 6686 if (self.uninitialized) { 6687 $Kernel.$raise($$$('TypeError'), "uninitialized Regexp"); 6688 } 6689 6690 if (pos === undefined) { 6691 return string === nil ? false : self.test($coerce_to(string, $$$('String'), 'to_str')); 6692 } 6693 6694 pos = $coerce_to(pos, $$$('Integer'), 'to_int'); 6695 6696 if (string === nil) { 6697 return false; 6698 } 6699 6700 string = $coerce_to(string, $$$('String'), 'to_str'); 6701 6702 if (pos < 0) { 6703 pos += string.length; 6704 if (pos < 0) { 6705 return false; 6706 } 6707 } 6708 6709 // global RegExp maintains state, so not using self/this 6710 var md, re = Opal.global_regexp(self); 6711 6712 md = re.exec(string); 6713 if (md === null || md.index < pos) { 6714 return false; 6715 } else { 6716 return true; 6717 } 6718 }, -2); 6719 6720 $def(self, '$names', function $$names() { 6721 var self = this; 6722 6723 return $send(self.$source().$scan(/\(?<(\w+)>/, $hash2(["no_matchdata"], {"no_matchdata": true})), 'map', [], "first".$to_proc()).$uniq() 6724 }); 6725 6726 $def(self, '$named_captures', function $$named_captures() { 6727 var self = this; 6728 6729 return $send($send($send(self.$source().$scan(/\(?<(\w+)>/, $hash2(["no_matchdata"], {"no_matchdata": true})), 'map', [], "first".$to_proc()).$each_with_index(), 'group_by', [], "first".$to_proc()), 'transform_values', [], function $$6(i){ 6730 6731 if (i == null) i = nil; 6732 return $send(i, 'map', [], function $$7(j){ 6733 6734 if (j == null) j = nil; 6735 return $rb_plus(j.$last(), 1);});}) 6736 }); 6737 6738 $def(self, '$~', function $Regexp_$$8() { 6739 var self = this; 6740 if ($gvars._ == null) $gvars._ = nil; 6741 6742 return self['$=~']($gvars._) 6743 }); 6744 6745 $def(self, '$source', function $$source() { 6746 var self = this; 6747 6748 return self.source; 6749 }); 6750 6751 $def(self, '$options', function $$options() { 6752 var self = this; 6753 6754 6755 if (self.uninitialized) { 6756 $Kernel.$raise($$$('TypeError'), "uninitialized Regexp"); 6757 } 6758 var result = 0; 6759 // should be supported in IE6 according to https://msdn.microsoft.com/en-us/library/7f5z26w4(v=vs.94).aspx 6760 if (self.multiline) { 6761 result |= $$('MULTILINE'); 6762 } 6763 if (self.ignoreCase) { 6764 result |= $$('IGNORECASE'); 6765 } 6766 return result; 6767 6768 }); 6769 6770 $def(self, '$casefold?', function $Regexp_casefold$ques$9() { 6771 var self = this; 6772 6773 return self.ignoreCase; 6774 }); 6775 $alias(self, "eql?", "=="); 6776 return $alias(self, "to_s", "source"); 6777 })('::', RegExp, $nesting); 6778 return (function($base, $super, $parent_nesting) { 6779 var self = $klass($base, $super, 'MatchData'); 6780 6781 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype; 6782 6783 $proto.matches = nil; 6784 6785 self.$attr_reader("post_match", "pre_match", "regexp", "string"); 6786 6787 $def(self, '$initialize', function $$initialize(regexp, match_groups, $kwargs) { 6788 var no_matchdata, self = this; 6789 6790 6791 $kwargs = $ensure_kwargs($kwargs); 6792 6793 no_matchdata = $kwargs.$$smap["no_matchdata"];if (no_matchdata == null) no_matchdata = false; 6794 if (!$truthy(no_matchdata)) { 6795 $gvars["~"] = self; 6796 } self.regexp = regexp; 6797 self.begin = match_groups.index; 6798 self.string = match_groups.input; 6799 self.pre_match = match_groups.input.slice(0, match_groups.index); 6800 self.post_match = match_groups.input.slice(match_groups.index + match_groups[0].length); 6801 self.matches = []; 6802 6803 for (var i = 0, length = match_groups.length; i < length; i++) { 6804 var group = match_groups[i]; 6805 6806 if (group == null) { 6807 self.matches.push(nil); 6808 } 6809 else { 6810 self.matches.push(group); 6811 } 6812 } 6813 }, -3); 6814 6815 $def(self, '$match', function $$match(idx) { 6816 var self = this, match = nil; 6817 6818 if ($truthy((match = self['$[]'](idx)))) { 6819 return match 6820 } else if (($truthy(idx['$is_a?']($$('Integer'))) && ($truthy($rb_ge(idx, self.$length()))))) { 6821 return $Kernel.$raise($$$('IndexError'), "index " + (idx) + " out of matches") 6822 } else { 6823 return nil 6824 } 6825 }); 6826 6827 $def(self, '$match_length', function $$match_length(idx) { 6828 var $a, self = this; 6829 6830 return ($a = self.$match(idx), ($a === nil || $a == null) ? nil : $a.$length()) 6831 }); 6832 6833 $def(self, '$[]', function $MatchData_$$$10($a) { 6834 var $post_args, args, self = this; 6835 6836 6837 $post_args = $slice(arguments); 6838 args = $post_args; 6839 6840 if (args[0].$$is_string) { 6841 if (self.$regexp().$names()['$include?'](args['$[]'](0))['$!']()) { 6842 $Kernel.$raise($$$('IndexError'), "undefined group name reference: " + (args['$[]'](0))); 6843 } 6844 return self.$named_captures()['$[]'](args['$[]'](0)) 6845 } 6846 else { 6847 return $send(self.matches, '[]', $to_a(args)) 6848 } 6849 }, -1); 6850 6851 $def(self, '$offset', function $$offset(n) { 6852 var self = this; 6853 6854 6855 if (n !== 0) { 6856 $Kernel.$raise($$$('ArgumentError'), "MatchData#offset only supports 0th element"); 6857 } 6858 return [self.begin, self.begin + self.matches[n].length]; 6859 6860 }); 6861 6862 $def(self, '$==', function $MatchData_$eq_eq$11(other) { 6863 var self = this, $ret_or_1 = nil, $ret_or_2 = nil, $ret_or_3 = nil, $ret_or_4 = nil; 6864 6865 6866 if (!$eqeqeq($$$('MatchData'), other)) { 6867 return false 6868 } if ($truthy(($ret_or_1 = ($truthy(($ret_or_2 = ($truthy(($ret_or_3 = ($truthy(($ret_or_4 = self.string == other.string)) ? (self.regexp.toString() == other.regexp.toString()) : ($ret_or_4)))) ? (self.pre_match == other.pre_match) : ($ret_or_3)))) ? (self.post_match == other.post_match) : ($ret_or_2))))) { 6869 return self.begin == other.begin; 6870 } else { 6871 return $ret_or_1 6872 } }); 6873 6874 $def(self, '$begin', function $$begin(n) { 6875 var self = this; 6876 6877 6878 if (n !== 0) { 6879 $Kernel.$raise($$$('ArgumentError'), "MatchData#begin only supports 0th element"); 6880 } 6881 return self.begin; 6882 6883 }); 6884 6885 $def(self, '$end', function $$end(n) { 6886 var self = this; 6887 6888 6889 if (n !== 0) { 6890 $Kernel.$raise($$$('ArgumentError'), "MatchData#end only supports 0th element"); 6891 } 6892 return self.begin + self.matches[n].length; 6893 6894 }); 6895 6896 $def(self, '$captures', function $$captures() { 6897 var self = this; 6898 6899 return self.matches.slice(1) 6900 }); 6901 6902 $def(self, '$named_captures', function $$named_captures() { 6903 var self = this, matches = nil; 6904 6905 6906 matches = self.$captures(); 6907 return $send(self.$regexp().$named_captures(), 'transform_values', [], function $$12(i){ 6908 6909 if (i == null) i = nil; 6910 return matches['$[]']($rb_minus(i.$last(), 1));}); 6911 }); 6912 6913 $def(self, '$names', function $$names() { 6914 var self = this; 6915 6916 return self.$regexp().$names() 6917 }); 6918 6919 $def(self, '$inspect', function $$inspect() { 6920 var self = this; 6921 6922 6923 var str = "#<MatchData " + (self.matches[0]).$inspect(); 6924 6925 if (self.$regexp().$names()['$empty?']()) { 6926 for (var i = 1, length = self.matches.length; i < length; i++) { 6927 str += " " + i + ":" + (self.matches[i]).$inspect(); 6928 } 6929 } 6930 else { 6931 $send(self.$named_captures(), 'each', [], function $$13(k, v){ 6932 6933 if (k == null) k = nil; 6934 if (v == null) v = nil; 6935 return str += " " + k + ":" + v.$inspect();}); 6936 } 6937 6938 return str + ">"; 6939 6940 }); 6941 6942 $def(self, '$length', function $$length() { 6943 var self = this; 6944 6945 return self.matches.length 6946 }); 6947 6948 $def(self, '$to_a', $return_ivar("matches")); 6949 6950 $def(self, '$to_s', function $$to_s() { 6951 var self = this; 6952 6953 return self.matches[0] 6954 }); 6955 6956 $def(self, '$values_at', function $$values_at($a) { 6957 var $post_args, args, self = this; 6958 6959 6960 $post_args = $slice(arguments); 6961 args = $post_args; 6962 6963 var i, a, index, values = []; 6964 6965 for (i = 0; i < args.length; i++) { 6966 6967 if (args[i].$$is_range) { 6968 a = (args[i]).$to_a(); 6969 a.unshift(i, 1); 6970 Array.prototype.splice.apply(args, a); 6971 } 6972 6973 index = $Opal['$coerce_to!'](args[i], $$$('Integer'), "to_int"); 6974 6975 if (index < 0) { 6976 index += self.matches.length; 6977 if (index < 0) { 6978 values.push(nil); 6979 continue; 6980 } 6981 } 6982 6983 values.push(self.matches[index]); 6984 } 6985 6986 return values; 6987 }, -1); 6988 $alias(self, "eql?", "=="); 6989 return $alias(self, "size", "length"); 6990 })($nesting[0], null, $nesting); 6991}; 6992 6993Opal.modules["corelib/string"] = function(Opal) {/* Generated by Opal 1.7.3 */ 6994 var $coerce_to = Opal.coerce_to, $respond_to = Opal.respond_to, $global_multiline_regexp = Opal.global_multiline_regexp, $prop = Opal.prop, $klass = Opal.klass, $def = Opal.def, $Opal = Opal.Opal, $defs = Opal.defs, $slice = Opal.slice, $send = Opal.send, $to_a = Opal.to_a, $extract_kwargs = Opal.extract_kwargs, $ensure_kwargs = Opal.ensure_kwargs, $eqeqeq = Opal.eqeqeq, $Kernel = Opal.Kernel, $truthy = Opal.truthy, $gvars = Opal.gvars, $rb_divide = Opal.rb_divide, $rb_plus = Opal.rb_plus, $eqeq = Opal.eqeq, $hash2 = Opal.hash2, $alias = Opal.alias, $const_set = Opal.const_set, self = Opal.top, $nesting = [], $$ = Opal.$r($nesting), nil = Opal.nil, $$$ = Opal.$$$; 6995 6996 Opal.add_stubs('require,include,coerce_to?,initialize,===,format,raise,respond_to?,to_s,to_str,<=>,==,=~,new,force_encoding,casecmp,empty?,ljust,ceil,/,+,rjust,floor,coerce_to!,nil?,class,copy_singleton_methods,initialize_clone,initialize_dup,enum_for,chomp,[],to_i,length,each_line,to_proc,to_a,match,match?,captures,proc,succ,escape,include?,upcase,unicode_normalize,dup,__id__,next,intern,pristine'); 6997 6998 self.$require("corelib/comparable"); 6999 self.$require("corelib/regexp"); 7000 (function($base, $super, $parent_nesting) { 7001 var self = $klass($base, $super, 'String'); 7002 7003 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 7004 7005 7006 self.$include($$$('Comparable')); 7007 7008 Opal.prop(self.$$prototype, '$$is_string', true); 7009 7010 $def(self, '$__id__', function $$__id__() { 7011 var self = this; 7012 7013 return self.toString(); 7014 }); 7015 $defs(self, '$try_convert', function $$try_convert(what) { 7016 7017 return $Opal['$coerce_to?'](what, $$$('String'), "to_str") 7018 }); 7019 $defs(self, '$new', function $String_new$1($a) { 7020 var $post_args, args, self = this; 7021 7022 7023 $post_args = $slice(arguments); 7024 args = $post_args; 7025 7026 var str = args[0] || ""; 7027 var opts = args[args.length-1]; 7028 str = $coerce_to(str, $$$('String'), 'to_str'); 7029 if (opts && opts.$$is_hash) { 7030 if (opts.$$smap.encoding) str = str.$force_encoding(opts.$$smap.encoding); 7031 } 7032 str = new self.$$constructor(str); 7033 if (!str.$initialize.$$pristine) $send((str), 'initialize', $to_a(args)); 7034 return str; 7035 }, -1); 7036 7037 $def(self, '$initialize', function $$initialize($a, $b) { 7038 var $post_args, $kwargs; 7039 7040 7041 $post_args = $slice(arguments); 7042 $kwargs = $extract_kwargs($post_args); 7043 $kwargs = $ensure_kwargs($kwargs); 7044 7045 if ($post_args.length > 0) $post_args.shift(); 7046 $kwargs.$$smap["encoding"]; 7047 $kwargs.$$smap["capacity"]; return nil; 7048 }, -1); 7049 7050 $def(self, '$%', function $String_$percent$2(data) { 7051 var self = this; 7052 7053 if ($eqeqeq($$$('Array'), data)) { 7054 return $send(self, 'format', [self].concat($to_a(data))) 7055 } else { 7056 return self.$format(self, data) 7057 } 7058 }); 7059 7060 $def(self, '$*', function $String_$$3(count) { 7061 var self = this; 7062 7063 7064 count = $coerce_to(count, $$$('Integer'), 'to_int'); 7065 7066 if (count < 0) { 7067 $Kernel.$raise($$$('ArgumentError'), "negative argument"); 7068 } 7069 7070 if (count === 0) { 7071 return ''; 7072 } 7073 7074 var result = '', 7075 string = self.toString(); 7076 7077 // All credit for the bit-twiddling magic code below goes to Mozilla 7078 // polyfill implementation of String.prototype.repeat() posted here: 7079 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat 7080 7081 if (string.length * count >= 1 << 28) { 7082 $Kernel.$raise($$$('RangeError'), "multiply count must not overflow maximum string size"); 7083 } 7084 7085 for (;;) { 7086 if ((count & 1) === 1) { 7087 result += string; 7088 } 7089 count >>>= 1; 7090 if (count === 0) { 7091 break; 7092 } 7093 string += string; 7094 } 7095 7096 return result; 7097 7098 }); 7099 7100 $def(self, '$+', function $String_$plus$4(other) { 7101 var self = this; 7102 7103 7104 other = $coerce_to(other, $$$('String'), 'to_str'); 7105 7106 if (other == "" && self.$$class === Opal.String) return self; 7107 if (self == "" && other.$$class === Opal.String) return other; 7108 var out = self + other; 7109 if (self.encoding === out.encoding && other.encoding === out.encoding) return out; 7110 if (self.encoding.name === "UTF-8" || other.encoding.name === "UTF-8") return out; 7111 return Opal.enc(out, self.encoding); 7112 }); 7113 7114 $def(self, '$<=>', function $String_$lt_eq_gt$5(other) { 7115 var self = this; 7116 7117 if ($truthy(other['$respond_to?']("to_str"))) { 7118 7119 other = other.$to_str().$to_s(); 7120 return self > other ? 1 : (self < other ? -1 : 0); } else { 7121 7122 var cmp = other['$<=>'](self); 7123 7124 if (cmp === nil) { 7125 return nil; 7126 } 7127 else { 7128 return cmp > 0 ? -1 : (cmp < 0 ? 1 : 0); 7129 } 7130 7131 } 7132 }); 7133 7134 $def(self, '$==', function $String_$eq_eq$6(other) { 7135 var self = this; 7136 7137 7138 if (other.$$is_string) { 7139 return self.toString() === other.toString(); 7140 } 7141 if ($respond_to(other, '$to_str')) { 7142 return other['$=='](self); 7143 } 7144 return false; 7145 7146 }); 7147 7148 $def(self, '$=~', function $String_$eq_tilde$7(other) { 7149 var self = this; 7150 7151 7152 if (other.$$is_string) { 7153 $Kernel.$raise($$$('TypeError'), "type mismatch: String given"); 7154 } 7155 7156 return other['$=~'](self); 7157 7158 }); 7159 7160 $def(self, '$[]', function $String_$$$8(index, length) { 7161 var self = this; 7162 7163 var size = self.length, exclude, range; 7164 7165 if (index.$$is_range) { 7166 exclude = index.excl; 7167 range = index; 7168 length = index.end === nil ? -1 : $coerce_to(index.end, $$$('Integer'), 'to_int'); 7169 index = index.begin === nil ? 0 : $coerce_to(index.begin, $$$('Integer'), 'to_int'); 7170 7171 if (Math.abs(index) > size) { 7172 return nil; 7173 } 7174 7175 if (index < 0) { 7176 index += size; 7177 } 7178 7179 if (length < 0) { 7180 length += size; 7181 } 7182 7183 if (!exclude || range.end === nil) { 7184 length += 1; 7185 } 7186 7187 length = length - index; 7188 7189 if (length < 0) { 7190 length = 0; 7191 } 7192 7193 return self.substr(index, length); 7194 } 7195 7196 7197 if (index.$$is_string) { 7198 if (length != null) { 7199 $Kernel.$raise($$$('TypeError')); 7200 } 7201 return self.indexOf(index) !== -1 ? index : nil; 7202 } 7203 7204 7205 if (index.$$is_regexp) { 7206 var match = self.match(index); 7207 7208 if (match === null) { 7209 ($gvars["~"] = nil); 7210 return nil; 7211 } 7212 7213 ($gvars["~"] = $$$('MatchData').$new(index, match)); 7214 7215 if (length == null) { 7216 return match[0]; 7217 } 7218 7219 length = $coerce_to(length, $$$('Integer'), 'to_int'); 7220 7221 if (length < 0 && -length < match.length) { 7222 return match[length += match.length]; 7223 } 7224 7225 if (length >= 0 && length < match.length) { 7226 return match[length]; 7227 } 7228 7229 return nil; 7230 } 7231 7232 7233 index = $coerce_to(index, $$$('Integer'), 'to_int'); 7234 7235 if (index < 0) { 7236 index += size; 7237 } 7238 7239 if (length == null) { 7240 if (index >= size || index < 0) { 7241 return nil; 7242 } 7243 return self.substr(index, 1); 7244 } 7245 7246 length = $coerce_to(length, $$$('Integer'), 'to_int'); 7247 7248 if (length < 0) { 7249 return nil; 7250 } 7251 7252 if (index > size || index < 0) { 7253 return nil; 7254 } 7255 7256 return self.substr(index, length); 7257 }, -2); 7258 7259 $def(self, '$b', function $$b() { 7260 var self = this; 7261 7262 return (new String(self)).$force_encoding("binary") 7263 }); 7264 7265 $def(self, '$capitalize', function $$capitalize() { 7266 var self = this; 7267 7268 return self.charAt(0).toUpperCase() + self.substr(1).toLowerCase(); 7269 }); 7270 7271 $def(self, '$casecmp', function $$casecmp(other) { 7272 var self = this; 7273 7274 7275 if (!$truthy(other['$respond_to?']("to_str"))) { 7276 return nil 7277 } other = ($coerce_to(other, $$$('String'), 'to_str')).$to_s(); 7278 7279 var ascii_only = /^[\x00-\x7F]*$/; 7280 if (ascii_only.test(self) && ascii_only.test(other)) { 7281 self = self.toLowerCase(); 7282 other = other.toLowerCase(); 7283 } 7284 return self['$<=>'](other); 7285 }); 7286 7287 $def(self, '$casecmp?', function $String_casecmp$ques$9(other) { 7288 var self = this; 7289 7290 7291 var cmp = self.$casecmp(other); 7292 if (cmp === nil) { 7293 return nil; 7294 } else { 7295 return cmp === 0; 7296 } 7297 7298 }); 7299 7300 $def(self, '$center', function $$center(width, padstr) { 7301 var self = this; 7302 7303 7304 if (padstr == null) padstr = " "; 7305 width = $coerce_to(width, $$$('Integer'), 'to_int'); 7306 padstr = ($coerce_to(padstr, $$$('String'), 'to_str')).$to_s(); 7307 if ($truthy(padstr['$empty?']())) { 7308 $Kernel.$raise($$$('ArgumentError'), "zero width padding"); 7309 } if ($truthy(width <= self.length)) { 7310 return self 7311 } 7312 var ljustified = self.$ljust($rb_divide($rb_plus(width, self.length), 2).$ceil(), padstr), 7313 rjustified = self.$rjust($rb_divide($rb_plus(width, self.length), 2).$floor(), padstr); 7314 7315 return rjustified + ljustified.slice(self.length); 7316 }, -2); 7317 7318 $def(self, '$chomp', function $$chomp(separator) { 7319 var self = this; 7320 if ($gvars["/"] == null) $gvars["/"] = nil; 7321 7322 7323 if (separator == null) separator = $gvars["/"]; 7324 if ($truthy(separator === nil || self.length === 0)) { 7325 return self 7326 } separator = $Opal['$coerce_to!'](separator, $$$('String'), "to_str").$to_s(); 7327 7328 var result; 7329 7330 if (separator === "\n") { 7331 result = self.replace(/\r?\n?$/, ''); 7332 } 7333 else if (separator === "") { 7334 result = self.replace(/(\r?\n)+$/, ''); 7335 } 7336 else if (self.length >= separator.length) { 7337 var tail = self.substr(self.length - separator.length, separator.length); 7338 7339 if (tail === separator) { 7340 result = self.substr(0, self.length - separator.length); 7341 } 7342 } 7343 7344 if (result != null) { 7345 return result; 7346 } 7347 return self; 7348 }, -1); 7349 7350 $def(self, '$chop', function $$chop() { 7351 var self = this; 7352 7353 7354 var length = self.length, result; 7355 7356 if (length <= 1) { 7357 result = ""; 7358 } else if (self.charAt(length - 1) === "\n" && self.charAt(length - 2) === "\r") { 7359 result = self.substr(0, length - 2); 7360 } else { 7361 result = self.substr(0, length - 1); 7362 } 7363 7364 return result; 7365 7366 }); 7367 7368 $def(self, '$chr', function $$chr() { 7369 var self = this; 7370 7371 return self.charAt(0); 7372 }); 7373 7374 $def(self, '$clone', function $$clone($kwargs) { 7375 var freeze, self = this, copy = nil; 7376 7377 7378 $kwargs = $ensure_kwargs($kwargs); 7379 7380 freeze = $kwargs.$$smap["freeze"];if (freeze == null) freeze = nil; 7381 if (!(($truthy(freeze['$nil?']()) || ($eqeq(freeze, true))) || ($eqeq(freeze, false)))) { 7382 self.$raise($$('ArgumentError'), "unexpected value for freeze: " + (freeze.$class())); 7383 } copy = new String(self); 7384 copy.$copy_singleton_methods(self); 7385 copy.$initialize_clone(self, $hash2(["freeze"], {"freeze": freeze})); 7386 if ($eqeq(freeze, true)) { 7387 if (!copy.$$frozen) { copy.$$frozen = true; } 7388 } else if ($truthy(freeze['$nil?']())) { 7389 if (self.$$frozen) { copy.$$frozen = true; } 7390 } return copy; 7391 }, -1); 7392 7393 $def(self, '$dup', function $$dup() { 7394 var self = this, copy = nil; 7395 7396 7397 copy = new String(self); 7398 copy.$initialize_dup(self); 7399 return copy; 7400 }); 7401 7402 $def(self, '$count', function $$count($a) { 7403 var $post_args, sets, self = this; 7404 7405 7406 $post_args = $slice(arguments); 7407 sets = $post_args; 7408 7409 if (sets.length === 0) { 7410 $Kernel.$raise($$$('ArgumentError'), "ArgumentError: wrong number of arguments (0 for 1+)"); 7411 } 7412 var char_class = char_class_from_char_sets(sets); 7413 if (char_class === null) { 7414 return 0; 7415 } 7416 return self.length - self.replace(new RegExp(char_class, 'g'), '').length; 7417 }, -1); 7418 7419 $def(self, '$delete', function $String_delete$10($a) { 7420 var $post_args, sets, self = this; 7421 7422 7423 $post_args = $slice(arguments); 7424 sets = $post_args; 7425 7426 if (sets.length === 0) { 7427 $Kernel.$raise($$$('ArgumentError'), "ArgumentError: wrong number of arguments (0 for 1+)"); 7428 } 7429 var char_class = char_class_from_char_sets(sets); 7430 if (char_class === null) { 7431 return self; 7432 } 7433 return self.replace(new RegExp(char_class, 'g'), ''); 7434 }, -1); 7435 7436 $def(self, '$delete_prefix', function $$delete_prefix(prefix) { 7437 var self = this; 7438 7439 7440 if (!prefix.$$is_string) { 7441 prefix = $coerce_to(prefix, $$$('String'), 'to_str'); 7442 } 7443 7444 if (self.slice(0, prefix.length) === prefix) { 7445 return self.slice(prefix.length); 7446 } else { 7447 return self; 7448 } 7449 7450 }); 7451 7452 $def(self, '$delete_suffix', function $$delete_suffix(suffix) { 7453 var self = this; 7454 7455 7456 if (!suffix.$$is_string) { 7457 suffix = $coerce_to(suffix, $$$('String'), 'to_str'); 7458 } 7459 7460 if (self.slice(self.length - suffix.length) === suffix) { 7461 return self.slice(0, self.length - suffix.length); 7462 } else { 7463 return self; 7464 } 7465 7466 }); 7467 7468 $def(self, '$downcase', function $$downcase() { 7469 var self = this; 7470 7471 return self.toLowerCase(); 7472 }); 7473 7474 $def(self, '$each_line', function $$each_line($a, $b) { 7475 var block = $$each_line.$$p || nil, $post_args, $kwargs, separator, chomp, self = this; 7476 if ($gvars["/"] == null) $gvars["/"] = nil; 7477 7478 $$each_line.$$p = null; 7479 $post_args = $slice(arguments); 7480 $kwargs = $extract_kwargs($post_args); 7481 $kwargs = $ensure_kwargs($kwargs); 7482 7483 if ($post_args.length > 0) separator = $post_args.shift();if (separator == null) separator = $gvars["/"]; 7484 7485 chomp = $kwargs.$$smap["chomp"];if (chomp == null) chomp = false; 7486 if (!(block !== nil)) { 7487 return self.$enum_for("each_line", separator, $hash2(["chomp"], {"chomp": chomp})) 7488 } 7489 if (separator === nil) { 7490 Opal.yield1(block, self); 7491 7492 return self; 7493 } 7494 7495 separator = $coerce_to(separator, $$$('String'), 'to_str'); 7496 7497 var a, i, n, length, chomped, trailing, splitted, value; 7498 7499 if (separator.length === 0) { 7500 for (a = self.split(/((?:\r?\n){2})(?:(?:\r?\n)*)/), i = 0, n = a.length; i < n; i += 2) { 7501 if (a[i] || a[i + 1]) { 7502 value = (a[i] || "") + (a[i + 1] || ""); 7503 if (chomp) { 7504 value = (value).$chomp("\n"); 7505 } 7506 Opal.yield1(block, value); 7507 } 7508 } 7509 7510 return self; 7511 } 7512 7513 chomped = self.$chomp(separator); 7514 trailing = self.length != chomped.length; 7515 splitted = chomped.split(separator); 7516 7517 for (i = 0, length = splitted.length; i < length; i++) { 7518 value = splitted[i]; 7519 if (i < length - 1 || trailing) { 7520 value += separator; 7521 } 7522 if (chomp) { 7523 value = (value).$chomp(separator); 7524 } 7525 Opal.yield1(block, value); 7526 } 7527 return self; 7528 }, -1); 7529 7530 $def(self, '$empty?', function $String_empty$ques$11() { 7531 var self = this; 7532 7533 return self.length === 0; 7534 }); 7535 7536 $def(self, '$end_with?', function $String_end_with$ques$12($a) { 7537 var $post_args, suffixes, self = this; 7538 7539 7540 $post_args = $slice(arguments); 7541 suffixes = $post_args; 7542 7543 for (var i = 0, length = suffixes.length; i < length; i++) { 7544 var suffix = $coerce_to(suffixes[i], $$$('String'), 'to_str').$to_s(); 7545 7546 if (self.length >= suffix.length && 7547 self.substr(self.length - suffix.length, suffix.length) == suffix) { 7548 return true; 7549 } 7550 } 7551 return false; 7552 }, -1); 7553 7554 $def(self, '$gsub', function $$gsub(pattern, replacement) { 7555 var block = $$gsub.$$p || nil, self = this; 7556 7557 $$gsub.$$p = null; 7558 7559 if (replacement === undefined && block === nil) { 7560 return self.$enum_for("gsub", pattern); 7561 } 7562 7563 var result = '', match_data = nil, index = 0, match, _replacement; 7564 7565 if (pattern.$$is_regexp) { 7566 pattern = $global_multiline_regexp(pattern); 7567 } else { 7568 pattern = $coerce_to(pattern, $$$('String'), 'to_str'); 7569 pattern = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gm'); 7570 } 7571 7572 var lastIndex; 7573 while (true) { 7574 match = pattern.exec(self); 7575 7576 if (match === null) { 7577 ($gvars["~"] = nil); 7578 result += self.slice(index); 7579 break; 7580 } 7581 7582 match_data = $$$('MatchData').$new(pattern, match); 7583 7584 if (replacement === undefined) { 7585 lastIndex = pattern.lastIndex; 7586 _replacement = block(match[0]); 7587 pattern.lastIndex = lastIndex; // save and restore lastIndex 7588 } 7589 else if (replacement.$$is_hash) { 7590 _replacement = (replacement)['$[]'](match[0]).$to_s(); 7591 } 7592 else { 7593 if (!replacement.$$is_string) { 7594 replacement = $coerce_to(replacement, $$$('String'), 'to_str'); 7595 } 7596 _replacement = replacement.replace(/([\\]+)([0-9+&`'])/g, function (original, slashes, command) { 7597 if (slashes.length % 2 === 0) { 7598 return original; 7599 } 7600 switch (command) { 7601 case "+": 7602 for (var i = match.length - 1; i > 0; i--) { 7603 if (match[i] !== undefined) { 7604 return slashes.slice(1) + match[i]; 7605 } 7606 } 7607 return ''; 7608 case "&": return slashes.slice(1) + match[0]; 7609 case "`": return slashes.slice(1) + self.slice(0, match.index); 7610 case "'": return slashes.slice(1) + self.slice(match.index + match[0].length); 7611 default: return slashes.slice(1) + (match[command] || ''); 7612 } 7613 }).replace(/\\\\/g, '\\'); 7614 } 7615 7616 if (pattern.lastIndex === match.index) { 7617 result += (self.slice(index, match.index) + _replacement + (self[match.index] || "")); 7618 pattern.lastIndex += 1; 7619 } 7620 else { 7621 result += (self.slice(index, match.index) + _replacement); 7622 } 7623 index = pattern.lastIndex; 7624 } 7625 7626 ($gvars["~"] = match_data); 7627 return result; 7628 }, -2); 7629 7630 $def(self, '$hash', function $$hash() { 7631 var self = this; 7632 7633 return self.toString(); 7634 }); 7635 7636 $def(self, '$hex', function $$hex() { 7637 var self = this; 7638 7639 return self.$to_i(16) 7640 }); 7641 7642 $def(self, '$include?', function $String_include$ques$13(other) { 7643 var self = this; 7644 7645 7646 if (!other.$$is_string) { 7647 other = $coerce_to(other, $$$('String'), 'to_str'); 7648 } 7649 return self.indexOf(other) !== -1; 7650 7651 }); 7652 7653 $def(self, '$index', function $$index(search, offset) { 7654 var self = this; 7655 7656 var index, 7657 match, 7658 regex; 7659 7660 if (offset === undefined) { 7661 offset = 0; 7662 } else { 7663 offset = $coerce_to(offset, $$$('Integer'), 'to_int'); 7664 if (offset < 0) { 7665 offset += self.length; 7666 if (offset < 0) { 7667 return nil; 7668 } 7669 } 7670 } 7671 7672 if (search.$$is_regexp) { 7673 regex = $global_multiline_regexp(search); 7674 while (true) { 7675 match = regex.exec(self); 7676 if (match === null) { 7677 ($gvars["~"] = nil); 7678 index = -1; 7679 break; 7680 } 7681 if (match.index >= offset) { 7682 ($gvars["~"] = $$$('MatchData').$new(regex, match)); 7683 index = match.index; 7684 break; 7685 } 7686 regex.lastIndex = match.index + 1; 7687 } 7688 } else { 7689 search = $coerce_to(search, $$$('String'), 'to_str'); 7690 if (search.length === 0 && offset > self.length) { 7691 index = -1; 7692 } else { 7693 index = self.indexOf(search, offset); 7694 } 7695 } 7696 7697 return index === -1 ? nil : index; 7698 }, -2); 7699 7700 $def(self, '$inspect', function $$inspect() { 7701 var self = this; 7702 7703 7704 /* eslint-disable no-misleading-character-class */ 7705 var escapable = /[\\\"\x00-\x1f\u007F-\u009F\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, 7706 meta = { 7707 '\u0007': '\\a', 7708 '\u001b': '\\e', 7709 '\b': '\\b', 7710 '\t': '\\t', 7711 '\n': '\\n', 7712 '\f': '\\f', 7713 '\r': '\\r', 7714 '\v': '\\v', 7715 '"' : '\\"', 7716 '\\': '\\\\' 7717 }, 7718 escaped = self.replace(escapable, function (chr) { 7719 if (meta[chr]) return meta[chr]; 7720 chr = chr.charCodeAt(0); 7721 if (chr <= 0xff && (self.encoding["$binary?"]() || self.internal_encoding["$binary?"]())) { 7722 return '\\x' + ('00' + chr.toString(16).toUpperCase()).slice(-2); 7723 } else { 7724 return '\\u' + ('0000' + chr.toString(16).toUpperCase()).slice(-4); 7725 } 7726 }); 7727 return '"' + escaped.replace(/\#[\$\@\{]/g, '\\$&') + '"'; 7728 /* eslint-enable no-misleading-character-class */ 7729 7730 }); 7731 7732 $def(self, '$intern', function $$intern() { 7733 var self = this; 7734 7735 return self.toString(); 7736 }); 7737 7738 $def(self, '$length', function $$length() { 7739 var self = this; 7740 7741 return self.length; 7742 }); 7743 $alias(self, "size", "length"); 7744 7745 $def(self, '$lines', function $$lines($a, $b) { 7746 var block = $$lines.$$p || nil, $post_args, $kwargs, separator, chomp, self = this, e = nil; 7747 if ($gvars["/"] == null) $gvars["/"] = nil; 7748 7749 $$lines.$$p = null; 7750 $post_args = $slice(arguments); 7751 $kwargs = $extract_kwargs($post_args); 7752 $kwargs = $ensure_kwargs($kwargs); 7753 7754 if ($post_args.length > 0) separator = $post_args.shift();if (separator == null) separator = $gvars["/"]; 7755 7756 chomp = $kwargs.$$smap["chomp"];if (chomp == null) chomp = false; 7757 e = $send(self, 'each_line', [separator, $hash2(["chomp"], {"chomp": chomp})], block.$to_proc()); 7758 if ($truthy(block)) { 7759 return self 7760 } else { 7761 return e.$to_a() 7762 } }, -1); 7763 7764 $def(self, '$ljust', function $$ljust(width, padstr) { 7765 var self = this; 7766 7767 7768 if (padstr == null) padstr = " "; 7769 width = $coerce_to(width, $$$('Integer'), 'to_int'); 7770 padstr = ($coerce_to(padstr, $$$('String'), 'to_str')).$to_s(); 7771 if ($truthy(padstr['$empty?']())) { 7772 $Kernel.$raise($$$('ArgumentError'), "zero width padding"); 7773 } if ($truthy(width <= self.length)) { 7774 return self 7775 } 7776 var index = -1, 7777 result = ""; 7778 7779 width -= self.length; 7780 7781 while (++index < width) { 7782 result += padstr; 7783 } 7784 7785 return self + result.slice(0, width); 7786 }, -2); 7787 7788 $def(self, '$lstrip', function $$lstrip() { 7789 var self = this; 7790 7791 return self.replace(/^[\u0000\s]*/, ''); 7792 }); 7793 7794 $def(self, '$ascii_only?', function $String_ascii_only$ques$14() { 7795 var self = this; 7796 7797 7798 if (!self.encoding.ascii) return false; 7799 return /^[\x00-\x7F]*$/.test(self); 7800 7801 }); 7802 7803 $def(self, '$match', function $$match(pattern, pos) { 7804 var block = $$match.$$p || nil, self = this; 7805 7806 $$match.$$p = null; 7807 if (($eqeqeq($$('String'), pattern) || ($truthy(pattern['$respond_to?']("to_str"))))) { 7808 pattern = $$$('Regexp').$new(pattern.$to_str()); 7809 } if (!$eqeqeq($$$('Regexp'), pattern)) { 7810 $Kernel.$raise($$$('TypeError'), "wrong argument type " + (pattern.$class()) + " (expected Regexp)"); 7811 } return $send(pattern, 'match', [self, pos], block.$to_proc()); 7812 }, -2); 7813 7814 $def(self, '$match?', function $String_match$ques$15(pattern, pos) { 7815 var self = this; 7816 if (($eqeqeq($$('String'), pattern) || ($truthy(pattern['$respond_to?']("to_str"))))) { 7817 pattern = $$$('Regexp').$new(pattern.$to_str()); 7818 } if (!$eqeqeq($$$('Regexp'), pattern)) { 7819 $Kernel.$raise($$$('TypeError'), "wrong argument type " + (pattern.$class()) + " (expected Regexp)"); 7820 } return pattern['$match?'](self, pos); 7821 }, -2); 7822 7823 $def(self, '$next', function $$next() { 7824 var self = this; 7825 7826 7827 var i = self.length; 7828 if (i === 0) { 7829 return ''; 7830 } 7831 var result = self; 7832 var first_alphanum_char_index = self.search(/[a-zA-Z0-9]/); 7833 var carry = false; 7834 var code; 7835 while (i--) { 7836 code = self.charCodeAt(i); 7837 if ((code >= 48 && code <= 57) || 7838 (code >= 65 && code <= 90) || 7839 (code >= 97 && code <= 122)) { 7840 switch (code) { 7841 case 57: 7842 carry = true; 7843 code = 48; 7844 break; 7845 case 90: 7846 carry = true; 7847 code = 65; 7848 break; 7849 case 122: 7850 carry = true; 7851 code = 97; 7852 break; 7853 default: 7854 carry = false; 7855 code += 1; 7856 } 7857 } else { 7858 if (first_alphanum_char_index === -1) { 7859 if (code === 255) { 7860 carry = true; 7861 code = 0; 7862 } else { 7863 carry = false; 7864 code += 1; 7865 } 7866 } else { 7867 carry = true; 7868 } 7869 } 7870 result = result.slice(0, i) + String.fromCharCode(code) + result.slice(i + 1); 7871 if (carry && (i === 0 || i === first_alphanum_char_index)) { 7872 switch (code) { 7873 case 65: 7874 break; 7875 case 97: 7876 break; 7877 default: 7878 code += 1; 7879 } 7880 if (i === 0) { 7881 result = String.fromCharCode(code) + result; 7882 } else { 7883 result = result.slice(0, i) + String.fromCharCode(code) + result.slice(i); 7884 } 7885 carry = false; 7886 } 7887 if (!carry) { 7888 break; 7889 } 7890 } 7891 return result; 7892 7893 }); 7894 7895 $def(self, '$oct', function $$oct() { 7896 var self = this; 7897 7898 7899 var result, 7900 string = self, 7901 radix = 8; 7902 7903 if (/^\s*_/.test(string)) { 7904 return 0; 7905 } 7906 7907 string = string.replace(/^(\s*[+-]?)(0[bodx]?)(.+)$/i, function (original, head, flag, tail) { 7908 switch (tail.charAt(0)) { 7909 case '+': 7910 case '-': 7911 return original; 7912 case '0': 7913 if (tail.charAt(1) === 'x' && flag === '0x') { 7914 return original; 7915 } 7916 } 7917 switch (flag) { 7918 case '0b': 7919 radix = 2; 7920 break; 7921 case '0': 7922 case '0o': 7923 radix = 8; 7924 break; 7925 case '0d': 7926 radix = 10; 7927 break; 7928 case '0x': 7929 radix = 16; 7930 break; 7931 } 7932 return head + tail; 7933 }); 7934 7935 result = parseInt(string.replace(/_(?!_)/g, ''), radix); 7936 return isNaN(result) ? 0 : result; 7937 7938 }); 7939 7940 $def(self, '$ord', function $$ord() { 7941 var self = this; 7942 7943 7944 if (typeof self.codePointAt === "function") { 7945 return self.codePointAt(0); 7946 } 7947 else { 7948 return self.charCodeAt(0); 7949 } 7950 7951 }); 7952 7953 $def(self, '$partition', function $$partition(sep) { 7954 var self = this; 7955 7956 7957 var i, m; 7958 7959 if (sep.$$is_regexp) { 7960 m = sep.exec(self); 7961 if (m === null) { 7962 i = -1; 7963 } else { 7964 $$$('MatchData').$new(sep, m); 7965 sep = m[0]; 7966 i = m.index; 7967 } 7968 } else { 7969 sep = $coerce_to(sep, $$$('String'), 'to_str'); 7970 i = self.indexOf(sep); 7971 } 7972 7973 if (i === -1) { 7974 return [self, '', '']; 7975 } 7976 7977 return [ 7978 self.slice(0, i), 7979 self.slice(i, i + sep.length), 7980 self.slice(i + sep.length) 7981 ]; 7982 7983 }); 7984 7985 $def(self, '$reverse', function $$reverse() { 7986 var self = this; 7987 7988 return self.split('').reverse().join(''); 7989 }); 7990 7991 $def(self, '$rindex', function $$rindex(search, offset) { 7992 var self = this; 7993 7994 var i, m, r, _m; 7995 7996 if (offset === undefined) { 7997 offset = self.length; 7998 } else { 7999 offset = $coerce_to(offset, $$$('Integer'), 'to_int'); 8000 if (offset < 0) { 8001 offset += self.length; 8002 if (offset < 0) { 8003 return nil; 8004 } 8005 } 8006 } 8007 8008 if (search.$$is_regexp) { 8009 m = null; 8010 r = $global_multiline_regexp(search); 8011 while (true) { 8012 _m = r.exec(self); 8013 if (_m === null || _m.index > offset) { 8014 break; 8015 } 8016 m = _m; 8017 r.lastIndex = m.index + 1; 8018 } 8019 if (m === null) { 8020 ($gvars["~"] = nil); 8021 i = -1; 8022 } else { 8023 $$$('MatchData').$new(r, m); 8024 i = m.index; 8025 } 8026 } else { 8027 search = $coerce_to(search, $$$('String'), 'to_str'); 8028 i = self.lastIndexOf(search, offset); 8029 } 8030 8031 return i === -1 ? nil : i; 8032 }, -2); 8033 8034 $def(self, '$rjust', function $$rjust(width, padstr) { 8035 var self = this; 8036 8037 8038 if (padstr == null) padstr = " "; 8039 width = $coerce_to(width, $$$('Integer'), 'to_int'); 8040 padstr = ($coerce_to(padstr, $$$('String'), 'to_str')).$to_s(); 8041 if ($truthy(padstr['$empty?']())) { 8042 $Kernel.$raise($$$('ArgumentError'), "zero width padding"); 8043 } if ($truthy(width <= self.length)) { 8044 return self 8045 } 8046 var chars = Math.floor(width - self.length), 8047 patterns = Math.floor(chars / padstr.length), 8048 result = Array(patterns + 1).join(padstr), 8049 remaining = chars - result.length; 8050 8051 return result + padstr.slice(0, remaining) + self; 8052 }, -2); 8053 8054 $def(self, '$rpartition', function $$rpartition(sep) { 8055 var self = this; 8056 8057 8058 var i, m, r, _m; 8059 8060 if (sep.$$is_regexp) { 8061 m = null; 8062 r = $global_multiline_regexp(sep); 8063 8064 while (true) { 8065 _m = r.exec(self); 8066 if (_m === null) { 8067 break; 8068 } 8069 m = _m; 8070 r.lastIndex = m.index + 1; 8071 } 8072 8073 if (m === null) { 8074 i = -1; 8075 } else { 8076 $$$('MatchData').$new(r, m); 8077 sep = m[0]; 8078 i = m.index; 8079 } 8080 8081 } else { 8082 sep = $coerce_to(sep, $$$('String'), 'to_str'); 8083 i = self.lastIndexOf(sep); 8084 } 8085 8086 if (i === -1) { 8087 return ['', '', self]; 8088 } 8089 8090 return [ 8091 self.slice(0, i), 8092 self.slice(i, i + sep.length), 8093 self.slice(i + sep.length) 8094 ]; 8095 8096 }); 8097 8098 $def(self, '$rstrip', function $$rstrip() { 8099 var self = this; 8100 8101 return self.replace(/[\s\u0000]*$/, ''); 8102 }); 8103 8104 $def(self, '$scan', function $$scan(pattern, $kwargs) { 8105 var block = $$scan.$$p || nil, no_matchdata, self = this; 8106 8107 $$scan.$$p = null; 8108 $kwargs = $ensure_kwargs($kwargs); 8109 8110 no_matchdata = $kwargs.$$smap["no_matchdata"];if (no_matchdata == null) no_matchdata = false; 8111 8112 var result = [], 8113 match_data = nil, 8114 match; 8115 8116 if (pattern.$$is_regexp) { 8117 pattern = $global_multiline_regexp(pattern); 8118 } else { 8119 pattern = $coerce_to(pattern, $$$('String'), 'to_str'); 8120 pattern = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gm'); 8121 } 8122 8123 while ((match = pattern.exec(self)) != null) { 8124 match_data = $$$('MatchData').$new(pattern, match, $hash2(["no_matchdata"], {"no_matchdata": no_matchdata})); 8125 if (block === nil) { 8126 match.length == 1 ? result.push(match[0]) : result.push((match_data).$captures()); 8127 } else { 8128 match.length == 1 ? Opal.yield1(block, match[0]) : Opal.yield1(block, (match_data).$captures()); 8129 } 8130 if (pattern.lastIndex === match.index) { 8131 pattern.lastIndex += 1; 8132 } 8133 } 8134 8135 if (!no_matchdata) ($gvars["~"] = match_data); 8136 8137 return (block !== nil ? self : result); 8138 }, -2); 8139 8140 $def(self, '$singleton_class', function $$singleton_class() { 8141 var self = this; 8142 8143 return Opal.get_singleton_class(self); 8144 }); 8145 8146 $def(self, '$split', function $$split(pattern, limit) { 8147 var self = this, $ret_or_1 = nil; 8148 if ($gvars[";"] == null) $gvars[";"] = nil; 8149 8150 if (self.length === 0) { 8151 return []; 8152 } 8153 8154 if (limit === undefined) { 8155 limit = 0; 8156 } else { 8157 limit = $Opal['$coerce_to!'](limit, $$$('Integer'), "to_int"); 8158 if (limit === 1) { 8159 return [self]; 8160 } 8161 } 8162 8163 if (pattern === undefined || pattern === nil) { 8164 pattern = ($truthy(($ret_or_1 = $gvars[";"])) ? ($ret_or_1) : (" ")); 8165 } 8166 8167 var result = [], 8168 string = self.toString(), 8169 index = 0, 8170 match, 8171 i, ii; 8172 8173 if (pattern.$$is_regexp) { 8174 pattern = $global_multiline_regexp(pattern); 8175 } else { 8176 pattern = $coerce_to(pattern, $$$('String'), 'to_str').$to_s(); 8177 if (pattern === ' ') { 8178 pattern = /\s+/gm; 8179 string = string.replace(/^\s+/, ''); 8180 } else { 8181 pattern = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gm'); 8182 } 8183 } 8184 8185 result = string.split(pattern); 8186 8187 if (result.length === 1 && result[0] === string) { 8188 return [result[0]]; 8189 } 8190 8191 while ((i = result.indexOf(undefined)) !== -1) { 8192 result.splice(i, 1); 8193 } 8194 8195 if (limit === 0) { 8196 while (result[result.length - 1] === '') { 8197 result.length -= 1; 8198 } 8199 return result; 8200 } 8201 8202 match = pattern.exec(string); 8203 8204 if (limit < 0) { 8205 if (match !== null && match[0] === '' && pattern.source.indexOf('(?=') === -1) { 8206 for (i = 0, ii = match.length; i < ii; i++) { 8207 result.push(''); 8208 } 8209 } 8210 return result; 8211 } 8212 8213 if (match !== null && match[0] === '') { 8214 result.splice(limit - 1, result.length - 1, result.slice(limit - 1).join('')); 8215 return result; 8216 } 8217 8218 if (limit >= result.length) { 8219 return result; 8220 } 8221 8222 i = 0; 8223 while (match !== null) { 8224 i++; 8225 index = pattern.lastIndex; 8226 if (i + 1 === limit) { 8227 break; 8228 } 8229 match = pattern.exec(string); 8230 } 8231 result.splice(limit - 1, result.length - 1, string.slice(index)); 8232 return result; 8233 }, -1); 8234 8235 $def(self, '$squeeze', function $$squeeze($a) { 8236 var $post_args, sets, self = this; 8237 8238 8239 $post_args = $slice(arguments); 8240 sets = $post_args; 8241 8242 if (sets.length === 0) { 8243 return self.replace(/(.)\1+/g, '$1'); 8244 } 8245 var char_class = char_class_from_char_sets(sets); 8246 if (char_class === null) { 8247 return self; 8248 } 8249 return self.replace(new RegExp('(' + char_class + ')\\1+', 'g'), '$1'); 8250 }, -1); 8251 8252 $def(self, '$start_with?', function $String_start_with$ques$16($a) { 8253 var $post_args, prefixes, self = this; 8254 8255 8256 $post_args = $slice(arguments); 8257 prefixes = $post_args; 8258 8259 for (var i = 0, length = prefixes.length; i < length; i++) { 8260 if (prefixes[i].$$is_regexp) { 8261 var regexp = prefixes[i]; 8262 var match = regexp.exec(self); 8263 8264 if (match != null && match.index === 0) { 8265 ($gvars["~"] = $$$('MatchData').$new(regexp, match)); 8266 return true; 8267 } else { 8268 ($gvars["~"] = nil); 8269 } 8270 } else { 8271 var prefix = $coerce_to(prefixes[i], $$$('String'), 'to_str').$to_s(); 8272 8273 if (self.indexOf(prefix) === 0) { 8274 return true; 8275 } 8276 } 8277 } 8278 8279 return false; 8280 }, -1); 8281 8282 $def(self, '$strip', function $$strip() { 8283 var self = this; 8284 8285 return self.replace(/^[\s\u0000]*|[\s\u0000]*$/g, ''); 8286 }); 8287 8288 $def(self, '$sub', function $$sub(pattern, replacement) { 8289 var block = $$sub.$$p || nil, self = this; 8290 8291 $$sub.$$p = null; 8292 8293 if (!pattern.$$is_regexp) { 8294 pattern = $coerce_to(pattern, $$$('String'), 'to_str'); 8295 pattern = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); 8296 } 8297 8298 var result, match = pattern.exec(self); 8299 8300 if (match === null) { 8301 ($gvars["~"] = nil); 8302 result = self.toString(); 8303 } else { 8304 $$$('MatchData').$new(pattern, match); 8305 8306 if (replacement === undefined) { 8307 8308 if (block === nil) { 8309 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (1 for 2)"); 8310 } 8311 result = self.slice(0, match.index) + block(match[0]) + self.slice(match.index + match[0].length); 8312 8313 } else if (replacement.$$is_hash) { 8314 8315 result = self.slice(0, match.index) + (replacement)['$[]'](match[0]).$to_s() + self.slice(match.index + match[0].length); 8316 8317 } else { 8318 8319 replacement = $coerce_to(replacement, $$$('String'), 'to_str'); 8320 8321 replacement = replacement.replace(/([\\]+)([0-9+&`'])/g, function (original, slashes, command) { 8322 if (slashes.length % 2 === 0) { 8323 return original; 8324 } 8325 switch (command) { 8326 case "+": 8327 for (var i = match.length - 1; i > 0; i--) { 8328 if (match[i] !== undefined) { 8329 return slashes.slice(1) + match[i]; 8330 } 8331 } 8332 return ''; 8333 case "&": return slashes.slice(1) + match[0]; 8334 case "`": return slashes.slice(1) + self.slice(0, match.index); 8335 case "'": return slashes.slice(1) + self.slice(match.index + match[0].length); 8336 default: return slashes.slice(1) + (match[command] || ''); 8337 } 8338 }).replace(/\\\\/g, '\\'); 8339 8340 result = self.slice(0, match.index) + replacement + self.slice(match.index + match[0].length); 8341 } 8342 } 8343 8344 return result; 8345 }, -2); 8346 8347 $def(self, '$sum', function $$sum(n) { 8348 var self = this; 8349 8350 8351 if (n == null) n = 16; 8352 8353 n = $coerce_to(n, $$$('Integer'), 'to_int'); 8354 8355 var result = 0, 8356 length = self.length, 8357 i = 0; 8358 8359 for (; i < length; i++) { 8360 result += self.charCodeAt(i); 8361 } 8362 8363 if (n <= 0) { 8364 return result; 8365 } 8366 8367 return result & (Math.pow(2, n) - 1); 8368 }, -1); 8369 8370 $def(self, '$swapcase', function $$swapcase() { 8371 var self = this; 8372 8373 8374 var str = self.replace(/([a-z]+)|([A-Z]+)/g, function($0,$1,$2) { 8375 return $1 ? $0.toUpperCase() : $0.toLowerCase(); 8376 }); 8377 8378 return str; 8379 8380 }); 8381 8382 $def(self, '$to_f', function $$to_f() { 8383 var self = this; 8384 8385 8386 if (self.charAt(0) === '_') { 8387 return 0; 8388 } 8389 8390 var result = parseFloat(self.replace(/_/g, '')); 8391 8392 if (isNaN(result) || result == Infinity || result == -Infinity) { 8393 return 0; 8394 } 8395 else { 8396 return result; 8397 } 8398 8399 }); 8400 8401 $def(self, '$to_i', function $$to_i(base) { 8402 var self = this; 8403 8404 8405 if (base == null) base = 10; 8406 8407 var result, 8408 string = self.toLowerCase(), 8409 radix = $coerce_to(base, $$$('Integer'), 'to_int'); 8410 8411 if (radix === 1 || radix < 0 || radix > 36) { 8412 $Kernel.$raise($$$('ArgumentError'), "invalid radix " + (radix)); 8413 } 8414 8415 if (/^\s*_/.test(string)) { 8416 return 0; 8417 } 8418 8419 string = string.replace(/^(\s*[+-]?)(0[bodx]?)(.+)$/, function (original, head, flag, tail) { 8420 switch (tail.charAt(0)) { 8421 case '+': 8422 case '-': 8423 return original; 8424 case '0': 8425 if (tail.charAt(1) === 'x' && flag === '0x' && (radix === 0 || radix === 16)) { 8426 return original; 8427 } 8428 } 8429 switch (flag) { 8430 case '0b': 8431 if (radix === 0 || radix === 2) { 8432 radix = 2; 8433 return head + tail; 8434 } 8435 break; 8436 case '0': 8437 case '0o': 8438 if (radix === 0 || radix === 8) { 8439 radix = 8; 8440 return head + tail; 8441 } 8442 break; 8443 case '0d': 8444 if (radix === 0 || radix === 10) { 8445 radix = 10; 8446 return head + tail; 8447 } 8448 break; 8449 case '0x': 8450 if (radix === 0 || radix === 16) { 8451 radix = 16; 8452 return head + tail; 8453 } 8454 break; 8455 } 8456 return original 8457 }); 8458 8459 result = parseInt(string.replace(/_(?!_)/g, ''), radix); 8460 return isNaN(result) ? 0 : result; 8461 }, -1); 8462 8463 $def(self, '$to_proc', function $$to_proc() { 8464 var self = this, method_name = nil, jsid = nil, proc = nil; 8465 8466 $$to_proc.$$p = null; 8467 8468 method_name = self.valueOf(); 8469 jsid = Opal.jsid(method_name); 8470 proc = $send($Kernel, 'proc', [], function $$17($a){var block = $$17.$$p || nil, $post_args, args; 8471 8472 $$17.$$p = null; 8473 $post_args = $slice(arguments); 8474 args = $post_args; 8475 8476 if (args.length === 0) { 8477 $Kernel.$raise($$$('ArgumentError'), "no receiver given"); 8478 } 8479 8480 var recv = args[0]; 8481 8482 if (recv == null) recv = nil; 8483 8484 var body = recv[jsid]; 8485 8486 if (!body) { 8487 body = recv.$method_missing; 8488 args[0] = method_name; 8489 } else { 8490 args = args.slice(1); 8491 } 8492 8493 if (typeof block === 'function') { 8494 body.$$p = block; 8495 } 8496 8497 if (args.length === 0) { 8498 return body.call(recv); 8499 } else { 8500 return body.apply(recv, args); 8501 } 8502}, -1); 8503 proc.$$source_location = nil; 8504 return proc; 8505 }); 8506 8507 $def(self, '$to_s', function $$to_s() { 8508 var self = this; 8509 8510 return self.toString(); 8511 }); 8512 8513 $def(self, '$tr', function $$tr(from, to) { 8514 var self = this; 8515 8516 8517 from = $coerce_to(from, $$$('String'), 'to_str').$to_s(); 8518 to = $coerce_to(to, $$$('String'), 'to_str').$to_s(); 8519 8520 if (from.length == 0 || from === to) { 8521 return self; 8522 } 8523 8524 var i, in_range, c, ch, start, end, length; 8525 var subs = {}; 8526 var from_chars = from.split(''); 8527 var from_length = from_chars.length; 8528 var to_chars = to.split(''); 8529 var to_length = to_chars.length; 8530 8531 var inverse = false; 8532 var global_sub = null; 8533 if (from_chars[0] === '^' && from_chars.length > 1) { 8534 inverse = true; 8535 from_chars.shift(); 8536 global_sub = to_chars[to_length - 1]; 8537 from_length -= 1; 8538 } 8539 8540 var from_chars_expanded = []; 8541 var last_from = null; 8542 in_range = false; 8543 for (i = 0; i < from_length; i++) { 8544 ch = from_chars[i]; 8545 if (last_from == null) { 8546 last_from = ch; 8547 from_chars_expanded.push(ch); 8548 } 8549 else if (ch === '-') { 8550 if (last_from === '-') { 8551 from_chars_expanded.push('-'); 8552 from_chars_expanded.push('-'); 8553 } 8554 else if (i == from_length - 1) { 8555 from_chars_expanded.push('-'); 8556 } 8557 else { 8558 in_range = true; 8559 } 8560 } 8561 else if (in_range) { 8562 start = last_from.charCodeAt(0); 8563 end = ch.charCodeAt(0); 8564 if (start > end) { 8565 $Kernel.$raise($$$('ArgumentError'), "invalid range \"" + (String.fromCharCode(start)) + "-" + (String.fromCharCode(end)) + "\" in string transliteration"); 8566 } 8567 for (c = start + 1; c < end; c++) { 8568 from_chars_expanded.push(String.fromCharCode(c)); 8569 } 8570 from_chars_expanded.push(ch); 8571 in_range = null; 8572 last_from = null; 8573 } 8574 else { 8575 from_chars_expanded.push(ch); 8576 } 8577 } 8578 8579 from_chars = from_chars_expanded; 8580 from_length = from_chars.length; 8581 8582 if (inverse) { 8583 for (i = 0; i < from_length; i++) { 8584 subs[from_chars[i]] = true; 8585 } 8586 } 8587 else { 8588 if (to_length > 0) { 8589 var to_chars_expanded = []; 8590 var last_to = null; 8591 in_range = false; 8592 for (i = 0; i < to_length; i++) { 8593 ch = to_chars[i]; 8594 if (last_to == null) { 8595 last_to = ch; 8596 to_chars_expanded.push(ch); 8597 } 8598 else if (ch === '-') { 8599 if (last_to === '-') { 8600 to_chars_expanded.push('-'); 8601 to_chars_expanded.push('-'); 8602 } 8603 else if (i == to_length - 1) { 8604 to_chars_expanded.push('-'); 8605 } 8606 else { 8607 in_range = true; 8608 } 8609 } 8610 else if (in_range) { 8611 start = last_to.charCodeAt(0); 8612 end = ch.charCodeAt(0); 8613 if (start > end) { 8614 $Kernel.$raise($$$('ArgumentError'), "invalid range \"" + (String.fromCharCode(start)) + "-" + (String.fromCharCode(end)) + "\" in string transliteration"); 8615 } 8616 for (c = start + 1; c < end; c++) { 8617 to_chars_expanded.push(String.fromCharCode(c)); 8618 } 8619 to_chars_expanded.push(ch); 8620 in_range = null; 8621 last_to = null; 8622 } 8623 else { 8624 to_chars_expanded.push(ch); 8625 } 8626 } 8627 8628 to_chars = to_chars_expanded; 8629 to_length = to_chars.length; 8630 } 8631 8632 var length_diff = from_length - to_length; 8633 if (length_diff > 0) { 8634 var pad_char = (to_length > 0 ? to_chars[to_length - 1] : ''); 8635 for (i = 0; i < length_diff; i++) { 8636 to_chars.push(pad_char); 8637 } 8638 } 8639 8640 for (i = 0; i < from_length; i++) { 8641 subs[from_chars[i]] = to_chars[i]; 8642 } 8643 } 8644 8645 var new_str = ''; 8646 for (i = 0, length = self.length; i < length; i++) { 8647 ch = self.charAt(i); 8648 var sub = subs[ch]; 8649 if (inverse) { 8650 new_str += (sub == null ? global_sub : ch); 8651 } 8652 else { 8653 new_str += (sub != null ? sub : ch); 8654 } 8655 } 8656 return new_str; 8657 8658 }); 8659 8660 $def(self, '$tr_s', function $$tr_s(from, to) { 8661 var self = this; 8662 8663 8664 from = $coerce_to(from, $$$('String'), 'to_str').$to_s(); 8665 to = $coerce_to(to, $$$('String'), 'to_str').$to_s(); 8666 8667 if (from.length == 0) { 8668 return self; 8669 } 8670 8671 var i, in_range, c, ch, start, end, length; 8672 var subs = {}; 8673 var from_chars = from.split(''); 8674 var from_length = from_chars.length; 8675 var to_chars = to.split(''); 8676 var to_length = to_chars.length; 8677 8678 var inverse = false; 8679 var global_sub = null; 8680 if (from_chars[0] === '^' && from_chars.length > 1) { 8681 inverse = true; 8682 from_chars.shift(); 8683 global_sub = to_chars[to_length - 1]; 8684 from_length -= 1; 8685 } 8686 8687 var from_chars_expanded = []; 8688 var last_from = null; 8689 in_range = false; 8690 for (i = 0; i < from_length; i++) { 8691 ch = from_chars[i]; 8692 if (last_from == null) { 8693 last_from = ch; 8694 from_chars_expanded.push(ch); 8695 } 8696 else if (ch === '-') { 8697 if (last_from === '-') { 8698 from_chars_expanded.push('-'); 8699 from_chars_expanded.push('-'); 8700 } 8701 else if (i == from_length - 1) { 8702 from_chars_expanded.push('-'); 8703 } 8704 else { 8705 in_range = true; 8706 } 8707 } 8708 else if (in_range) { 8709 start = last_from.charCodeAt(0); 8710 end = ch.charCodeAt(0); 8711 if (start > end) { 8712 $Kernel.$raise($$$('ArgumentError'), "invalid range \"" + (String.fromCharCode(start)) + "-" + (String.fromCharCode(end)) + "\" in string transliteration"); 8713 } 8714 for (c = start + 1; c < end; c++) { 8715 from_chars_expanded.push(String.fromCharCode(c)); 8716 } 8717 from_chars_expanded.push(ch); 8718 in_range = null; 8719 last_from = null; 8720 } 8721 else { 8722 from_chars_expanded.push(ch); 8723 } 8724 } 8725 8726 from_chars = from_chars_expanded; 8727 from_length = from_chars.length; 8728 8729 if (inverse) { 8730 for (i = 0; i < from_length; i++) { 8731 subs[from_chars[i]] = true; 8732 } 8733 } 8734 else { 8735 if (to_length > 0) { 8736 var to_chars_expanded = []; 8737 var last_to = null; 8738 in_range = false; 8739 for (i = 0; i < to_length; i++) { 8740 ch = to_chars[i]; 8741 if (last_from == null) { 8742 last_from = ch; 8743 to_chars_expanded.push(ch); 8744 } 8745 else if (ch === '-') { 8746 if (last_to === '-') { 8747 to_chars_expanded.push('-'); 8748 to_chars_expanded.push('-'); 8749 } 8750 else if (i == to_length - 1) { 8751 to_chars_expanded.push('-'); 8752 } 8753 else { 8754 in_range = true; 8755 } 8756 } 8757 else if (in_range) { 8758 start = last_from.charCodeAt(0); 8759 end = ch.charCodeAt(0); 8760 if (start > end) { 8761 $Kernel.$raise($$$('ArgumentError'), "invalid range \"" + (String.fromCharCode(start)) + "-" + (String.fromCharCode(end)) + "\" in string transliteration"); 8762 } 8763 for (c = start + 1; c < end; c++) { 8764 to_chars_expanded.push(String.fromCharCode(c)); 8765 } 8766 to_chars_expanded.push(ch); 8767 in_range = null; 8768 last_from = null; 8769 } 8770 else { 8771 to_chars_expanded.push(ch); 8772 } 8773 } 8774 8775 to_chars = to_chars_expanded; 8776 to_length = to_chars.length; 8777 } 8778 8779 var length_diff = from_length - to_length; 8780 if (length_diff > 0) { 8781 var pad_char = (to_length > 0 ? to_chars[to_length - 1] : ''); 8782 for (i = 0; i < length_diff; i++) { 8783 to_chars.push(pad_char); 8784 } 8785 } 8786 8787 for (i = 0; i < from_length; i++) { 8788 subs[from_chars[i]] = to_chars[i]; 8789 } 8790 } 8791 var new_str = ''; 8792 var last_substitute = null; 8793 for (i = 0, length = self.length; i < length; i++) { 8794 ch = self.charAt(i); 8795 var sub = subs[ch]; 8796 if (inverse) { 8797 if (sub == null) { 8798 if (last_substitute == null) { 8799 new_str += global_sub; 8800 last_substitute = true; 8801 } 8802 } 8803 else { 8804 new_str += ch; 8805 last_substitute = null; 8806 } 8807 } 8808 else { 8809 if (sub != null) { 8810 if (last_substitute == null || last_substitute !== sub) { 8811 new_str += sub; 8812 last_substitute = sub; 8813 } 8814 } 8815 else { 8816 new_str += ch; 8817 last_substitute = null; 8818 } 8819 } 8820 } 8821 return new_str; 8822 8823 }); 8824 8825 $def(self, '$upcase', function $$upcase() { 8826 var self = this; 8827 8828 return self.toUpperCase(); 8829 }); 8830 8831 $def(self, '$upto', function $$upto(stop, excl) { 8832 var block = $$upto.$$p || nil, self = this; 8833 8834 $$upto.$$p = null; 8835 if (excl == null) excl = false; 8836 if (!(block !== nil)) { 8837 return self.$enum_for("upto", stop, excl) 8838 } 8839 var a, b, s = self.toString(); 8840 8841 stop = $coerce_to(stop, $$$('String'), 'to_str'); 8842 8843 if (s.length === 1 && stop.length === 1) { 8844 8845 a = s.charCodeAt(0); 8846 b = stop.charCodeAt(0); 8847 8848 while (a <= b) { 8849 if (excl && a === b) { 8850 break; 8851 } 8852 8853 block(String.fromCharCode(a)); 8854 8855 a += 1; 8856 } 8857 8858 } else if (parseInt(s, 10).toString() === s && parseInt(stop, 10).toString() === stop) { 8859 8860 a = parseInt(s, 10); 8861 b = parseInt(stop, 10); 8862 8863 while (a <= b) { 8864 if (excl && a === b) { 8865 break; 8866 } 8867 8868 block(a.toString()); 8869 8870 a += 1; 8871 } 8872 8873 } else { 8874 8875 while (s.length <= stop.length && s <= stop) { 8876 if (excl && s === stop) { 8877 break; 8878 } 8879 8880 block(s); 8881 8882 s = (s).$succ(); 8883 } 8884 8885 } 8886 return self; 8887 }, -2); 8888 8889 function char_class_from_char_sets(sets) { 8890 function explode_sequences_in_character_set(set) { 8891 var result = '', 8892 i, len = set.length, 8893 curr_char, 8894 skip_next_dash, 8895 char_code_from, 8896 char_code_upto, 8897 char_code; 8898 for (i = 0; i < len; i++) { 8899 curr_char = set.charAt(i); 8900 if (curr_char === '-' && i > 0 && i < (len - 1) && !skip_next_dash) { 8901 char_code_from = set.charCodeAt(i - 1); 8902 char_code_upto = set.charCodeAt(i + 1); 8903 if (char_code_from > char_code_upto) { 8904 $Kernel.$raise($$$('ArgumentError'), "invalid range \"" + (char_code_from) + "-" + (char_code_upto) + "\" in string transliteration"); 8905 } 8906 for (char_code = char_code_from + 1; char_code < char_code_upto + 1; char_code++) { 8907 result += String.fromCharCode(char_code); 8908 } 8909 skip_next_dash = true; 8910 i++; 8911 } else { 8912 skip_next_dash = (curr_char === '\\'); 8913 result += curr_char; 8914 } 8915 } 8916 return result; 8917 } 8918 8919 function intersection(setA, setB) { 8920 if (setA.length === 0) { 8921 return setB; 8922 } 8923 var result = '', 8924 i, len = setA.length, 8925 chr; 8926 for (i = 0; i < len; i++) { 8927 chr = setA.charAt(i); 8928 if (setB.indexOf(chr) !== -1) { 8929 result += chr; 8930 } 8931 } 8932 return result; 8933 } 8934 8935 var i, len, set, neg, chr, tmp, 8936 pos_intersection = '', 8937 neg_intersection = ''; 8938 8939 for (i = 0, len = sets.length; i < len; i++) { 8940 set = $coerce_to(sets[i], $$$('String'), 'to_str'); 8941 neg = (set.charAt(0) === '^' && set.length > 1); 8942 set = explode_sequences_in_character_set(neg ? set.slice(1) : set); 8943 if (neg) { 8944 neg_intersection = intersection(neg_intersection, set); 8945 } else { 8946 pos_intersection = intersection(pos_intersection, set); 8947 } 8948 } 8949 8950 if (pos_intersection.length > 0 && neg_intersection.length > 0) { 8951 tmp = ''; 8952 for (i = 0, len = pos_intersection.length; i < len; i++) { 8953 chr = pos_intersection.charAt(i); 8954 if (neg_intersection.indexOf(chr) === -1) { 8955 tmp += chr; 8956 } 8957 } 8958 pos_intersection = tmp; 8959 neg_intersection = ''; 8960 } 8961 8962 if (pos_intersection.length > 0) { 8963 return '[' + $$$('Regexp').$escape(pos_intersection) + ']'; 8964 } 8965 8966 if (neg_intersection.length > 0) { 8967 return '[^' + $$$('Regexp').$escape(neg_intersection) + ']'; 8968 } 8969 8970 return null; 8971 } 8972 8973 $def(self, '$instance_variables', function $$instance_variables() { 8974 8975 return [] 8976 }); 8977 $defs(self, '$_load', function $$_load($a) { 8978 var $post_args, args, self = this; 8979 8980 8981 $post_args = $slice(arguments); 8982 args = $post_args; 8983 return $send(self, 'new', $to_a(args)); 8984 }, -1); 8985 8986 $def(self, '$unicode_normalize', function $$unicode_normalize(form) { 8987 var self = this; 8988 8989 8990 if (form == null) form = "nfc"; 8991 if (!$truthy(["nfc", "nfd", "nfkc", "nfkd"]['$include?'](form))) { 8992 $Kernel.$raise($$$('ArgumentError'), "Invalid normalization form " + (form)); 8993 } return self.normalize(form.$upcase()); 8994 }, -1); 8995 8996 $def(self, '$unicode_normalized?', function $String_unicode_normalized$ques$18(form) { 8997 var self = this; 8998 8999 9000 if (form == null) form = "nfc"; 9001 return self.$unicode_normalize(form)['$=='](self); 9002 }, -1); 9003 9004 $def(self, '$unpack', function $$unpack(format) { 9005 9006 return $Kernel.$raise("To use String#unpack, you must first require 'corelib/string/unpack'.") 9007 }); 9008 9009 $def(self, '$unpack1', function $$unpack1(format) { 9010 9011 return $Kernel.$raise("To use String#unpack1, you must first require 'corelib/string/unpack'.") 9012 }); 9013 9014 $def(self, '$freeze', function $$freeze() { 9015 var self = this; 9016 9017 9018 if (typeof self === 'string') { return self; } 9019 $prop(self, "$$frozen", true); 9020 return self; 9021 9022 }); 9023 9024 $def(self, '$-@', function $String_$minus$$19() { 9025 var self = this; 9026 9027 9028 if (typeof self === 'string') return self; 9029 if (self.$$frozen) return self; 9030 if (self.encoding.name == 'UTF-8' && self.internal_encoding.name == 'UTF-8') return self.toString(); 9031 return self.$dup().$freeze(); 9032 9033 }); 9034 9035 $def(self, '$frozen?', function $String_frozen$ques$20() { 9036 var self = this; 9037 9038 return typeof self === 'string' || self.$$frozen === true; 9039 }); 9040 $alias(self, "+@", "dup"); 9041 $alias(self, "===", "=="); 9042 $alias(self, "byteslice", "[]"); 9043 $alias(self, "eql?", "=="); 9044 $alias(self, "equal?", "==="); 9045 $alias(self, "object_id", "__id__"); 9046 $alias(self, "slice", "[]"); 9047 $alias(self, "succ", "next"); 9048 $alias(self, "to_str", "to_s"); 9049 $alias(self, "to_sym", "intern"); 9050 return $Opal.$pristine(self, "initialize"); 9051 })('::', String, $nesting); 9052 return $const_set($nesting[0], 'Symbol', $$('String')); 9053}; 9054 9055Opal.modules["corelib/enumerable"] = function(Opal) {/* Generated by Opal 1.7.3 */ 9056 var $truthy = Opal.truthy, $coerce_to = Opal.coerce_to, $yield1 = Opal.yield1, $yieldX = Opal.yieldX, $deny_frozen_access = Opal.deny_frozen_access, $module = Opal.module, $send = Opal.send, $slice = Opal.slice, $to_a = Opal.to_a, $Opal = Opal.Opal, $thrower = Opal.thrower, $def = Opal.def, $Kernel = Opal.Kernel, $return_val = Opal.return_val, $rb_gt = Opal.rb_gt, $rb_times = Opal.rb_times, $rb_lt = Opal.rb_lt, $eqeq = Opal.eqeq, $rb_plus = Opal.rb_plus, $rb_minus = Opal.rb_minus, $rb_divide = Opal.rb_divide, $rb_le = Opal.rb_le, $hash2 = Opal.hash2, $lambda = Opal.lambda, $not = Opal.not, $alias = Opal.alias, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 9057 9058 Opal.add_stubs('each,public_send,destructure,to_enum,enumerator_size,new,yield,raise,slice_when,!,enum_for,flatten,map,to_proc,compact,to_a,warn,proc,==,nil?,respond_to?,coerce_to!,>,*,try_convert,<,+,-,ceil,/,size,select,__send__,length,<=,[],push,<<,[]=,===,inspect,<=>,first,reverse,sort,take,sort_by,compare,call,dup,sort!,map!,include?,-@,key?,values,transform_values,group_by,fetch,to_h,coerce_to?,class,zip,detect,find_all,collect_concat,collect,inject,entries'); 9059 return (function($base, $parent_nesting) { 9060 var self = $module($base, 'Enumerable'); 9061 9062 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 9063 9064 9065 9066 function comparableForPattern(value) { 9067 if (value.length === 0) { 9068 value = [nil]; 9069 } 9070 9071 if (value.length > 1) { 9072 value = [value]; 9073 } 9074 9075 return value; 9076 } 9077 9078 $def(self, '$all?', function $Enumerable_all$ques$1(pattern) {try { var $t_return = $thrower('return'); 9079 var block = $Enumerable_all$ques$1.$$p || nil, self = this; 9080 9081 $Enumerable_all$ques$1.$$p = null; 9082 9083 ; 9084 ; 9085 if ($truthy(pattern !== undefined)) { 9086 $send(self, 'each', [], function $$2($a){var $post_args, value, comparable = nil; 9087 9088 9089 $post_args = $slice(arguments); 9090 value = $post_args; 9091 comparable = comparableForPattern(value); 9092 if ($truthy($send(pattern, 'public_send', ["==="].concat($to_a(comparable))))) { 9093 return nil 9094 } else { 9095 $t_return.$throw(false); 9096 };}, {$$arity: -1, $$ret: $t_return}); 9097 } else if ((block !== nil)) { 9098 $send(self, 'each', [], function $$3($a){var $post_args, value; 9099 9100 9101 $post_args = $slice(arguments); 9102 value = $post_args; 9103 if ($truthy(Opal.yieldX(block, $to_a(value)))) { 9104 return nil 9105 } else { 9106 $t_return.$throw(false); 9107 };}, {$$arity: -1, $$ret: $t_return}); 9108 } else { 9109 $send(self, 'each', [], function $$4($a){var $post_args, value; 9110 9111 9112 $post_args = $slice(arguments); 9113 value = $post_args; 9114 if ($truthy($Opal.$destructure(value))) { 9115 return nil 9116 } else { 9117 $t_return.$throw(false); 9118 };}, {$$arity: -1, $$ret: $t_return}); 9119 }; 9120 return true;} catch($e) { 9121 if ($e === $t_return) return $e.$v; 9122 throw $e; 9123 } 9124 }, -1); 9125 9126 $def(self, '$any?', function $Enumerable_any$ques$5(pattern) {try { var $t_return = $thrower('return'); 9127 var block = $Enumerable_any$ques$5.$$p || nil, self = this; 9128 9129 $Enumerable_any$ques$5.$$p = null; 9130 9131 ; 9132 ; 9133 if ($truthy(pattern !== undefined)) { 9134 $send(self, 'each', [], function $$6($a){var $post_args, value, comparable = nil; 9135 9136 9137 $post_args = $slice(arguments); 9138 value = $post_args; 9139 comparable = comparableForPattern(value); 9140 if ($truthy($send(pattern, 'public_send', ["==="].concat($to_a(comparable))))) { 9141 $t_return.$throw(true); 9142 } else { 9143 return nil 9144 };}, {$$arity: -1, $$ret: $t_return}); 9145 } else if ((block !== nil)) { 9146 $send(self, 'each', [], function $$7($a){var $post_args, value; 9147 9148 9149 $post_args = $slice(arguments); 9150 value = $post_args; 9151 if ($truthy(Opal.yieldX(block, $to_a(value)))) { 9152 $t_return.$throw(true); 9153 } else { 9154 return nil 9155 };}, {$$arity: -1, $$ret: $t_return}); 9156 } else { 9157 $send(self, 'each', [], function $$8($a){var $post_args, value; 9158 9159 9160 $post_args = $slice(arguments); 9161 value = $post_args; 9162 if ($truthy($Opal.$destructure(value))) { 9163 $t_return.$throw(true); 9164 } else { 9165 return nil 9166 };}, {$$arity: -1, $$ret: $t_return}); 9167 }; 9168 return false;} catch($e) { 9169 if ($e === $t_return) return $e.$v; 9170 throw $e; 9171 } 9172 }, -1); 9173 9174 $def(self, '$chunk', function $$chunk() { 9175 var block = $$chunk.$$p || nil, self = this; 9176 9177 $$chunk.$$p = null; 9178 if (!(block !== nil)) { 9179 return $send(self, 'to_enum', ["chunk"], function $$9(){var self = $$9.$$s == null ? this : $$9.$$s; 9180 9181 return self.$enumerator_size()}, {$$s: self}) 9182 } return $send($$$('Enumerator'), 'new', [], function $$10(yielder){var self = $$10.$$s == null ? this : $$10.$$s; 9183 9184 9185 if (yielder == null) yielder = nil; 9186 9187 var previous = nil, accumulate = []; 9188 9189 function releaseAccumulate() { 9190 if (accumulate.length > 0) { 9191 yielder.$yield(previous, accumulate); 9192 } 9193 } 9194 9195 self.$each.$$p = function(value) { 9196 var key = $yield1(block, value); 9197 9198 if (key === nil) { 9199 releaseAccumulate(); 9200 accumulate = []; 9201 previous = nil; 9202 } else { 9203 if (previous === nil || previous === key) { 9204 accumulate.push(value); 9205 } else { 9206 releaseAccumulate(); 9207 accumulate = [value]; 9208 } 9209 9210 previous = key; 9211 } 9212 }; 9213 9214 self.$each(); 9215 9216 releaseAccumulate(); 9217}, {$$s: self}); 9218 }); 9219 9220 $def(self, '$chunk_while', function $$chunk_while() { 9221 var block = $$chunk_while.$$p || nil, self = this; 9222 9223 $$chunk_while.$$p = null; 9224 if (!(block !== nil)) { 9225 $Kernel.$raise($$$('ArgumentError'), "no block given"); 9226 } return $send(self, 'slice_when', [], function $$11(before, after){ 9227 9228 if (before == null) before = nil; 9229 if (after == null) after = nil; 9230 return Opal.yieldX(block, [before, after])['$!']();}); 9231 }); 9232 9233 $def(self, '$collect', function $$collect() { 9234 var block = $$collect.$$p || nil, self = this; 9235 9236 $$collect.$$p = null; 9237 if (!(block !== nil)) { 9238 return $send(self, 'enum_for', ["collect"], function $$12(){var self = $$12.$$s == null ? this : $$12.$$s; 9239 9240 return self.$enumerator_size()}, {$$s: self}) 9241 } 9242 var result = []; 9243 9244 self.$each.$$p = function() { 9245 var value = $yieldX(block, arguments); 9246 9247 result.push(value); 9248 }; 9249 9250 self.$each(); 9251 9252 return result; 9253 }); 9254 9255 $def(self, '$collect_concat', function $$collect_concat() { 9256 var block = $$collect_concat.$$p || nil, self = this; 9257 9258 $$collect_concat.$$p = null; 9259 if (!(block !== nil)) { 9260 return $send(self, 'enum_for', ["collect_concat"], function $$13(){var self = $$13.$$s == null ? this : $$13.$$s; 9261 9262 return self.$enumerator_size()}, {$$s: self}) 9263 } return $send(self, 'map', [], block.$to_proc()).$flatten(1); 9264 }); 9265 9266 $def(self, '$compact', function $$compact() { 9267 var self = this; 9268 9269 return self.$to_a().$compact() 9270 }); 9271 9272 $def(self, '$count', function $$count(object) { 9273 var block = $$count.$$p || nil, self = this, result = nil; 9274 9275 $$count.$$p = null; 9276 result = 0; 9277 9278 if (object != null && block !== nil) { 9279 self.$warn("warning: given block not used"); 9280 } 9281 if ($truthy(object != null)) { 9282 block = $send($Kernel, 'proc', [], function $$14($a){var $post_args, args; 9283 9284 9285 $post_args = $slice(arguments); 9286 args = $post_args; 9287 return $Opal.$destructure(args)['$=='](object);}, -1); 9288 } else if ($truthy(block['$nil?']())) { 9289 block = $send($Kernel, 'proc', [], $return_val(true)); 9290 } $send(self, 'each', [], function $$15($a){var $post_args, args; 9291 9292 9293 $post_args = $slice(arguments); 9294 args = $post_args; 9295 if ($truthy($yieldX(block, args))) { 9296 return result++; 9297 } else { 9298 return nil 9299 }}, -1); 9300 return result; 9301 }, -1); 9302 9303 $def(self, '$cycle', function $$cycle(n) { 9304 var block = $$cycle.$$p || nil, self = this; 9305 9306 $$cycle.$$p = null; 9307 if (n == null) n = nil; 9308 if (!(block !== nil)) { 9309 return $send(self, 'enum_for', ["cycle", n], function $$16(){var self = $$16.$$s == null ? this : $$16.$$s; 9310 9311 if ($truthy(n['$nil?']())) { 9312 if ($truthy(self['$respond_to?']("size"))) { 9313 return $$$($$$('Float'), 'INFINITY') 9314 } else { 9315 return nil 9316 } 9317 } else { 9318 9319 n = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int"); 9320 if ($truthy($rb_gt(n, 0))) { 9321 return $rb_times(self.$enumerator_size(), n) 9322 } else { 9323 return 0 9324 } }}, {$$s: self}) 9325 } if (!$truthy(n['$nil?']())) { 9326 9327 n = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int"); 9328 if ($truthy(n <= 0)) { 9329 return nil 9330 } } 9331 var all = [], i, length; 9332 9333 self.$each.$$p = function() { 9334 var param = $Opal.$destructure(arguments); 9335 $yield1(block, param); 9336 9337 all.push(param); 9338 }; 9339 9340 self.$each(); 9341 9342 if (all.length === 0) { 9343 return nil; 9344 } 9345 9346 if (n === nil) { 9347 while (true) { 9348 for (i = 0, length = all.length; i < length; i++) { 9349 $yield1(block, all[i]); 9350 } 9351 } 9352 } 9353 else { 9354 while (n > 1) { 9355 for (i = 0, length = all.length; i < length; i++) { 9356 $yield1(block, all[i]); 9357 } 9358 9359 n--; 9360 } 9361 } 9362 }, -1); 9363 9364 $def(self, '$detect', function $$detect(ifnone) {try { var $t_return = $thrower('return'); 9365 var block = $$detect.$$p || nil, self = this; 9366 9367 $$detect.$$p = null; 9368 9369 ; 9370 ; 9371 if (!(block !== nil)) { 9372 return self.$enum_for("detect", ifnone) 9373 }; 9374 $send(self, 'each', [], function $$17($a){var $post_args, args, value = nil; 9375 9376 9377 $post_args = $slice(arguments); 9378 args = $post_args; 9379 value = $Opal.$destructure(args); 9380 if ($truthy(Opal.yield1(block, value))) { 9381 $t_return.$throw(value); 9382 } else { 9383 return nil 9384 };}, {$$arity: -1, $$ret: $t_return}); 9385 9386 if (ifnone !== undefined) { 9387 if (typeof(ifnone) === 'function') { 9388 return ifnone(); 9389 } else { 9390 return ifnone; 9391 } 9392 } 9393 ; 9394 return nil;} catch($e) { 9395 if ($e === $t_return) return $e.$v; 9396 throw $e; 9397 } 9398 }, -1); 9399 9400 $def(self, '$drop', function $$drop(number) { 9401 var self = this; 9402 9403 9404 number = $coerce_to(number, $$$('Integer'), 'to_int'); 9405 if ($truthy(number < 0)) { 9406 $Kernel.$raise($$$('ArgumentError'), "attempt to drop negative size"); 9407 } 9408 var result = [], 9409 current = 0; 9410 9411 self.$each.$$p = function() { 9412 if (number <= current) { 9413 result.push($Opal.$destructure(arguments)); 9414 } 9415 9416 current++; 9417 }; 9418 9419 self.$each(); 9420 9421 return result; 9422 }); 9423 9424 $def(self, '$drop_while', function $$drop_while() { 9425 var block = $$drop_while.$$p || nil, self = this; 9426 9427 $$drop_while.$$p = null; 9428 if (!(block !== nil)) { 9429 return self.$enum_for("drop_while") 9430 } 9431 var result = [], 9432 dropping = true; 9433 9434 self.$each.$$p = function() { 9435 var param = $Opal.$destructure(arguments); 9436 9437 if (dropping) { 9438 var value = $yield1(block, param); 9439 9440 if (!$truthy(value)) { 9441 dropping = false; 9442 result.push(param); 9443 } 9444 } 9445 else { 9446 result.push(param); 9447 } 9448 }; 9449 9450 self.$each(); 9451 9452 return result; 9453 }); 9454 9455 $def(self, '$each_cons', function $$each_cons(n) { 9456 var block = $$each_cons.$$p || nil, self = this; 9457 9458 $$each_cons.$$p = null; 9459 if ($truthy(arguments.length != 1)) { 9460 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (arguments.length) + " for 1)"); 9461 } n = $Opal.$try_convert(n, $$$('Integer'), "to_int"); 9462 if ($truthy(n <= 0)) { 9463 $Kernel.$raise($$$('ArgumentError'), "invalid size"); 9464 } if (!(block !== nil)) { 9465 return $send(self, 'enum_for', ["each_cons", n], function $$18(){var self = $$18.$$s == null ? this : $$18.$$s, enum_size = nil; 9466 9467 9468 enum_size = self.$enumerator_size(); 9469 if ($truthy(enum_size['$nil?']())) { 9470 return nil 9471 } else if (($eqeq(enum_size, 0) || ($truthy($rb_lt(enum_size, n))))) { 9472 return 0 9473 } else { 9474 return $rb_plus($rb_minus(enum_size, n), 1) 9475 }}, {$$s: self}) 9476 } 9477 var buffer = []; 9478 9479 self.$each.$$p = function() { 9480 var element = $Opal.$destructure(arguments); 9481 buffer.push(element); 9482 if (buffer.length > n) { 9483 buffer.shift(); 9484 } 9485 if (buffer.length == n) { 9486 $yield1(block, buffer.slice(0, n)); 9487 } 9488 }; 9489 9490 self.$each(); 9491 9492 return self; 9493 }); 9494 9495 $def(self, '$each_entry', function $$each_entry($a) { 9496 var block = $$each_entry.$$p || nil, $post_args, data, self = this; 9497 9498 $$each_entry.$$p = null; 9499 $post_args = $slice(arguments); 9500 data = $post_args; 9501 if (!(block !== nil)) { 9502 return $send(self, 'to_enum', ["each_entry"].concat($to_a(data)), function $$19(){var self = $$19.$$s == null ? this : $$19.$$s; 9503 9504 return self.$enumerator_size()}, {$$s: self}) 9505 } 9506 self.$each.$$p = function() { 9507 var item = $Opal.$destructure(arguments); 9508 9509 $yield1(block, item); 9510 }; 9511 9512 self.$each.apply(self, data); 9513 9514 return self; 9515 }, -1); 9516 9517 $def(self, '$each_slice', function $$each_slice(n) { 9518 var block = $$each_slice.$$p || nil, self = this; 9519 9520 $$each_slice.$$p = null; 9521 n = $coerce_to(n, $$$('Integer'), 'to_int'); 9522 if ($truthy(n <= 0)) { 9523 $Kernel.$raise($$$('ArgumentError'), "invalid slice size"); 9524 } if (!(block !== nil)) { 9525 return $send(self, 'enum_for', ["each_slice", n], function $$20(){var self = $$20.$$s == null ? this : $$20.$$s; 9526 9527 if ($truthy(self['$respond_to?']("size"))) { 9528 return $rb_divide(self.$size(), n).$ceil() 9529 } else { 9530 return nil 9531 }}, {$$s: self}) 9532 } 9533 var slice = []; 9534 9535 self.$each.$$p = function() { 9536 var param = $Opal.$destructure(arguments); 9537 9538 slice.push(param); 9539 9540 if (slice.length === n) { 9541 $yield1(block, slice); 9542 slice = []; 9543 } 9544 }; 9545 9546 self.$each(); 9547 9548 // our "last" group, if smaller than n then won't have been yielded 9549 if (slice.length > 0) { 9550 $yield1(block, slice); 9551 } 9552 return self; 9553 }); 9554 9555 $def(self, '$each_with_index', function $$each_with_index($a) { 9556 var block = $$each_with_index.$$p || nil, $post_args, args, self = this; 9557 9558 $$each_with_index.$$p = null; 9559 $post_args = $slice(arguments); 9560 args = $post_args; 9561 if (!(block !== nil)) { 9562 return $send(self, 'enum_for', ["each_with_index"].concat($to_a(args)), function $$21(){var self = $$21.$$s == null ? this : $$21.$$s; 9563 9564 return self.$enumerator_size()}, {$$s: self}) 9565 } 9566 var index = 0; 9567 9568 self.$each.$$p = function() { 9569 var param = $Opal.$destructure(arguments); 9570 9571 block(param, index); 9572 9573 index++; 9574 }; 9575 9576 self.$each.apply(self, args); 9577 return self; 9578 }, -1); 9579 9580 $def(self, '$each_with_object', function $$each_with_object(object) { 9581 var block = $$each_with_object.$$p || nil, self = this; 9582 9583 $$each_with_object.$$p = null; 9584 if (!(block !== nil)) { 9585 return $send(self, 'enum_for', ["each_with_object", object], function $$22(){var self = $$22.$$s == null ? this : $$22.$$s; 9586 9587 return self.$enumerator_size()}, {$$s: self}) 9588 } 9589 self.$each.$$p = function() { 9590 var param = $Opal.$destructure(arguments); 9591 9592 block(param, object); 9593 }; 9594 9595 self.$each(); 9596 return object; 9597 }); 9598 9599 $def(self, '$entries', function $$entries($a) { 9600 var $post_args, args, self = this; 9601 9602 9603 $post_args = $slice(arguments); 9604 args = $post_args; 9605 9606 var result = []; 9607 9608 self.$each.$$p = function() { 9609 result.push($Opal.$destructure(arguments)); 9610 }; 9611 9612 self.$each.apply(self, args); 9613 9614 return result; 9615 }, -1); 9616 9617 $def(self, '$filter_map', function $$filter_map() { 9618 var block = $$filter_map.$$p || nil, self = this; 9619 9620 $$filter_map.$$p = null; 9621 if (!(block !== nil)) { 9622 return $send(self, 'enum_for', ["filter_map"], function $$23(){var self = $$23.$$s == null ? this : $$23.$$s; 9623 9624 return self.$enumerator_size()}, {$$s: self}) 9625 } return $send($send(self, 'map', [], block.$to_proc()), 'select', [], "itself".$to_proc()); 9626 }); 9627 9628 $def(self, '$find_all', function $$find_all() { 9629 var block = $$find_all.$$p || nil, self = this; 9630 9631 $$find_all.$$p = null; 9632 if (!(block !== nil)) { 9633 return $send(self, 'enum_for', ["find_all"], function $$24(){var self = $$24.$$s == null ? this : $$24.$$s; 9634 9635 return self.$enumerator_size()}, {$$s: self}) 9636 } 9637 var result = []; 9638 9639 self.$each.$$p = function() { 9640 var param = $Opal.$destructure(arguments), 9641 value = $yield1(block, param); 9642 9643 if ($truthy(value)) { 9644 result.push(param); 9645 } 9646 }; 9647 9648 self.$each(); 9649 9650 return result; 9651 }); 9652 9653 $def(self, '$find_index', function $$find_index(object) {try { var $t_return = $thrower('return'); 9654 var block = $$find_index.$$p || nil, self = this, index = nil; 9655 9656 $$find_index.$$p = null; 9657 9658 ; 9659 ; 9660 if ($truthy(object === undefined && block === nil)) { 9661 return self.$enum_for("find_index") 9662 }; 9663 9664 if (object != null && block !== nil) { 9665 self.$warn("warning: given block not used"); 9666 } 9667 ; 9668 index = 0; 9669 if ($truthy(object != null)) { 9670 $send(self, 'each', [], function $$25($a){var $post_args, value; 9671 9672 9673 $post_args = $slice(arguments); 9674 value = $post_args; 9675 if ($eqeq($Opal.$destructure(value), object)) { 9676 $t_return.$throw(index); 9677 }; 9678 return index += 1;;}, {$$arity: -1, $$ret: $t_return}); 9679 } else { 9680 $send(self, 'each', [], function $$26($a){var $post_args, value; 9681 9682 9683 $post_args = $slice(arguments); 9684 value = $post_args; 9685 if ($truthy(Opal.yieldX(block, $to_a(value)))) { 9686 $t_return.$throw(index); 9687 }; 9688 return index += 1;;}, {$$arity: -1, $$ret: $t_return}); 9689 }; 9690 return nil;} catch($e) { 9691 if ($e === $t_return) return $e.$v; 9692 throw $e; 9693 } 9694 }, -1); 9695 9696 $def(self, '$first', function $$first(number) {try { var $t_return = $thrower('return'); 9697 var self = this, result = nil, current = nil; 9698 9699 9700 ; 9701 if ($truthy(number === undefined)) { 9702 return $send(self, 'each', [], function $$27(value){ 9703 9704 if (value == null) value = nil; 9705 $t_return.$throw(value);}, {$$ret: $t_return}) 9706 } else { 9707 9708 result = []; 9709 number = $coerce_to(number, $$$('Integer'), 'to_int'); 9710 if ($truthy(number < 0)) { 9711 $Kernel.$raise($$$('ArgumentError'), "attempt to take negative size"); 9712 }; 9713 if ($truthy(number == 0)) { 9714 return [] 9715 }; 9716 current = 0; 9717 $send(self, 'each', [], function $$28($a){var $post_args, args; 9718 9719 9720 $post_args = $slice(arguments); 9721 args = $post_args; 9722 result.push($Opal.$destructure(args)); 9723 if ($truthy(number <= ++current)) { 9724 $t_return.$throw(result); 9725 } else { 9726 return nil 9727 };}, {$$arity: -1, $$ret: $t_return}); 9728 return result; 9729 };} catch($e) { 9730 if ($e === $t_return) return $e.$v; 9731 throw $e; 9732 } 9733 }, -1); 9734 9735 $def(self, '$grep', function $$grep(pattern) { 9736 var block = $$grep.$$p || nil, self = this, result = nil; 9737 9738 $$grep.$$p = null; 9739 result = []; 9740 $send(self, 'each', [], function $$29($a){var $post_args, value, cmp = nil; 9741 9742 9743 $post_args = $slice(arguments); 9744 value = $post_args; 9745 cmp = comparableForPattern(value); 9746 if (!$truthy($send(pattern, '__send__', ["==="].concat($to_a(cmp))))) { 9747 return nil 9748 } if ((block !== nil)) { 9749 9750 if ($truthy($rb_gt(value.$length(), 1))) { 9751 value = [value]; 9752 } value = Opal.yieldX(block, $to_a(value)); 9753 } else if ($truthy($rb_le(value.$length(), 1))) { 9754 value = value['$[]'](0); 9755 } return result.$push(value);}, -1); 9756 return result; 9757 }); 9758 9759 $def(self, '$grep_v', function $$grep_v(pattern) { 9760 var block = $$grep_v.$$p || nil, self = this, result = nil; 9761 9762 $$grep_v.$$p = null; 9763 result = []; 9764 $send(self, 'each', [], function $$30($a){var $post_args, value, cmp = nil; 9765 9766 9767 $post_args = $slice(arguments); 9768 value = $post_args; 9769 cmp = comparableForPattern(value); 9770 if ($truthy($send(pattern, '__send__', ["==="].concat($to_a(cmp))))) { 9771 return nil 9772 } if ((block !== nil)) { 9773 9774 if ($truthy($rb_gt(value.$length(), 1))) { 9775 value = [value]; 9776 } value = Opal.yieldX(block, $to_a(value)); 9777 } else if ($truthy($rb_le(value.$length(), 1))) { 9778 value = value['$[]'](0); 9779 } return result.$push(value);}, -1); 9780 return result; 9781 }); 9782 9783 $def(self, '$group_by', function $$group_by() { 9784 var block = $$group_by.$$p || nil, $a, self = this, hash = nil, $ret_or_1 = nil; 9785 9786 $$group_by.$$p = null; 9787 if (!(block !== nil)) { 9788 return $send(self, 'enum_for', ["group_by"], function $$31(){var self = $$31.$$s == null ? this : $$31.$$s; 9789 9790 return self.$enumerator_size()}, {$$s: self}) 9791 } hash = $hash2([], {}); 9792 9793 self.$each.$$p = function() { 9794 var param = $Opal.$destructure(arguments), 9795 value = $yield1(block, param); 9796 9797 ($truthy(($ret_or_1 = hash['$[]'](value))) ? ($ret_or_1) : (($a = [value, []], $send(hash, '[]=', $a), $a[$a.length - 1])))['$<<'](param); 9798 }; 9799 9800 self.$each(); 9801 return hash; 9802 }); 9803 9804 $def(self, '$include?', function $Enumerable_include$ques$32(obj) {try { var $t_return = $thrower('return'); 9805 var self = this; 9806 9807 9808 $send(self, 'each', [], function $$33($a){var $post_args, args; 9809 9810 9811 $post_args = $slice(arguments); 9812 args = $post_args; 9813 if ($eqeq($Opal.$destructure(args), obj)) { 9814 $t_return.$throw(true); 9815 } else { 9816 return nil 9817 };}, {$$arity: -1, $$ret: $t_return}); 9818 return false;} catch($e) { 9819 if ($e === $t_return) return $e.$v; 9820 throw $e; 9821 } 9822 }); 9823 9824 $def(self, '$inject', function $$inject(object, sym) { 9825 var block = $$inject.$$p || nil, self = this; 9826 9827 $$inject.$$p = null; 9828 9829 var result = object; 9830 9831 if (block !== nil && sym === undefined) { 9832 self.$each.$$p = function() { 9833 var value = $Opal.$destructure(arguments); 9834 9835 if (result === undefined) { 9836 result = value; 9837 return; 9838 } 9839 9840 value = $yieldX(block, [result, value]); 9841 9842 result = value; 9843 }; 9844 } 9845 else { 9846 if (sym === undefined) { 9847 if (!$$$('Symbol')['$==='](object)) { 9848 $Kernel.$raise($$$('TypeError'), "" + (object.$inspect()) + " is not a Symbol"); 9849 } 9850 9851 sym = object; 9852 result = undefined; 9853 } 9854 9855 self.$each.$$p = function() { 9856 var value = $Opal.$destructure(arguments); 9857 9858 if (result === undefined) { 9859 result = value; 9860 return; 9861 } 9862 9863 result = (result).$__send__(sym, value); 9864 }; 9865 } 9866 9867 self.$each(); 9868 9869 return result == undefined ? nil : result; 9870 }, -1); 9871 9872 $def(self, '$lazy', function $$lazy() { 9873 var self = this; 9874 9875 return $send($$$($$$('Enumerator'), 'Lazy'), 'new', [self, self.$enumerator_size()], function $$34(enum$, $a){var $post_args, args; 9876 9877 9878 if (enum$ == null) enum$ = nil; 9879 $post_args = $slice(arguments, 1); 9880 args = $post_args; 9881 return $send(enum$, 'yield', $to_a(args));}, -2) 9882 }); 9883 9884 $def(self, '$enumerator_size', function $$enumerator_size() { 9885 var self = this; 9886 9887 if ($truthy(self['$respond_to?']("size"))) { 9888 return self.$size() 9889 } else { 9890 return nil 9891 } 9892 }); 9893 9894 $def(self, '$max', function $$max(n) { 9895 var block = $$max.$$p || nil, self = this; 9896 9897 $$max.$$p = null; 9898 9899 if (n === undefined || n === nil) { 9900 var result, value; 9901 9902 self.$each.$$p = function() { 9903 var item = $Opal.$destructure(arguments); 9904 9905 if (result === undefined) { 9906 result = item; 9907 return; 9908 } 9909 9910 if (block !== nil) { 9911 value = $yieldX(block, [item, result]); 9912 } else { 9913 value = (item)['$<=>'](result); 9914 } 9915 9916 if (value === nil) { 9917 $Kernel.$raise($$$('ArgumentError'), "comparison failed"); 9918 } 9919 9920 if (value > 0) { 9921 result = item; 9922 } 9923 }; 9924 9925 self.$each(); 9926 9927 if (result === undefined) { 9928 return nil; 9929 } else { 9930 return result; 9931 } 9932 } 9933 9934 n = $coerce_to(n, $$$('Integer'), 'to_int'); 9935 return $send(self, 'sort', [], block.$to_proc()).$reverse().$first(n); 9936 }, -1); 9937 9938 $def(self, '$max_by', function $$max_by(n) { 9939 var block = $$max_by.$$p || nil, self = this; 9940 9941 $$max_by.$$p = null; 9942 if (n == null) n = nil; 9943 if (!$truthy(block)) { 9944 return $send(self, 'enum_for', ["max_by", n], function $$35(){var self = $$35.$$s == null ? this : $$35.$$s; 9945 9946 return self.$enumerator_size()}, {$$s: self}) 9947 } if (!$truthy(n['$nil?']())) { 9948 return $send(self, 'sort_by', [], block.$to_proc()).$reverse().$take(n) 9949 } 9950 var result, 9951 by; 9952 9953 self.$each.$$p = function() { 9954 var param = $Opal.$destructure(arguments), 9955 value = $yield1(block, param); 9956 9957 if (result === undefined) { 9958 result = param; 9959 by = value; 9960 return; 9961 } 9962 9963 if ((value)['$<=>'](by) > 0) { 9964 result = param; 9965 by = value; 9966 } 9967 }; 9968 9969 self.$each(); 9970 9971 return result === undefined ? nil : result; 9972 }, -1); 9973 9974 $def(self, '$min', function $$min(n) { 9975 var block = $$min.$$p || nil, self = this; 9976 9977 $$min.$$p = null; 9978 if (n == null) n = nil; 9979 if (!$truthy(n['$nil?']())) { 9980 if ((block !== nil)) { 9981 return $send(self, 'sort', [], function $$36(a, b){ 9982 9983 if (a == null) a = nil; 9984 if (b == null) b = nil; 9985 return Opal.yieldX(block, [a, b]);}).$take(n) 9986 } else { 9987 return self.$sort().$take(n) 9988 } 9989 } 9990 var result; 9991 9992 if (block !== nil) { 9993 self.$each.$$p = function() { 9994 var param = $Opal.$destructure(arguments); 9995 9996 if (result === undefined) { 9997 result = param; 9998 return; 9999 } 10000 10001 var value = block(param, result); 10002 10003 if (value === nil) { 10004 $Kernel.$raise($$$('ArgumentError'), "comparison failed"); 10005 } 10006 10007 if (value < 0) { 10008 result = param; 10009 } 10010 }; 10011 } 10012 else { 10013 self.$each.$$p = function() { 10014 var param = $Opal.$destructure(arguments); 10015 10016 if (result === undefined) { 10017 result = param; 10018 return; 10019 } 10020 10021 if ($Opal.$compare(param, result) < 0) { 10022 result = param; 10023 } 10024 }; 10025 } 10026 10027 self.$each(); 10028 10029 return result === undefined ? nil : result; 10030 }, -1); 10031 10032 $def(self, '$min_by', function $$min_by(n) { 10033 var block = $$min_by.$$p || nil, self = this; 10034 10035 $$min_by.$$p = null; 10036 if (n == null) n = nil; 10037 if (!$truthy(block)) { 10038 return $send(self, 'enum_for', ["min_by", n], function $$37(){var self = $$37.$$s == null ? this : $$37.$$s; 10039 10040 return self.$enumerator_size()}, {$$s: self}) 10041 } if (!$truthy(n['$nil?']())) { 10042 return $send(self, 'sort_by', [], block.$to_proc()).$take(n) 10043 } 10044 var result, 10045 by; 10046 10047 self.$each.$$p = function() { 10048 var param = $Opal.$destructure(arguments), 10049 value = $yield1(block, param); 10050 10051 if (result === undefined) { 10052 result = param; 10053 by = value; 10054 return; 10055 } 10056 10057 if ((value)['$<=>'](by) < 0) { 10058 result = param; 10059 by = value; 10060 } 10061 }; 10062 10063 self.$each(); 10064 10065 return result === undefined ? nil : result; 10066 }, -1); 10067 10068 $def(self, '$minmax', function $$minmax() { 10069 var block = $$minmax.$$p || nil, self = this, $ret_or_1 = nil; 10070 10071 $$minmax.$$p = null; 10072 block = ($truthy(($ret_or_1 = block)) ? ($ret_or_1) : ($send($Kernel, 'proc', [], function $$38(a, b){ 10073 10074 if (a == null) a = nil; 10075 if (b == null) b = nil; 10076 return a['$<=>'](b);}))); 10077 10078 var min = nil, max = nil, first_time = true; 10079 10080 self.$each.$$p = function() { 10081 var element = $Opal.$destructure(arguments); 10082 if (first_time) { 10083 min = max = element; 10084 first_time = false; 10085 } else { 10086 var min_cmp = block.$call(min, element); 10087 10088 if (min_cmp === nil) { 10089 $Kernel.$raise($$$('ArgumentError'), "comparison failed"); 10090 } else if (min_cmp > 0) { 10091 min = element; 10092 } 10093 10094 var max_cmp = block.$call(max, element); 10095 10096 if (max_cmp === nil) { 10097 $Kernel.$raise($$$('ArgumentError'), "comparison failed"); 10098 } else if (max_cmp < 0) { 10099 max = element; 10100 } 10101 } 10102 }; 10103 10104 self.$each(); 10105 10106 return [min, max]; 10107 }); 10108 10109 $def(self, '$minmax_by', function $$minmax_by() { 10110 var block = $$minmax_by.$$p || nil, self = this; 10111 10112 $$minmax_by.$$p = null; 10113 if (!$truthy(block)) { 10114 return $send(self, 'enum_for', ["minmax_by"], function $$39(){var self = $$39.$$s == null ? this : $$39.$$s; 10115 10116 return self.$enumerator_size()}, {$$s: self}) 10117 } 10118 var min_result = nil, 10119 max_result = nil, 10120 min_by, 10121 max_by; 10122 10123 self.$each.$$p = function() { 10124 var param = $Opal.$destructure(arguments), 10125 value = $yield1(block, param); 10126 10127 if ((min_by === undefined) || (value)['$<=>'](min_by) < 0) { 10128 min_result = param; 10129 min_by = value; 10130 } 10131 10132 if ((max_by === undefined) || (value)['$<=>'](max_by) > 0) { 10133 max_result = param; 10134 max_by = value; 10135 } 10136 }; 10137 10138 self.$each(); 10139 10140 return [min_result, max_result]; 10141 }); 10142 10143 $def(self, '$none?', function $Enumerable_none$ques$40(pattern) {try { var $t_return = $thrower('return'); 10144 var block = $Enumerable_none$ques$40.$$p || nil, self = this; 10145 10146 $Enumerable_none$ques$40.$$p = null; 10147 10148 ; 10149 ; 10150 if ($truthy(pattern !== undefined)) { 10151 $send(self, 'each', [], function $$41($a){var $post_args, value, comparable = nil; 10152 10153 10154 $post_args = $slice(arguments); 10155 value = $post_args; 10156 comparable = comparableForPattern(value); 10157 if ($truthy($send(pattern, 'public_send', ["==="].concat($to_a(comparable))))) { 10158 $t_return.$throw(false); 10159 } else { 10160 return nil 10161 };}, {$$arity: -1, $$ret: $t_return}); 10162 } else if ((block !== nil)) { 10163 $send(self, 'each', [], function $$42($a){var $post_args, value; 10164 10165 10166 $post_args = $slice(arguments); 10167 value = $post_args; 10168 if ($truthy(Opal.yieldX(block, $to_a(value)))) { 10169 $t_return.$throw(false); 10170 } else { 10171 return nil 10172 };}, {$$arity: -1, $$ret: $t_return}); 10173 } else { 10174 $send(self, 'each', [], function $$43($a){var $post_args, value, item = nil; 10175 10176 10177 $post_args = $slice(arguments); 10178 value = $post_args; 10179 item = $Opal.$destructure(value); 10180 if ($truthy(item)) { 10181 $t_return.$throw(false); 10182 } else { 10183 return nil 10184 };}, {$$arity: -1, $$ret: $t_return}); 10185 }; 10186 return true;} catch($e) { 10187 if ($e === $t_return) return $e.$v; 10188 throw $e; 10189 } 10190 }, -1); 10191 10192 $def(self, '$one?', function $Enumerable_one$ques$44(pattern) {try { var $t_return = $thrower('return'); 10193 var block = $Enumerable_one$ques$44.$$p || nil, self = this, count = nil; 10194 10195 $Enumerable_one$ques$44.$$p = null; 10196 10197 ; 10198 ; 10199 count = 0; 10200 if ($truthy(pattern !== undefined)) { 10201 $send(self, 'each', [], function $$45($a){var $post_args, value, comparable = nil; 10202 10203 10204 $post_args = $slice(arguments); 10205 value = $post_args; 10206 comparable = comparableForPattern(value); 10207 if ($truthy($send(pattern, 'public_send', ["==="].concat($to_a(comparable))))) { 10208 10209 count = $rb_plus(count, 1); 10210 if ($truthy($rb_gt(count, 1))) { 10211 $t_return.$throw(false); 10212 } else { 10213 return nil 10214 }; 10215 } else { 10216 return nil 10217 };}, {$$arity: -1, $$ret: $t_return}); 10218 } else if ((block !== nil)) { 10219 $send(self, 'each', [], function $$46($a){var $post_args, value; 10220 10221 10222 $post_args = $slice(arguments); 10223 value = $post_args; 10224 if (!$truthy(Opal.yieldX(block, $to_a(value)))) { 10225 return nil 10226 }; 10227 count = $rb_plus(count, 1); 10228 if ($truthy($rb_gt(count, 1))) { 10229 $t_return.$throw(false); 10230 } else { 10231 return nil 10232 };}, {$$arity: -1, $$ret: $t_return}); 10233 } else { 10234 $send(self, 'each', [], function $$47($a){var $post_args, value; 10235 10236 10237 $post_args = $slice(arguments); 10238 value = $post_args; 10239 if (!$truthy($Opal.$destructure(value))) { 10240 return nil 10241 }; 10242 count = $rb_plus(count, 1); 10243 if ($truthy($rb_gt(count, 1))) { 10244 $t_return.$throw(false); 10245 } else { 10246 return nil 10247 };}, {$$arity: -1, $$ret: $t_return}); 10248 }; 10249 return count['$=='](1);} catch($e) { 10250 if ($e === $t_return) return $e.$v; 10251 throw $e; 10252 } 10253 }, -1); 10254 10255 $def(self, '$partition', function $$partition() { 10256 var block = $$partition.$$p || nil, self = this; 10257 10258 $$partition.$$p = null; 10259 if (!(block !== nil)) { 10260 return $send(self, 'enum_for', ["partition"], function $$48(){var self = $$48.$$s == null ? this : $$48.$$s; 10261 10262 return self.$enumerator_size()}, {$$s: self}) 10263 } 10264 var truthy = [], falsy = []; 10265 10266 self.$each.$$p = function() { 10267 var param = $Opal.$destructure(arguments), 10268 value = $yield1(block, param); 10269 10270 if ($truthy(value)) { 10271 truthy.push(param); 10272 } 10273 else { 10274 falsy.push(param); 10275 } 10276 }; 10277 10278 self.$each(); 10279 10280 return [truthy, falsy]; 10281 }); 10282 10283 $def(self, '$reject', function $$reject() { 10284 var block = $$reject.$$p || nil, self = this; 10285 10286 $$reject.$$p = null; 10287 if (!(block !== nil)) { 10288 return $send(self, 'enum_for', ["reject"], function $$49(){var self = $$49.$$s == null ? this : $$49.$$s; 10289 10290 return self.$enumerator_size()}, {$$s: self}) 10291 } 10292 var result = []; 10293 10294 self.$each.$$p = function() { 10295 var param = $Opal.$destructure(arguments), 10296 value = $yield1(block, param); 10297 10298 if (!$truthy(value)) { 10299 result.push(param); 10300 } 10301 }; 10302 10303 self.$each(); 10304 10305 return result; 10306 }); 10307 10308 $def(self, '$reverse_each', function $$reverse_each() { 10309 var block = $$reverse_each.$$p || nil, self = this; 10310 10311 $$reverse_each.$$p = null; 10312 if (!(block !== nil)) { 10313 return $send(self, 'enum_for', ["reverse_each"], function $$50(){var self = $$50.$$s == null ? this : $$50.$$s; 10314 10315 return self.$enumerator_size()}, {$$s: self}) 10316 } 10317 var result = []; 10318 10319 self.$each.$$p = function() { 10320 result.push(arguments); 10321 }; 10322 10323 self.$each(); 10324 10325 for (var i = result.length - 1; i >= 0; i--) { 10326 $yieldX(block, result[i]); 10327 } 10328 10329 return result; 10330 }); 10331 10332 $def(self, '$slice_before', function $$slice_before(pattern) { 10333 var block = $$slice_before.$$p || nil, self = this; 10334 10335 $$slice_before.$$p = null; 10336 if ($truthy(pattern === undefined && block === nil)) { 10337 $Kernel.$raise($$$('ArgumentError'), "both pattern and block are given"); 10338 } if ($truthy(pattern !== undefined && block !== nil || arguments.length > 1)) { 10339 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (arguments.length) + " expected 1)"); 10340 } return $send($$$('Enumerator'), 'new', [], function $$51(e){var self = $$51.$$s == null ? this : $$51.$$s; 10341 10342 10343 if (e == null) e = nil; 10344 10345 var slice = []; 10346 10347 if (block !== nil) { 10348 if (pattern === undefined) { 10349 self.$each.$$p = function() { 10350 var param = $Opal.$destructure(arguments), 10351 value = $yield1(block, param); 10352 10353 if ($truthy(value) && slice.length > 0) { 10354 e['$<<'](slice); 10355 slice = []; 10356 } 10357 10358 slice.push(param); 10359 }; 10360 } 10361 else { 10362 self.$each.$$p = function() { 10363 var param = $Opal.$destructure(arguments), 10364 value = block(param, pattern.$dup()); 10365 10366 if ($truthy(value) && slice.length > 0) { 10367 e['$<<'](slice); 10368 slice = []; 10369 } 10370 10371 slice.push(param); 10372 }; 10373 } 10374 } 10375 else { 10376 self.$each.$$p = function() { 10377 var param = $Opal.$destructure(arguments), 10378 value = pattern['$==='](param); 10379 10380 if ($truthy(value) && slice.length > 0) { 10381 e['$<<'](slice); 10382 slice = []; 10383 } 10384 10385 slice.push(param); 10386 }; 10387 } 10388 10389 self.$each(); 10390 10391 if (slice.length > 0) { 10392 e['$<<'](slice); 10393 } 10394}, {$$s: self}); 10395 }, -1); 10396 10397 $def(self, '$slice_after', function $$slice_after(pattern) { 10398 var block = $$slice_after.$$p || nil, self = this; 10399 10400 $$slice_after.$$p = null; 10401 if ($truthy(pattern === undefined && block === nil)) { 10402 $Kernel.$raise($$$('ArgumentError'), "both pattern and block are given"); 10403 } if ($truthy(pattern !== undefined && block !== nil || arguments.length > 1)) { 10404 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (arguments.length) + " expected 1)"); 10405 } if ($truthy(pattern !== undefined)) { 10406 block = $send($Kernel, 'proc', [], function $$52(e){ 10407 10408 if (e == null) e = nil; 10409 return pattern['$==='](e);}); 10410 } return $send($$$('Enumerator'), 'new', [], function $$53(yielder){var self = $$53.$$s == null ? this : $$53.$$s; 10411 10412 10413 if (yielder == null) yielder = nil; 10414 10415 var accumulate; 10416 10417 self.$each.$$p = function() { 10418 var element = $Opal.$destructure(arguments), 10419 end_chunk = $yield1(block, element); 10420 10421 if (accumulate == null) { 10422 accumulate = []; 10423 } 10424 10425 if ($truthy(end_chunk)) { 10426 accumulate.push(element); 10427 yielder.$yield(accumulate); 10428 accumulate = null; 10429 } else { 10430 accumulate.push(element); 10431 } 10432 }; 10433 10434 self.$each(); 10435 10436 if (accumulate != null) { 10437 yielder.$yield(accumulate); 10438 } 10439}, {$$s: self}); 10440 }, -1); 10441 10442 $def(self, '$slice_when', function $$slice_when() { 10443 var block = $$slice_when.$$p || nil, self = this; 10444 10445 $$slice_when.$$p = null; 10446 if (!(block !== nil)) { 10447 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (0 for 1)"); 10448 } return $send($$$('Enumerator'), 'new', [], function $$54(yielder){var self = $$54.$$s == null ? this : $$54.$$s; 10449 10450 10451 if (yielder == null) yielder = nil; 10452 10453 var slice = nil, last_after = nil; 10454 10455 self.$each_cons.$$p = function() { 10456 var params = $Opal.$destructure(arguments), 10457 before = params[0], 10458 after = params[1], 10459 match = $yieldX(block, [before, after]); 10460 10461 last_after = after; 10462 10463 if (slice === nil) { 10464 slice = []; 10465 } 10466 10467 if ($truthy(match)) { 10468 slice.push(before); 10469 yielder.$yield(slice); 10470 slice = []; 10471 } else { 10472 slice.push(before); 10473 } 10474 }; 10475 10476 self.$each_cons(2); 10477 10478 if (slice !== nil) { 10479 slice.push(last_after); 10480 yielder.$yield(slice); 10481 } 10482}, {$$s: self}); 10483 }); 10484 10485 $def(self, '$sort', function $$sort() { 10486 var block = $$sort.$$p || nil, self = this, ary = nil; 10487 10488 $$sort.$$p = null; 10489 ary = self.$to_a(); 10490 if (!(block !== nil)) { 10491 block = $lambda(function $$55(a, b){ 10492 10493 if (a == null) a = nil; 10494 if (b == null) b = nil; 10495 return a['$<=>'](b);}); 10496 } return $send(ary, 'sort', [], block.$to_proc()); 10497 }); 10498 10499 $def(self, '$sort_by', function $$sort_by() { 10500 var block = $$sort_by.$$p || nil, self = this, dup = nil; 10501 10502 $$sort_by.$$p = null; 10503 if (!(block !== nil)) { 10504 return $send(self, 'enum_for', ["sort_by"], function $$56(){var self = $$56.$$s == null ? this : $$56.$$s; 10505 10506 return self.$enumerator_size()}, {$$s: self}) 10507 } dup = $send(self, 'map', [], function $$57(){var arg = nil; 10508 10509 10510 arg = $Opal.$destructure(arguments); 10511 return [Opal.yield1(block, arg), arg];}); 10512 $send(dup, 'sort!', [], function $$58(a, b){ 10513 10514 if (a == null) a = nil; 10515 if (b == null) b = nil; 10516 return (a[0])['$<=>'](b[0]);}); 10517 return $send(dup, 'map!', [], function $$59(i){ 10518 10519 if (i == null) i = nil; 10520 return i[1];}); 10521 }); 10522 10523 $def(self, '$sum', function $$sum(initial) { 10524 var $yield = $$sum.$$p || nil, self = this, result = nil, compensation = nil; 10525 10526 $$sum.$$p = null; 10527 10528 if (initial == null) initial = 0; 10529 result = initial; 10530 compensation = 0; 10531 $send(self, 'each', [], function $$60($a){var $post_args, args, item = nil, y = nil, t = nil; 10532 10533 10534 $post_args = $slice(arguments); 10535 args = $post_args; 10536 item = (($yield !== nil) ? (Opal.yieldX($yield, $to_a(args))) : ($Opal.$destructure(args))); 10537 if (($not([$$$($$$('Float'), 'INFINITY'), $$$($$$('Float'), 'INFINITY')['$-@']()]['$include?'](item)) && ($truthy(item['$respond_to?']("-"))))) { 10538 10539 y = $rb_minus(item, compensation); 10540 t = $rb_plus(result, y); 10541 compensation = $rb_minus($rb_minus(t, result), y); 10542 return (result = t); 10543 } else { 10544 return (result = $rb_plus(result, item)) 10545 }}, -1); 10546 return result; 10547 }, -1); 10548 10549 $def(self, '$take', function $$take(num) { 10550 var self = this; 10551 10552 return self.$first(num) 10553 }); 10554 10555 $def(self, '$take_while', function $$take_while() {try { var $t_return = $thrower('return'); 10556 var block = $$take_while.$$p || nil, self = this, result = nil; 10557 10558 $$take_while.$$p = null; 10559 10560 ; 10561 if (!$truthy(block)) { 10562 return self.$enum_for("take_while") 10563 }; 10564 result = []; 10565 return $send(self, 'each', [], function $$61($a){var $post_args, args, value = nil; 10566 10567 10568 $post_args = $slice(arguments); 10569 args = $post_args; 10570 value = $Opal.$destructure(args); 10571 if (!$truthy(Opal.yield1(block, value))) { 10572 $t_return.$throw(result); 10573 }; 10574 return result.push(value);;}, {$$arity: -1, $$ret: $t_return});} catch($e) { 10575 if ($e === $t_return) return $e.$v; 10576 throw $e; 10577 } 10578 }); 10579 10580 $def(self, '$uniq', function $$uniq() { 10581 var block = $$uniq.$$p || nil, self = this, hash = nil; 10582 10583 $$uniq.$$p = null; 10584 hash = $hash2([], {}); 10585 $send(self, 'each', [], function $$62($a){var $post_args, args, $b, value = nil, produced = nil; 10586 10587 10588 $post_args = $slice(arguments); 10589 args = $post_args; 10590 value = $Opal.$destructure(args); 10591 produced = ((block !== nil) ? (Opal.yield1(block, value)) : (value)); 10592 if ($truthy(hash['$key?'](produced))) { 10593 return nil 10594 } else { 10595 return ($b = [produced, value], $send(hash, '[]=', $b), $b[$b.length - 1]) 10596 }}, -1); 10597 return hash.$values(); 10598 }); 10599 10600 $def(self, '$tally', function $$tally(hash) { 10601 var self = this, out = nil; 10602 if (hash && hash !== nil) { $deny_frozen_access(hash); } out = $send($send(self, 'group_by', [], "itself".$to_proc()), 'transform_values', [], "count".$to_proc()); 10603 if ($truthy(hash)) { 10604 10605 $send(out, 'each', [], function $$63(k, v){var $a; 10606 10607 10608 if (k == null) k = nil; 10609 if (v == null) v = nil; 10610 return ($a = [k, $rb_plus(hash.$fetch(k, 0), v)], $send(hash, '[]=', $a), $a[$a.length - 1]);}); 10611 return hash; 10612 } else { 10613 return out 10614 } }, -1); 10615 10616 $def(self, '$to_h', function $$to_h($a) { 10617 var block = $$to_h.$$p || nil, $post_args, args, self = this; 10618 10619 $$to_h.$$p = null; 10620 $post_args = $slice(arguments); 10621 args = $post_args; 10622 if ((block !== nil)) { 10623 return $send($send(self, 'map', [], block.$to_proc()), 'to_h', $to_a(args)) 10624 } 10625 var hash = $hash2([], {}); 10626 10627 self.$each.$$p = function() { 10628 var param = $Opal.$destructure(arguments); 10629 var ary = $Opal['$coerce_to?'](param, $$$('Array'), "to_ary"), key, val; 10630 if (!ary.$$is_array) { 10631 $Kernel.$raise($$$('TypeError'), "wrong element type " + ((ary).$class()) + " (expected array)"); 10632 } 10633 if (ary.length !== 2) { 10634 $Kernel.$raise($$$('ArgumentError'), "wrong array length (expected 2, was " + ((ary).$length()) + ")"); 10635 } 10636 key = ary[0]; 10637 val = ary[1]; 10638 10639 Opal.hash_put(hash, key, val); 10640 }; 10641 10642 self.$each.apply(self, args); 10643 10644 return hash; 10645 }, -1); 10646 10647 $def(self, '$to_set', function $$to_set($a, $b) { 10648 var block = $$to_set.$$p || nil, $post_args, klass, args, self = this; 10649 10650 $$to_set.$$p = null; 10651 $post_args = $slice(arguments); 10652 10653 if ($post_args.length > 0) klass = $post_args.shift();if (klass == null) klass = $$('Set'); 10654 args = $post_args; 10655 return $send(klass, 'new', [self].concat($to_a(args)), block.$to_proc()); 10656 }, -1); 10657 10658 $def(self, '$zip', function $$zip($a) { 10659 var $post_args, others, self = this; 10660 10661 $$zip.$$p = null; 10662 $post_args = $slice(arguments); 10663 others = $post_args; 10664 return $send(self.$to_a(), 'zip', $to_a(others)); 10665 }, -1); 10666 $alias(self, "find", "detect"); 10667 $alias(self, "filter", "find_all"); 10668 $alias(self, "flat_map", "collect_concat"); 10669 $alias(self, "map", "collect"); 10670 $alias(self, "member?", "include?"); 10671 $alias(self, "reduce", "inject"); 10672 $alias(self, "select", "find_all"); 10673 return $alias(self, "to_a", "entries"); 10674 })('::', $nesting) 10675}; 10676 10677Opal.modules["corelib/enumerator/arithmetic_sequence"] = function(Opal) {/* Generated by Opal 1.7.3 */ 10678 var $klass = Opal.klass, $truthy = Opal.truthy, $to_a = Opal.to_a, $eqeq = Opal.eqeq, $Kernel = Opal.Kernel, $def = Opal.def, $rb_gt = Opal.rb_gt, $rb_lt = Opal.rb_lt, $rb_le = Opal.rb_le, $rb_ge = Opal.rb_ge, $rb_plus = Opal.rb_plus, $rb_minus = Opal.rb_minus, $eqeqeq = Opal.eqeqeq, $not = Opal.not, $rb_times = Opal.rb_times, $rb_divide = Opal.rb_divide, $alias = Opal.alias, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 10679 10680 Opal.add_stubs('is_a?,==,raise,respond_to?,class,attr_reader,begin,end,exclude_end?,>,step,<,<=,>=,-@,_lesser_than_end?,<<,+,-,===,%,_greater_than_begin?,reverse,!,include?,*,to_i,abs,/,hash,inspect'); 10681 return (function($base, $super, $parent_nesting) { 10682 var self = $klass($base, $super, 'Enumerator'); 10683 10684 var $nesting = [self].concat($parent_nesting); 10685 10686 return (function($base, $super, $parent_nesting) { 10687 var self = $klass($base, $super, 'ArithmeticSequence'); 10688 10689 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype; 10690 10691 $proto.step_arg2 = $proto.receiver_num = $proto.step_arg1 = $proto.step = $proto.range = $proto.topfx = $proto.bypfx = $proto.creation_method = $proto.skipped_arg = nil; 10692 10693 Opal.prop(self.$$prototype, '$$is_arithmetic_seq', true); 10694 var inf = Infinity; 10695 10696 $def(self, '$initialize', function $$initialize(range, step, creation_method) { 10697 var $a, self = this, $ret_or_1 = nil; 10698 if (creation_method == null) creation_method = "step"; 10699 self.creation_method = creation_method; 10700 if ($truthy(range['$is_a?']($$$('Array')))) { 10701 10702 $a = [].concat($to_a(range)), (self.step_arg1 = ($a[0] == null ? nil : $a[0])), (self.step_arg2 = ($a[1] == null ? nil : $a[1])), (self.topfx = ($a[2] == null ? nil : $a[2])), (self.bypfx = ($a[3] == null ? nil : $a[3])); 10703 self.receiver_num = step; 10704 self.step = 1; 10705 self.range = ($truthy(self.step_arg2) ? (((self.step = self.step_arg2), Opal.Range.$new(self.receiver_num, self.step_arg1, false))) : ($truthy(self.step_arg1) ? (Opal.Range.$new(self.receiver_num, self.step_arg1, false)) : (Opal.Range.$new(self.receiver_num, nil, false)))); 10706 } else { 10707 10708 if (!$truthy(step)) { 10709 self.skipped_arg = true; 10710 } $a = [range, ($truthy(($ret_or_1 = step)) ? ($ret_or_1) : (1))], (self.range = $a[0]), (self.step = $a[1]); 10711 } self.object = self; 10712 if ($eqeq(self.step, 0)) { 10713 $Kernel.$raise($$('ArgumentError'), "step can't be 0"); 10714 } if ($truthy(self.step['$respond_to?']("to_int"))) { 10715 return nil 10716 } else { 10717 return $Kernel.$raise($$('ArgumentError'), "" + ("no implicit conversion of " + (self.step.$class()) + " ") + "into Integer") 10718 } }, -2); 10719 self.$attr_reader("step"); 10720 10721 $def(self, '$begin', function $$begin() { 10722 var self = this; 10723 10724 return self.range.$begin() 10725 }); 10726 10727 $def(self, '$end', function $$end() { 10728 var self = this; 10729 10730 return self.range.$end() 10731 }); 10732 10733 $def(self, '$exclude_end?', function $ArithmeticSequence_exclude_end$ques$1() { 10734 var self = this; 10735 10736 return self.range['$exclude_end?']() 10737 }); 10738 10739 $def(self, '$_lesser_than_end?', function $ArithmeticSequence__lesser_than_end$ques$2(val) { 10740 var self = this, end_ = nil, $ret_or_1 = nil; 10741 10742 10743 end_ = ($truthy(($ret_or_1 = self.$end())) ? ($ret_or_1) : (inf)); 10744 if ($truthy($rb_gt(self.$step(), 0))) { 10745 if ($truthy(self['$exclude_end?']())) { 10746 return $rb_lt(val, end_) 10747 } else { 10748 return $rb_le(val, end_) 10749 } 10750 } else if ($truthy(self['$exclude_end?']())) { 10751 return $rb_gt(val, end_) 10752 } else { 10753 return $rb_ge(val, end_) 10754 } }); 10755 10756 $def(self, '$_greater_than_begin?', function $ArithmeticSequence__greater_than_begin$ques$3(val) { 10757 var self = this, begin_ = nil, $ret_or_1 = nil; 10758 10759 10760 begin_ = ($truthy(($ret_or_1 = self.$begin())) ? ($ret_or_1) : ((inf)['$-@']())); 10761 if ($truthy($rb_gt(self.$step(), 0))) { 10762 return $rb_gt(val, begin_) 10763 } else { 10764 return $rb_lt(val, begin_) 10765 } }); 10766 10767 $def(self, '$first', function $$first(count) { 10768 var self = this, iter = nil, $ret_or_1 = nil, out = nil; 10769 iter = ($truthy(($ret_or_1 = self.$begin())) ? ($ret_or_1) : ((inf)['$-@']())); 10770 if (!$truthy(count)) { 10771 return ($truthy(self['$_lesser_than_end?'](iter)) ? (iter) : (nil)) 10772 } out = []; 10773 while ($truthy(($truthy(($ret_or_1 = self['$_lesser_than_end?'](iter))) ? ($rb_gt(count, 0)) : ($ret_or_1)))) { 10774 10775 out['$<<'](iter); 10776 iter = $rb_plus(iter, self.$step()); 10777 count = $rb_minus(count, 1); 10778 } return out; 10779 }, -1); 10780 10781 $def(self, '$each', function $$each() { 10782 var block = $$each.$$p || nil, self = this, $ret_or_1 = nil, iter = nil; 10783 10784 $$each.$$p = null; 10785 if (!(block !== nil)) { 10786 return self 10787 } if ($eqeqeq(nil, ($ret_or_1 = self.$begin()))) { 10788 $Kernel.$raise($$('TypeError'), "nil can't be coerced into Integer"); 10789 } iter = ($truthy(($ret_or_1 = self.$begin())) ? ($ret_or_1) : ((inf)['$-@']())); 10790 while ($truthy(self['$_lesser_than_end?'](iter))) { 10791 10792 Opal.yield1(block, iter); 10793 iter = $rb_plus(iter, self.$step()); 10794 } return self; 10795 }); 10796 10797 $def(self, '$last', function $$last(count) { 10798 var self = this, $ret_or_1 = nil, iter = nil, out = nil; 10799 if (($eqeqeq(inf, ($ret_or_1 = self.$end())) || ($eqeqeq((inf)['$-@'](), $ret_or_1)))) { 10800 $Kernel.$raise($$$('FloatDomainError'), self.$end()); 10801 } else if ($eqeqeq(nil, $ret_or_1)) { 10802 $Kernel.$raise($$$('RangeError'), "cannot get the last element of endless arithmetic sequence"); 10803 } else ; iter = $rb_minus(self.$end(), $rb_minus(self.$end(), self.$begin())['$%'](self.$step())); 10804 if (!$truthy(self['$_lesser_than_end?'](iter))) { 10805 iter = $rb_minus(iter, self.$step()); 10806 } if (!$truthy(count)) { 10807 return ($truthy(self['$_greater_than_begin?'](iter)) ? (iter) : (nil)) 10808 } out = []; 10809 while ($truthy(($truthy(($ret_or_1 = self['$_greater_than_begin?'](iter))) ? ($rb_gt(count, 0)) : ($ret_or_1)))) { 10810 10811 out['$<<'](iter); 10812 iter = $rb_minus(iter, self.$step()); 10813 count = $rb_minus(count, 1); 10814 } return out.$reverse(); 10815 }, -1); 10816 10817 $def(self, '$size', function $$size() { 10818 var self = this, step_sign = nil, iter = nil; 10819 10820 10821 step_sign = ($truthy($rb_gt(self.$step(), 0)) ? (1) : (-1)); 10822 if ($not(self['$_lesser_than_end?'](self.$begin()))) { 10823 return 0 10824 } else if ($truthy([(inf)['$-@'](), inf]['$include?'](self.$step()))) { 10825 return 1 10826 } else if (($truthy([$rb_times((inf)['$-@'](), step_sign), nil]['$include?'](self.$begin())) || ($truthy([$rb_times(inf, step_sign), nil]['$include?'](self.$end()))))) { 10827 return inf; 10828 } else { 10829 10830 iter = $rb_minus(self.$end(), $rb_minus(self.$end(), self.$begin())['$%'](self.$step())); 10831 if (!$truthy(self['$_lesser_than_end?'](iter))) { 10832 iter = $rb_minus(iter, self.$step()); 10833 } return $rb_plus($rb_divide($rb_minus(iter, self.$begin()), self.$step()).$abs().$to_i(), 1); 10834 } }); 10835 10836 $def(self, '$==', function $ArithmeticSequence_$eq_eq$4(other) { 10837 var self = this, $ret_or_1 = nil, $ret_or_2 = nil, $ret_or_3 = nil, $ret_or_4 = nil; 10838 10839 if ($truthy(($ret_or_1 = ($truthy(($ret_or_2 = ($truthy(($ret_or_3 = ($truthy(($ret_or_4 = self.$class()['$=='](other.$class()))) ? (self.$begin()['$=='](other.$begin())) : ($ret_or_4)))) ? (self.$end()['$=='](other.$end())) : ($ret_or_3)))) ? (self.$step()['$=='](other.$step())) : ($ret_or_2))))) { 10840 return self['$exclude_end?']()['$=='](other['$exclude_end?']()) 10841 } else { 10842 return $ret_or_1 10843 } 10844 }); 10845 10846 $def(self, '$hash', function $$hash() { 10847 var self = this; 10848 10849 return [self.$begin(), self.$end(), self.$step(), self['$exclude_end?']()].$hash() 10850 }); 10851 10852 $def(self, '$inspect', function $$inspect() { 10853 var self = this, args = nil; 10854 10855 if ($truthy(self.receiver_num)) { 10856 10857 args = ($truthy(self.step_arg2) ? ("(" + (self.topfx) + (self.step_arg1.$inspect()) + ", " + (self.bypfx) + (self.step_arg2.$inspect()) + ")") : ($truthy(self.step_arg1) ? ("(" + (self.topfx) + (self.step_arg1.$inspect()) + ")") : nil)); 10858 return "(" + (self.receiver_num.$inspect()) + "." + (self.creation_method) + (args) + ")"; 10859 } else { 10860 10861 args = ($truthy(self.skipped_arg) ? (nil) : ("(" + (self.step) + ")")); 10862 return "((" + (self.range.$inspect()) + ")." + (self.creation_method) + (args) + ")"; 10863 } 10864 }); 10865 $alias(self, "===", "=="); 10866 return $alias(self, "eql?", "=="); 10867 })(self, self, $nesting) 10868 })('::', null, $nesting) 10869}; 10870 10871Opal.modules["corelib/enumerator/chain"] = function(Opal) {/* Generated by Opal 1.7.3 */ 10872 var $deny_frozen_access = Opal.deny_frozen_access, $klass = Opal.klass, $slice = Opal.slice, $def = Opal.def, $send = Opal.send, $to_a = Opal.to_a, $truthy = Opal.truthy, $rb_plus = Opal.rb_plus, $thrower = Opal.thrower, nil = Opal.nil, $$$ = Opal.$$$; 10873 10874 Opal.add_stubs('to_enum,size,each,<<,to_proc,include?,+,reverse_each,respond_to?,rewind,inspect'); 10875 return (function($base, $super) { 10876 var self = $klass($base, $super, 'Enumerator'); 10877 10878 10879 return (function($base, $super) { 10880 var self = $klass($base, $super, 'Chain'); 10881 10882 var $proto = self.$$prototype; 10883 10884 $proto.enums = $proto.iterated = nil; 10885 10886 10887 $def(self, '$initialize', function $$initialize($a) { 10888 var $post_args, enums, self = this; 10889 10890 10891 $post_args = $slice(arguments); 10892 enums = $post_args; 10893 $deny_frozen_access(self); 10894 self.enums = enums; 10895 self.iterated = []; 10896 return (self.object = self); 10897 }, -1); 10898 10899 $def(self, '$each', function $$each($a) { 10900 var block = $$each.$$p || nil, $post_args, args, self = this; 10901 10902 $$each.$$p = null; 10903 $post_args = $slice(arguments); 10904 args = $post_args; 10905 if (!(block !== nil)) { 10906 return $send(self, 'to_enum', ["each"].concat($to_a(args)), function $$1(){var self = $$1.$$s == null ? this : $$1.$$s; 10907 10908 return self.$size()}, {$$s: self}) 10909 } $send(self.enums, 'each', [], function $$2(enum$){var self = $$2.$$s == null ? this : $$2.$$s; 10910 if (self.iterated == null) self.iterated = nil; 10911 10912 10913 if (enum$ == null) enum$ = nil; 10914 self.iterated['$<<'](enum$); 10915 return $send(enum$, 'each', $to_a(args), block.$to_proc());}, {$$s: self}); 10916 return self; 10917 }, -1); 10918 10919 $def(self, '$size', function $$size($a) {try { var $t_return = $thrower('return'); 10920 var $post_args, args, self = this, accum = nil; 10921 10922 10923 $post_args = $slice(arguments); 10924 args = $post_args; 10925 accum = 0; 10926 $send(self.enums, 'each', [], function $$3(enum$){var size = nil; 10927 10928 10929 if (enum$ == null) enum$ = nil; 10930 size = $send(enum$, 'size', $to_a(args)); 10931 if ($truthy([nil, $$$($$$('Float'), 'INFINITY')]['$include?'](size))) { 10932 $t_return.$throw(size); 10933 }; 10934 return (accum = $rb_plus(accum, size));}, {$$ret: $t_return}); 10935 return accum;} catch($e) { 10936 if ($e === $t_return) return $e.$v; 10937 throw $e; 10938 } 10939 }, -1); 10940 10941 $def(self, '$rewind', function $$rewind() { 10942 var self = this; 10943 10944 10945 $send(self.iterated, 'reverse_each', [], function $$4(enum$){ 10946 10947 if (enum$ == null) enum$ = nil; 10948 if ($truthy(enum$['$respond_to?']("rewind"))) { 10949 return enum$.$rewind() 10950 } else { 10951 return nil 10952 }}); 10953 self.iterated = []; 10954 return self; 10955 }); 10956 return $def(self, '$inspect', function $$inspect() { 10957 var self = this; 10958 10959 return "#<Enumerator::Chain: " + (self.enums.$inspect()) + ">" 10960 }); 10961 })(self, self) 10962 })('::', null) 10963}; 10964 10965Opal.modules["corelib/enumerator/generator"] = function(Opal) {/* Generated by Opal 1.7.3 */ 10966 var $deny_frozen_access = Opal.deny_frozen_access, $klass = Opal.klass, $truthy = Opal.truthy, $Kernel = Opal.Kernel, $def = Opal.def, $slice = Opal.slice, $send = Opal.send, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 10967 10968 Opal.add_stubs('include,raise,new,to_proc'); 10969 return (function($base, $super, $parent_nesting) { 10970 var self = $klass($base, $super, 'Enumerator'); 10971 10972 var $nesting = [self].concat($parent_nesting); 10973 10974 return (function($base, $super, $parent_nesting) { 10975 var self = $klass($base, $super, 'Generator'); 10976 10977 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype; 10978 10979 $proto.block = nil; 10980 10981 self.$include($$$('Enumerable')); 10982 10983 $def(self, '$initialize', function $$initialize() { 10984 var block = $$initialize.$$p || nil, self = this; 10985 10986 $$initialize.$$p = null; 10987 $deny_frozen_access(self); 10988 if (!$truthy(block)) { 10989 $Kernel.$raise($$$('LocalJumpError'), "no block given"); 10990 } return (self.block = block); 10991 }); 10992 return $def(self, '$each', function $$each($a) { 10993 var block = $$each.$$p || nil, $post_args, args, self = this, yielder = nil; 10994 10995 $$each.$$p = null; 10996 $post_args = $slice(arguments); 10997 args = $post_args; 10998 yielder = $send($$('Yielder'), 'new', [], block.$to_proc()); 10999 11000 try { 11001 args.unshift(yielder); 11002 11003 Opal.yieldX(self.block, args); 11004 } 11005 catch (e) { 11006 if (e && e.$thrower_type == "breaker") { 11007 return e.$v; 11008 } 11009 else { 11010 throw e; 11011 } 11012 } 11013 return self; 11014 }, -1); 11015 })($nesting[0], null, $nesting) 11016 })($nesting[0], null, $nesting) 11017}; 11018 11019Opal.modules["corelib/enumerator/lazy"] = function(Opal) {/* Generated by Opal 1.7.3 */ 11020 var $truthy = Opal.truthy, $coerce_to = Opal.coerce_to, $yield1 = Opal.yield1, $yieldX = Opal.yieldX, $deny_frozen_access = Opal.deny_frozen_access, $klass = Opal.klass, $slice = Opal.slice, $send2 = Opal.send2, $find_super = Opal.find_super, $to_a = Opal.to_a, $defs = Opal.defs, $Kernel = Opal.Kernel, $send = Opal.send, $def = Opal.def, $return_self = Opal.return_self, $Opal = Opal.Opal, $rb_lt = Opal.rb_lt, $eqeqeq = Opal.eqeqeq, $rb_plus = Opal.rb_plus, $alias = Opal.alias, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 11021 11022 Opal.add_stubs('raise,each,new,enumerator_size,yield,respond_to?,try_convert,<,===,+,for,class,to_proc,destructure,inspect,to_a,find_all,collect_concat,collect,enum_for'); 11023 return (function($base, $super, $parent_nesting) { 11024 var self = $klass($base, $super, 'Enumerator'); 11025 11026 var $nesting = [self].concat($parent_nesting); 11027 11028 return (function($base, $super, $parent_nesting) { 11029 var self = $klass($base, $super, 'Lazy'); 11030 11031 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype; 11032 11033 $proto.enumerator = nil; 11034 11035 $klass(self, $$$('Exception'), 'StopLazyError'); 11036 $defs(self, '$for', function $Lazy_for$1(object, $a) { 11037 var $post_args, $fwd_rest, $yield = $Lazy_for$1.$$p || nil, self = this, lazy = nil; 11038 11039 $Lazy_for$1.$$p = null; 11040 11041 $post_args = $slice(arguments, 1); 11042 $fwd_rest = $post_args; 11043 lazy = $send2(self, $find_super(self, 'for', $Lazy_for$1, false, true), 'for', [object].concat($to_a($fwd_rest)), $yield); 11044 lazy.enumerator = object; 11045 return lazy; 11046 }, -2); 11047 11048 $def(self, '$initialize', function $$initialize(object, size) { 11049 var block = $$initialize.$$p || nil, self = this; 11050 11051 $$initialize.$$p = null; 11052 if (size == null) size = nil; 11053 $deny_frozen_access(self); 11054 if (!(block !== nil)) { 11055 $Kernel.$raise($$$('ArgumentError'), "tried to call lazy new without a block"); 11056 } self.enumerator = object; 11057 return $send2(self, $find_super(self, 'initialize', $$initialize, false, true), 'initialize', [size], function $$2(yielder, $a){var $post_args, each_args; 11058 11059 11060 if (yielder == null) yielder = nil; 11061 $post_args = $slice(arguments, 1); 11062 each_args = $post_args; 11063 try { 11064 return $send(object, 'each', $to_a(each_args), function $$3($b){var $post_args, args; 11065 11066 11067 $post_args = $slice(arguments); 11068 args = $post_args; 11069 11070 args.unshift(yielder); 11071 11072 $yieldX(block, args); 11073 ;}, -1) 11074 } catch ($err) { 11075 if (Opal.rescue($err, [$$('StopLazyError')])) { 11076 try { 11077 return nil 11078 } finally { Opal.pop_exception(); } 11079 } else { throw $err; } 11080 }}, -2); 11081 }, -2); 11082 11083 $def(self, '$lazy', $return_self); 11084 11085 $def(self, '$collect', function $$collect() { 11086 var block = $$collect.$$p || nil, self = this; 11087 11088 $$collect.$$p = null; 11089 if (!$truthy(block)) { 11090 $Kernel.$raise($$$('ArgumentError'), "tried to call lazy map without a block"); 11091 } return $send($$('Lazy'), 'new', [self, self.$enumerator_size()], function $$4(enum$, $a){var $post_args, args; 11092 11093 11094 if (enum$ == null) enum$ = nil; 11095 $post_args = $slice(arguments, 1); 11096 args = $post_args; 11097 11098 var value = $yieldX(block, args); 11099 11100 enum$.$yield(value); 11101}, -2); 11102 }); 11103 11104 $def(self, '$collect_concat', function $$collect_concat() { 11105 var block = $$collect_concat.$$p || nil, self = this; 11106 11107 $$collect_concat.$$p = null; 11108 if (!$truthy(block)) { 11109 $Kernel.$raise($$$('ArgumentError'), "tried to call lazy map without a block"); 11110 } return $send($$('Lazy'), 'new', [self, nil], function $$5(enum$, $a){var $post_args, args; 11111 11112 11113 if (enum$ == null) enum$ = nil; 11114 $post_args = $slice(arguments, 1); 11115 args = $post_args; 11116 11117 var value = $yieldX(block, args); 11118 11119 if ((value)['$respond_to?']("force") && (value)['$respond_to?']("each")) { 11120 $send((value), 'each', [], function $$6(v){ 11121 11122 if (v == null) v = nil; 11123 return enum$.$yield(v);}); 11124 } 11125 else { 11126 var array = $Opal.$try_convert(value, $$$('Array'), "to_ary"); 11127 11128 if (array === nil) { 11129 enum$.$yield(value); 11130 } 11131 else { 11132 $send((value), 'each', [], function $$7(v){ 11133 11134 if (v == null) v = nil; 11135 return enum$.$yield(v);}); 11136 } 11137 } 11138}, -2); 11139 }); 11140 11141 $def(self, '$drop', function $$drop(n) { 11142 var self = this, current_size = nil, set_size = nil, dropped = nil; 11143 11144 11145 n = $coerce_to(n, $$$('Integer'), 'to_int'); 11146 if ($truthy($rb_lt(n, 0))) { 11147 $Kernel.$raise($$$('ArgumentError'), "attempt to drop negative size"); 11148 } current_size = self.$enumerator_size(); 11149 set_size = ($eqeqeq($$$('Integer'), current_size) ? (($truthy($rb_lt(n, current_size)) ? (n) : (current_size))) : (current_size)); 11150 dropped = 0; 11151 return $send($$('Lazy'), 'new', [self, set_size], function $$8(enum$, $a){var $post_args, args; 11152 11153 11154 if (enum$ == null) enum$ = nil; 11155 $post_args = $slice(arguments, 1); 11156 args = $post_args; 11157 if ($truthy($rb_lt(dropped, n))) { 11158 return (dropped = $rb_plus(dropped, 1)) 11159 } else { 11160 return $send(enum$, 'yield', $to_a(args)) 11161 }}, -2); 11162 }); 11163 11164 $def(self, '$drop_while', function $$drop_while() { 11165 var block = $$drop_while.$$p || nil, self = this, succeeding = nil; 11166 11167 $$drop_while.$$p = null; 11168 if (!$truthy(block)) { 11169 $Kernel.$raise($$$('ArgumentError'), "tried to call lazy drop_while without a block"); 11170 } succeeding = true; 11171 return $send($$('Lazy'), 'new', [self, nil], function $$9(enum$, $a){var $post_args, args; 11172 11173 11174 if (enum$ == null) enum$ = nil; 11175 $post_args = $slice(arguments, 1); 11176 args = $post_args; 11177 if ($truthy(succeeding)) { 11178 11179 var value = $yieldX(block, args); 11180 11181 if (!$truthy(value)) { 11182 succeeding = false; 11183 11184 $send(enum$, 'yield', $to_a(args)); 11185 } 11186 11187 } else { 11188 return $send(enum$, 'yield', $to_a(args)) 11189 }}, -2); 11190 }); 11191 11192 $def(self, '$enum_for', function $$enum_for($a, $b) { 11193 var block = $$enum_for.$$p || nil, $post_args, method, args, self = this; 11194 11195 $$enum_for.$$p = null; 11196 $post_args = $slice(arguments); 11197 11198 if ($post_args.length > 0) method = $post_args.shift();if (method == null) method = "each"; 11199 args = $post_args; 11200 return $send(self.$class(), 'for', [self, method].concat($to_a(args)), block.$to_proc()); 11201 }, -1); 11202 11203 $def(self, '$find_all', function $$find_all() { 11204 var block = $$find_all.$$p || nil, self = this; 11205 11206 $$find_all.$$p = null; 11207 if (!$truthy(block)) { 11208 $Kernel.$raise($$$('ArgumentError'), "tried to call lazy select without a block"); 11209 } return $send($$('Lazy'), 'new', [self, nil], function $$10(enum$, $a){var $post_args, args; 11210 11211 11212 if (enum$ == null) enum$ = nil; 11213 $post_args = $slice(arguments, 1); 11214 args = $post_args; 11215 11216 var value = $yieldX(block, args); 11217 11218 if ($truthy(value)) { 11219 $send(enum$, 'yield', $to_a(args)); 11220 } 11221}, -2); 11222 }); 11223 11224 $def(self, '$grep', function $$grep(pattern) { 11225 var block = $$grep.$$p || nil, self = this; 11226 11227 $$grep.$$p = null; 11228 if ($truthy(block)) { 11229 return $send($$('Lazy'), 'new', [self, nil], function $$11(enum$, $a){var $post_args, args; 11230 11231 11232 if (enum$ == null) enum$ = nil; 11233 $post_args = $slice(arguments, 1); 11234 args = $post_args; 11235 11236 var param = $Opal.$destructure(args), 11237 value = pattern['$==='](param); 11238 11239 if ($truthy(value)) { 11240 value = $yield1(block, param); 11241 11242 enum$.$yield($yield1(block, param)); 11243 } 11244}, -2) 11245 } else { 11246 return $send($$('Lazy'), 'new', [self, nil], function $$12(enum$, $a){var $post_args, args; 11247 11248 11249 if (enum$ == null) enum$ = nil; 11250 $post_args = $slice(arguments, 1); 11251 args = $post_args; 11252 11253 var param = $Opal.$destructure(args), 11254 value = pattern['$==='](param); 11255 11256 if ($truthy(value)) { 11257 enum$.$yield(param); 11258 } 11259}, -2) 11260 } }); 11261 11262 $def(self, '$reject', function $$reject() { 11263 var block = $$reject.$$p || nil, self = this; 11264 11265 $$reject.$$p = null; 11266 if (!$truthy(block)) { 11267 $Kernel.$raise($$$('ArgumentError'), "tried to call lazy reject without a block"); 11268 } return $send($$('Lazy'), 'new', [self, nil], function $$13(enum$, $a){var $post_args, args; 11269 11270 11271 if (enum$ == null) enum$ = nil; 11272 $post_args = $slice(arguments, 1); 11273 args = $post_args; 11274 11275 var value = $yieldX(block, args); 11276 11277 if (!$truthy(value)) { 11278 $send(enum$, 'yield', $to_a(args)); 11279 } 11280}, -2); 11281 }); 11282 11283 $def(self, '$take', function $$take(n) { 11284 var self = this, current_size = nil, set_size = nil, taken = nil; 11285 11286 11287 n = $coerce_to(n, $$$('Integer'), 'to_int'); 11288 if ($truthy($rb_lt(n, 0))) { 11289 $Kernel.$raise($$$('ArgumentError'), "attempt to take negative size"); 11290 } current_size = self.$enumerator_size(); 11291 set_size = ($eqeqeq($$$('Integer'), current_size) ? (($truthy($rb_lt(n, current_size)) ? (n) : (current_size))) : (current_size)); 11292 taken = 0; 11293 return $send($$('Lazy'), 'new', [self, set_size], function $$14(enum$, $a){var $post_args, args; 11294 11295 11296 if (enum$ == null) enum$ = nil; 11297 $post_args = $slice(arguments, 1); 11298 args = $post_args; 11299 if ($truthy($rb_lt(taken, n))) { 11300 11301 $send(enum$, 'yield', $to_a(args)); 11302 return (taken = $rb_plus(taken, 1)); 11303 } else { 11304 return $Kernel.$raise($$('StopLazyError')) 11305 }}, -2); 11306 }); 11307 11308 $def(self, '$take_while', function $$take_while() { 11309 var block = $$take_while.$$p || nil, self = this; 11310 11311 $$take_while.$$p = null; 11312 if (!$truthy(block)) { 11313 $Kernel.$raise($$$('ArgumentError'), "tried to call lazy take_while without a block"); 11314 } return $send($$('Lazy'), 'new', [self, nil], function $$15(enum$, $a){var $post_args, args; 11315 11316 11317 if (enum$ == null) enum$ = nil; 11318 $post_args = $slice(arguments, 1); 11319 args = $post_args; 11320 11321 var value = $yieldX(block, args); 11322 11323 if ($truthy(value)) { 11324 $send(enum$, 'yield', $to_a(args)); 11325 } 11326 else { 11327 $Kernel.$raise($$('StopLazyError')); 11328 } 11329}, -2); 11330 }); 11331 11332 $def(self, '$inspect', function $$inspect() { 11333 var self = this; 11334 11335 return "#<" + (self.$class()) + ": " + (self.enumerator.$inspect()) + ">" 11336 }); 11337 $alias(self, "force", "to_a"); 11338 $alias(self, "filter", "find_all"); 11339 $alias(self, "flat_map", "collect_concat"); 11340 $alias(self, "map", "collect"); 11341 $alias(self, "select", "find_all"); 11342 return $alias(self, "to_enum", "enum_for"); 11343 })(self, self, $nesting) 11344 })('::', null, $nesting) 11345}; 11346 11347Opal.modules["corelib/enumerator/yielder"] = function(Opal) {/* Generated by Opal 1.7.3 */ 11348 var $klass = Opal.klass, $def = Opal.def, $slice = Opal.slice, $send = Opal.send, $to_a = Opal.to_a, $nesting = [], nil = Opal.nil; 11349 11350 Opal.add_stubs('yield,proc'); 11351 return (function($base, $super, $parent_nesting) { 11352 var self = $klass($base, $super, 'Enumerator'); 11353 11354 var $nesting = [self].concat($parent_nesting); 11355 11356 return (function($base, $super) { 11357 var self = $klass($base, $super, 'Yielder'); 11358 11359 var $proto = self.$$prototype; 11360 11361 $proto.block = nil; 11362 11363 11364 $def(self, '$initialize', function $$initialize() { 11365 var block = $$initialize.$$p || nil, self = this; 11366 11367 $$initialize.$$p = null; 11368 self.block = block; 11369 return self; 11370 }); 11371 11372 $def(self, '$yield', function $Yielder_yield$1($a) { 11373 var $post_args, values, self = this; 11374 11375 11376 $post_args = $slice(arguments); 11377 values = $post_args; 11378 11379 var value = Opal.yieldX(self.block, values); 11380 11381 if (value && value.$thrower_type == "break") { 11382 throw value; 11383 } 11384 11385 return value; 11386 }, -1); 11387 11388 $def(self, '$<<', function $Yielder_$lt$lt$2(value) { 11389 var self = this; 11390 11391 11392 self.$yield(value); 11393 return self; 11394 }); 11395 return $def(self, '$to_proc', function $$to_proc() { 11396 var self = this; 11397 11398 return $send(self, 'proc', [], function $$3($a){var $post_args, values, self = $$3.$$s == null ? this : $$3.$$s; 11399 11400 11401 $post_args = $slice(arguments); 11402 values = $post_args; 11403 return $send(self, 'yield', $to_a(values));}, {$$arity: -1, $$s: self}) 11404 }); 11405 })($nesting[0], null) 11406 })($nesting[0], null, $nesting) 11407}; 11408 11409Opal.modules["corelib/enumerator"] = function(Opal) {/* Generated by Opal 1.7.3 */ 11410 var $slice = Opal.slice, $coerce_to = Opal.coerce_to, $deny_frozen_access = Opal.deny_frozen_access, $klass = Opal.klass, $defs = Opal.defs, $truthy = Opal.truthy, $send = Opal.send, $not = Opal.not, $def = Opal.def, $rb_plus = Opal.rb_plus, $to_a = Opal.to_a, $Opal = Opal.Opal, $send2 = Opal.send2, $find_super = Opal.find_super, $rb_ge = Opal.rb_ge, $Kernel = Opal.Kernel, $rb_le = Opal.rb_le, $alias = Opal.alias, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 11411 11412 Opal.add_stubs('require,include,allocate,new,to_proc,!,respond_to?,empty?,nil?,+,class,__send__,call,enum_for,size,destructure,map,>=,length,raise,[],peek_values,<=,next_values,inspect,any?,each_with_object,autoload'); 11413 11414 self.$require("corelib/enumerable"); 11415 return (function($base, $super, $parent_nesting) { 11416 var self = $klass($base, $super, 'Enumerator'); 11417 11418 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype; 11419 11420 $proto.size = $proto.args = $proto.object = $proto.method = $proto.values = $proto.cursor = nil; 11421 11422 self.$include($$$('Enumerable')); 11423 self.$$prototype.$$is_enumerator = true; 11424 $defs(self, '$for', function $Enumerator_for$1(object, $a, $b) { 11425 var block = $Enumerator_for$1.$$p || nil, $post_args, method, args, self = this; 11426 11427 $Enumerator_for$1.$$p = null; 11428 $post_args = $slice(arguments, 1); 11429 11430 if ($post_args.length > 0) method = $post_args.shift();if (method == null) method = "each"; 11431 args = $post_args; 11432 11433 var obj = self.$allocate(); 11434 11435 obj.object = object; 11436 obj.size = block; 11437 obj.method = method; 11438 obj.args = args; 11439 obj.cursor = 0; 11440 11441 return obj; 11442 }, -2); 11443 11444 $def(self, '$initialize', function $$initialize($a) { 11445 var block = $$initialize.$$p || nil, self = this; 11446 11447 $$initialize.$$p = null; 11448 $slice(arguments); 11449 $deny_frozen_access(self); 11450 self.cursor = 0; 11451 if ($truthy(block)) { 11452 11453 self.object = $send($$('Generator'), 'new', [], block.$to_proc()); 11454 self.method = "each"; 11455 self.args = []; 11456 self.size = arguments[0] || nil; 11457 if (($truthy(self.size) && ($not(self.size['$respond_to?']("call"))))) { 11458 return (self.size = $coerce_to(self.size, $$$('Integer'), 'to_int')) 11459 } else { 11460 return nil 11461 } } else { 11462 11463 self.object = arguments[0]; 11464 self.method = arguments[1] || "each"; 11465 self.args = $slice(arguments, 2); 11466 return (self.size = nil); 11467 } }, -1); 11468 11469 $def(self, '$each', function $$each($a) { 11470 var block = $$each.$$p || nil, $post_args, args, self = this; 11471 11472 $$each.$$p = null; 11473 $post_args = $slice(arguments); 11474 args = $post_args; 11475 if (($truthy(block['$nil?']()) && ($truthy(args['$empty?']())))) { 11476 return self 11477 } args = $rb_plus(self.args, args); 11478 if ($truthy(block['$nil?']())) { 11479 return $send(self.$class(), 'new', [self.object, self.method].concat($to_a(args))) 11480 } return $send(self.object, '__send__', [self.method].concat($to_a(args)), block.$to_proc()); 11481 }, -1); 11482 11483 $def(self, '$size', function $$size() { 11484 var self = this; 11485 11486 if ($truthy(self.size['$respond_to?']("call"))) { 11487 return $send(self.size, 'call', $to_a(self.args)) 11488 } else { 11489 return self.size 11490 } 11491 }); 11492 11493 $def(self, '$with_index', function $$with_index(offset) { 11494 var block = $$with_index.$$p || nil, self = this; 11495 11496 $$with_index.$$p = null; 11497 if (offset == null) offset = 0; 11498 offset = ($truthy(offset) ? ($coerce_to(offset, $$$('Integer'), 'to_int')) : (0)); 11499 if (!$truthy(block)) { 11500 return $send(self, 'enum_for', ["with_index", offset], function $$2(){var self = $$2.$$s == null ? this : $$2.$$s; 11501 11502 return self.$size()}, {$$s: self}) 11503 } 11504 var index = offset; 11505 11506 self.$each.$$p = function() { 11507 var param = $Opal.$destructure(arguments), 11508 value = block(param, index); 11509 11510 index++; 11511 11512 return value; 11513 }; 11514 11515 return self.$each(); 11516 }, -1); 11517 11518 $def(self, '$each_with_index', function $$each_with_index() { 11519 var block = $$each_with_index.$$p || nil, self = this; 11520 11521 $$each_with_index.$$p = null; 11522 if (!(block !== nil)) { 11523 return $send(self, 'enum_for', ["each_with_index"], function $$3(){var self = $$3.$$s == null ? this : $$3.$$s; 11524 11525 return self.$size()}, {$$s: self}) 11526 } $send2(self, $find_super(self, 'each_with_index', $$each_with_index, false, true), 'each_with_index', [], block); 11527 return self.object; 11528 }); 11529 11530 $def(self, '$rewind', function $$rewind() { 11531 var self = this; 11532 11533 11534 self.cursor = 0; 11535 return self; 11536 }); 11537 11538 $def(self, '$peek_values', function $$peek_values() { 11539 var self = this, $ret_or_1 = nil; 11540 11541 11542 self.values = ($truthy(($ret_or_1 = self.values)) ? ($ret_or_1) : ($send(self, 'map', [], function $$4($a){var $post_args, i; 11543 11544 11545 $post_args = $slice(arguments); 11546 i = $post_args; 11547 return i;}, -1))); 11548 if ($truthy($rb_ge(self.cursor, self.values.$length()))) { 11549 $Kernel.$raise($$$('StopIteration'), "iteration reached an end"); 11550 } return self.values['$[]'](self.cursor); 11551 }); 11552 11553 $def(self, '$peek', function $$peek() { 11554 var self = this, values = nil; 11555 11556 11557 values = self.$peek_values(); 11558 if ($truthy($rb_le(values.$length(), 1))) { 11559 return values['$[]'](0) 11560 } else { 11561 return values 11562 } }); 11563 11564 $def(self, '$next_values', function $$next_values() { 11565 var self = this, out = nil; 11566 11567 11568 out = self.$peek_values(); 11569 self.cursor = $rb_plus(self.cursor, 1); 11570 return out; 11571 }); 11572 11573 $def(self, '$next', function $$next() { 11574 var self = this, values = nil; 11575 11576 11577 values = self.$next_values(); 11578 if ($truthy($rb_le(values.$length(), 1))) { 11579 return values['$[]'](0) 11580 } else { 11581 return values 11582 } }); 11583 11584 $def(self, '$feed', function $$feed(arg) { 11585 var self = this; 11586 11587 return self.$raise($$('NotImplementedError'), "Opal doesn't support Enumerator#feed") 11588 }); 11589 11590 $def(self, '$+', function $Enumerator_$plus$5(other) { 11591 var self = this; 11592 11593 return $$$($$$('Enumerator'), 'Chain').$new(self, other) 11594 }); 11595 11596 $def(self, '$inspect', function $$inspect() { 11597 var self = this, result = nil; 11598 11599 11600 result = "#<" + (self.$class()) + ": " + (self.object.$inspect()) + ":" + (self.method); 11601 if ($truthy(self.args['$any?']())) { 11602 result = $rb_plus(result, "(" + (self.args.$inspect()['$[]']($$$('Range').$new(1, -2))) + ")"); 11603 } return $rb_plus(result, ">"); 11604 }); 11605 $alias(self, "with_object", "each_with_object"); 11606 self.$autoload("ArithmeticSequence", "corelib/enumerator/arithmetic_sequence"); 11607 self.$autoload("Chain", "corelib/enumerator/chain"); 11608 self.$autoload("Generator", "corelib/enumerator/generator"); 11609 self.$autoload("Lazy", "corelib/enumerator/lazy"); 11610 return self.$autoload("Yielder", "corelib/enumerator/yielder"); 11611 })('::', null, $nesting); 11612}; 11613 11614Opal.modules["corelib/numeric"] = function(Opal) {/* Generated by Opal 1.7.3 */ 11615 var $klass = Opal.klass, $truthy = Opal.truthy, $Kernel = Opal.Kernel, $def = Opal.def, $to_ary = Opal.to_ary, $return_self = Opal.return_self, $rb_minus = Opal.rb_minus, $rb_times = Opal.rb_times, $rb_lt = Opal.rb_lt, $eqeq = Opal.eqeq, $rb_divide = Opal.rb_divide, $return_val = Opal.return_val, $Opal = Opal.Opal, $slice = Opal.slice, $extract_kwargs = Opal.extract_kwargs, $ensure_kwargs = Opal.ensure_kwargs, $not = Opal.not, $send = Opal.send, $rb_ge = Opal.rb_ge, $rb_le = Opal.rb_le, $rb_plus = Opal.rb_plus, $rb_gt = Opal.rb_gt, $alias = Opal.alias, self = Opal.top, nil = Opal.nil, $$$ = Opal.$$$; 11616 11617 Opal.add_stubs('require,include,instance_of?,class,Float,respond_to?,coerce,__send__,raise,equal?,-,*,div,<,-@,ceil,to_f,denominator,to_r,==,floor,/,%,Complex,zero?,numerator,abs,arg,coerce_to!,round,<=>,compare,is_a?,!,new,enum_for,to_proc,negative?,>=,<=,+,to_i,truncate,>,angle,conj,imag,rect'); 11618 11619 self.$require("corelib/comparable"); 11620 return (function($base, $super) { 11621 var self = $klass($base, $super, 'Numeric'); 11622 11623 11624 11625 self.$include($$$('Comparable')); 11626 11627 $def(self, '$coerce', function $$coerce(other) { 11628 var self = this; 11629 11630 11631 if ($truthy(other['$instance_of?'](self.$class()))) { 11632 return [other, self] 11633 } return [$Kernel.$Float(other), $Kernel.$Float(self)]; 11634 }); 11635 11636 $def(self, '$__coerced__', function $$__coerced__(method, other) { 11637 var $a, $b, self = this, a = nil, b = nil; 11638 11639 if ($truthy(other['$respond_to?']("coerce"))) { 11640 11641 $b = other.$coerce(self), $a = $to_ary($b), (a = ($a[0] == null ? nil : $a[0])), (b = ($a[1] == null ? nil : $a[1])); 11642 return a.$__send__(method, b); 11643 } else 11644 switch (method) { 11645 case "+": 11646 case "-": 11647 case "*": 11648 case "/": 11649 case "%": 11650 case "&": 11651 case "|": 11652 case "^": 11653 case "**": 11654 return $Kernel.$raise($$$('TypeError'), "" + (other.$class()) + " can't be coerced into Numeric") 11655 case ">": 11656 case ">=": 11657 case "<": 11658 case "<=": 11659 case "<=>": 11660 return $Kernel.$raise($$$('ArgumentError'), "comparison of " + (self.$class()) + " with " + (other.$class()) + " failed") 11661 default: 11662 return nil 11663 } 11664 }); 11665 11666 $def(self, '$<=>', function $Numeric_$lt_eq_gt$1(other) { 11667 var self = this; 11668 11669 11670 if ($truthy(self['$equal?'](other))) { 11671 return 0 11672 } return nil; 11673 }); 11674 11675 $def(self, '$+@', $return_self); 11676 11677 $def(self, '$-@', function $Numeric_$minus$$2() { 11678 var self = this; 11679 11680 return $rb_minus(0, self) 11681 }); 11682 11683 $def(self, '$%', function $Numeric_$percent$3(other) { 11684 var self = this; 11685 11686 return $rb_minus(self, $rb_times(other, self.$div(other))) 11687 }); 11688 11689 $def(self, '$abs', function $$abs() { 11690 var self = this; 11691 11692 if ($rb_lt(self, 0)) { 11693 return self['$-@']() 11694 } else { 11695 return self 11696 } 11697 }); 11698 11699 $def(self, '$abs2', function $$abs2() { 11700 var self = this; 11701 11702 return $rb_times(self, self) 11703 }); 11704 11705 $def(self, '$angle', function $$angle() { 11706 var self = this; 11707 11708 if ($rb_lt(self, 0)) { 11709 return $$$($$$('Math'), 'PI') 11710 } else { 11711 return 0 11712 } 11713 }); 11714 11715 $def(self, '$ceil', function $$ceil(ndigits) { 11716 var self = this; 11717 11718 11719 if (ndigits == null) ndigits = 0; 11720 return self.$to_f().$ceil(ndigits); 11721 }, -1); 11722 11723 $def(self, '$conj', $return_self); 11724 11725 $def(self, '$denominator', function $$denominator() { 11726 var self = this; 11727 11728 return self.$to_r().$denominator() 11729 }); 11730 11731 $def(self, '$div', function $$div(other) { 11732 var self = this; 11733 11734 11735 if ($eqeq(other, 0)) { 11736 $Kernel.$raise($$$('ZeroDivisionError'), "divided by o"); 11737 } return $rb_divide(self, other).$floor(); 11738 }); 11739 11740 $def(self, '$divmod', function $$divmod(other) { 11741 var self = this; 11742 11743 return [self.$div(other), self['$%'](other)] 11744 }); 11745 11746 $def(self, '$fdiv', function $$fdiv(other) { 11747 var self = this; 11748 11749 return $rb_divide(self.$to_f(), other) 11750 }); 11751 11752 $def(self, '$floor', function $$floor(ndigits) { 11753 var self = this; 11754 11755 11756 if (ndigits == null) ndigits = 0; 11757 return self.$to_f().$floor(ndigits); 11758 }, -1); 11759 11760 $def(self, '$i', function $$i() { 11761 var self = this; 11762 11763 return $Kernel.$Complex(0, self) 11764 }); 11765 11766 $def(self, '$imag', $return_val(0)); 11767 11768 $def(self, '$integer?', $return_val(false)); 11769 11770 $def(self, '$nonzero?', function $Numeric_nonzero$ques$4() { 11771 var self = this; 11772 11773 if ($truthy(self['$zero?']())) { 11774 return nil 11775 } else { 11776 return self 11777 } 11778 }); 11779 11780 $def(self, '$numerator', function $$numerator() { 11781 var self = this; 11782 11783 return self.$to_r().$numerator() 11784 }); 11785 11786 $def(self, '$polar', function $$polar() { 11787 var self = this; 11788 11789 return [self.$abs(), self.$arg()] 11790 }); 11791 11792 $def(self, '$quo', function $$quo(other) { 11793 var self = this; 11794 11795 return $rb_divide($Opal['$coerce_to!'](self, $$$('Rational'), "to_r"), other) 11796 }); 11797 11798 $def(self, '$real', $return_self); 11799 11800 $def(self, '$real?', $return_val(true)); 11801 11802 $def(self, '$rect', function $$rect() { 11803 var self = this; 11804 11805 return [self, 0] 11806 }); 11807 11808 $def(self, '$round', function $$round(digits) { 11809 var self = this; 11810 return self.$to_f().$round(digits); 11811 }, -1); 11812 11813 $def(self, '$step', function $$step($a, $b, $c) { 11814 var block = $$step.$$p || nil, $post_args, $kwargs, limit, step, to, by, self = this, counter = nil; 11815 11816 $$step.$$p = null; 11817 $post_args = $slice(arguments); 11818 $kwargs = $extract_kwargs($post_args); 11819 $kwargs = $ensure_kwargs($kwargs); 11820 11821 if ($post_args.length > 0) limit = $post_args.shift(); 11822 if ($post_args.length > 0) step = $post_args.shift(); 11823 to = $kwargs.$$smap["to"]; 11824 by = $kwargs.$$smap["by"]; 11825 if (limit !== undefined && to !== undefined) { 11826 $Kernel.$raise($$$('ArgumentError'), "to is given twice"); 11827 } 11828 11829 if (step !== undefined && by !== undefined) { 11830 $Kernel.$raise($$$('ArgumentError'), "step is given twice"); 11831 } 11832 11833 if (to !== undefined) { 11834 limit = to; 11835 } 11836 11837 if (by !== undefined) { 11838 step = by; 11839 } 11840 11841 if (limit === undefined) { 11842 limit = nil; 11843 } 11844 11845 function validateParameters() { 11846 if (step === nil) { 11847 $Kernel.$raise($$$('TypeError'), "step must be numeric"); 11848 } 11849 11850 if (step != null && step['$=='](0)) { 11851 $Kernel.$raise($$$('ArgumentError'), "step can't be 0"); 11852 } 11853 11854 if (step === nil || step == null) { 11855 step = 1; 11856 } 11857 11858 var sign = step['$<=>'](0); 11859 11860 if (sign === nil) { 11861 $Kernel.$raise($$$('ArgumentError'), "0 can't be coerced into " + (step.$class())); 11862 } 11863 11864 if (limit === nil || limit == null) { 11865 limit = sign > 0 ? $$$($$$('Float'), 'INFINITY') : $$$($$$('Float'), 'INFINITY')['$-@'](); 11866 } 11867 11868 $Opal.$compare(self, limit); 11869 } 11870 11871 function stepFloatSize() { 11872 if ((step > 0 && self > limit) || (step < 0 && self < limit)) { 11873 return 0; 11874 } else if (step === Infinity || step === -Infinity) { 11875 return 1; 11876 } else { 11877 var abs = Math.abs, floor = Math.floor, 11878 err = (abs(self) + abs(limit) + abs(limit - self)) / abs(step) * $$$($$$('Float'), 'EPSILON'); 11879 11880 if (err === Infinity || err === -Infinity) { 11881 return 0; 11882 } else { 11883 if (err > 0.5) { 11884 err = 0.5; 11885 } 11886 11887 return floor((limit - self) / step + err) + 1 11888 } 11889 } 11890 } 11891 11892 function stepSize() { 11893 validateParameters(); 11894 11895 if (step === 0) { 11896 return Infinity; 11897 } 11898 11899 if (step % 1 !== 0) { 11900 return stepFloatSize(); 11901 } else if ((step > 0 && self > limit) || (step < 0 && self < limit)) { 11902 return 0; 11903 } else { 11904 var ceil = Math.ceil, abs = Math.abs, 11905 lhs = abs(self - limit) + 1, 11906 rhs = abs(step); 11907 11908 return ceil(lhs / rhs); 11909 } 11910 } 11911 if (!(block !== nil)) { 11912 if ((($not(limit) || ($truthy(limit['$is_a?']($$$('Numeric'))))) && (($not(step) || ($truthy(step['$is_a?']($$$('Numeric')))))))) { 11913 return $$$($$$('Enumerator'), 'ArithmeticSequence').$new([limit, step, ($truthy(to) ? ("to: ") : nil), ($truthy(by) ? ("by: ") : nil)], self) 11914 } else { 11915 return $send(self, 'enum_for', ["step", limit, step], (stepSize).$to_proc()) 11916 } 11917 } 11918 validateParameters(); 11919 11920 var isDesc = step['$negative?'](), 11921 isInf = step['$=='](0) || 11922 (limit === Infinity && !isDesc) || 11923 (limit === -Infinity && isDesc); 11924 11925 if (self.$$is_number && step.$$is_number && limit.$$is_number) { 11926 if (self % 1 === 0 && (isInf || limit % 1 === 0) && step % 1 === 0) { 11927 var value = self; 11928 11929 if (isInf) { 11930 for (;; value += step) { 11931 block(value); 11932 } 11933 } else if (isDesc) { 11934 for (; value >= limit; value += step) { 11935 block(value); 11936 } 11937 } else { 11938 for (; value <= limit; value += step) { 11939 block(value); 11940 } 11941 } 11942 11943 return self; 11944 } else { 11945 var begin = self.$to_f().valueOf(); 11946 step = step.$to_f().valueOf(); 11947 limit = limit.$to_f().valueOf(); 11948 11949 var n = stepFloatSize(); 11950 11951 if (!isFinite(step)) { 11952 if (n !== 0) block(begin); 11953 } else if (step === 0) { 11954 while (true) { 11955 block(begin); 11956 } 11957 } else { 11958 for (var i = 0; i < n; i++) { 11959 var d = i * step + self; 11960 if (step >= 0 ? limit < d : limit > d) { 11961 d = limit; 11962 } 11963 block(d); 11964 } 11965 } 11966 11967 return self; 11968 } 11969 } 11970 counter = self; 11971 while ($truthy(isDesc ? $rb_ge(counter, limit) : $rb_le(counter, limit))) { 11972 11973 Opal.yield1(block, counter); 11974 counter = $rb_plus(counter, step); 11975 } }, -1); 11976 11977 $def(self, '$to_c', function $$to_c() { 11978 var self = this; 11979 11980 return $Kernel.$Complex(self, 0) 11981 }); 11982 11983 $def(self, '$to_int', function $$to_int() { 11984 var self = this; 11985 11986 return self.$to_i() 11987 }); 11988 11989 $def(self, '$truncate', function $$truncate(ndigits) { 11990 var self = this; 11991 11992 11993 if (ndigits == null) ndigits = 0; 11994 return self.$to_f().$truncate(ndigits); 11995 }, -1); 11996 11997 $def(self, '$zero?', function $Numeric_zero$ques$5() { 11998 var self = this; 11999 12000 return self['$=='](0) 12001 }); 12002 12003 $def(self, '$positive?', function $Numeric_positive$ques$6() { 12004 var self = this; 12005 12006 return $rb_gt(self, 0) 12007 }); 12008 12009 $def(self, '$negative?', function $Numeric_negative$ques$7() { 12010 var self = this; 12011 12012 return $rb_lt(self, 0) 12013 }); 12014 12015 $def(self, '$dup', $return_self); 12016 12017 $def(self, '$clone', function $$clone($kwargs) { 12018 var self = this; 12019 12020 12021 $kwargs = $ensure_kwargs($kwargs); 12022 12023 $kwargs.$$smap["freeze"]; return self; 12024 }, -1); 12025 12026 $def(self, '$finite?', $return_val(true)); 12027 12028 $def(self, '$infinite?', $return_val(nil)); 12029 $alias(self, "arg", "angle"); 12030 $alias(self, "conjugate", "conj"); 12031 $alias(self, "imaginary", "imag"); 12032 $alias(self, "magnitude", "abs"); 12033 $alias(self, "modulo", "%"); 12034 $alias(self, "phase", "arg"); 12035 return $alias(self, "rectangular", "rect"); 12036 })('::', null); 12037}; 12038 12039Opal.modules["corelib/array"] = function(Opal) {/* Generated by Opal 1.7.3 */ 12040 var $truthy = Opal.truthy, $falsy = Opal.falsy, $hash_ids = Opal.hash_ids, $yield1 = Opal.yield1, $hash_get = Opal.hash_get, $hash_put = Opal.hash_put, $hash_delete = Opal.hash_delete, $coerce_to = Opal.coerce_to, $respond_to = Opal.respond_to, $deny_frozen_access = Opal.deny_frozen_access, $freeze = Opal.freeze, $klass = Opal.klass, $slice = Opal.slice, $defs = Opal.defs, $Kernel = Opal.Kernel, $def = Opal.def, $Opal = Opal.Opal, $eqeqeq = Opal.eqeqeq, $hash2 = Opal.hash2, $send2 = Opal.send2, $find_super = Opal.find_super, $send = Opal.send, $rb_gt = Opal.rb_gt, $rb_times = Opal.rb_times, $eqeq = Opal.eqeq, $rb_minus = Opal.rb_minus, $to_a = Opal.to_a, $to_ary = Opal.to_ary, $gvars = Opal.gvars, $rb_ge = Opal.rb_ge, $assign_ivar = Opal.assign_ivar, $rb_lt = Opal.rb_lt, $return_self = Opal.return_self, $neqeq = Opal.neqeq, $alias = Opal.alias, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 12041 12042 Opal.add_stubs('require,include,to_a,warn,raise,replace,respond_to?,to_ary,coerce_to?,===,join,to_str,hash,<=>,==,object_id,inspect,enum_for,class,bsearch_index,to_proc,nil?,coerce_to!,>,*,enumerator_size,empty?,size,map,equal?,dup,each,reduce,-,[],dig,eql?,length,exclude_end?,flatten,frozen?,__id__,&,!,intersection,to_s,new,item,max,min,>=,**,delete_if,reverse,rotate,rand,at,keep_if,shuffle!,<,sort,sort_by,!=,times,[]=,<<,uniq,|,values,is_a?,end,begin,upto,reject,push,select,select!,collect,collect!,unshift,pristine,singleton_class'); 12043 12044 self.$require("corelib/enumerable"); 12045 self.$require("corelib/numeric"); 12046 return (function($base, $super, $parent_nesting) { 12047 var self = $klass($base, $super, 'Array'); 12048 12049 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 12050 12051 12052 self.$include($$$('Enumerable')); 12053 Opal.prop(self.$$prototype, '$$is_array', true); 12054 12055 // Recent versions of V8 (> 7.1) only use an optimized implementation when Array.prototype is unmodified. 12056 // For instance, "array-splice.tq" has a "fast path" (ExtractFastJSArray, defined in "src/codegen/code-stub-assembler.cc") 12057 // but it's only enabled when "IsPrototypeInitialArrayPrototype()" is true. 12058 // 12059 // Older versions of V8 were using relatively fast JS-with-extensions code even when Array.prototype is modified: 12060 // https://github.com/v8/v8/blob/7.0.1/src/js/array.js#L599-L642 12061 // 12062 // In short, Array operations are slow in recent versions of V8 when the Array.prototype has been tampered. 12063 // So, when possible, we are using faster open-coded version to boost the performance. 12064 12065 // As of V8 8.4, depending on the size of the array, this is up to ~25x times faster than Array#shift() 12066 // Implementation is heavily inspired by: https://github.com/nodejs/node/blob/ba684805b6c0eded76e5cd89ee00328ac7a59365/lib/internal/util.js#L341-L347 12067 function shiftNoArg(list) { 12068 var r = list[0]; 12069 var index = 1; 12070 var length = list.length; 12071 for (; index < length; index++) { 12072 list[index - 1] = list[index]; 12073 } 12074 list.pop(); 12075 return r; 12076 } 12077 12078 function toArraySubclass(obj, klass) { 12079 if (klass.$$name === Opal.Array) { 12080 return obj; 12081 } else { 12082 return klass.$allocate().$replace((obj).$to_a()); 12083 } 12084 } 12085 12086 // A helper for keep_if and delete_if, filter is either Opal.truthy 12087 // or Opal.falsy. 12088 function filterIf(self, filter, block) { 12089 var value, raised = null, updated = new Array(self.length); 12090 12091 for (var i = 0, i2 = 0, length = self.length; i < length; i++) { 12092 if (!raised) { 12093 try { 12094 value = $yield1(block, self[i]); 12095 } catch(error) { 12096 raised = error; 12097 } 12098 } 12099 12100 if (raised || filter(value)) { 12101 updated[i2] = self[i]; 12102 i2 += 1; 12103 } 12104 } 12105 12106 if (i2 !== i) { 12107 self.splice.apply(self, [0, updated.length].concat(updated)); 12108 self.splice(i2, updated.length); 12109 } 12110 12111 if (raised) throw raised; 12112 } 12113 $defs(self, '$[]', function $Array_$$$1($a) { 12114 var $post_args, objects, self = this; 12115 12116 12117 $post_args = $slice(arguments); 12118 objects = $post_args; 12119 return toArraySubclass(objects, self); }, -1); 12120 12121 $def(self, '$initialize', function $$initialize(size, obj) { 12122 var block = $$initialize.$$p || nil, self = this; 12123 12124 $$initialize.$$p = null; 12125 if (size == null) size = nil; 12126 if (obj == null) obj = nil; 12127 12128 $deny_frozen_access(self); 12129 12130 if (obj !== nil && block !== nil) { 12131 $Kernel.$warn("warning: block supersedes default value argument"); 12132 } 12133 12134 if (size > $$$($$$('Integer'), 'MAX')) { 12135 $Kernel.$raise($$$('ArgumentError'), "array size too big"); 12136 } 12137 12138 if (arguments.length > 2) { 12139 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (arguments.length) + " for 0..2)"); 12140 } 12141 12142 if (arguments.length === 0) { 12143 self.splice(0, self.length); 12144 return self; 12145 } 12146 12147 if (arguments.length === 1) { 12148 if (size.$$is_array) { 12149 self.$replace(size.$to_a()); 12150 return self; 12151 } else if (size['$respond_to?']("to_ary")) { 12152 self.$replace(size.$to_ary()); 12153 return self; 12154 } 12155 } 12156 12157 size = $coerce_to(size, $$$('Integer'), 'to_int'); 12158 12159 if (size < 0) { 12160 $Kernel.$raise($$$('ArgumentError'), "negative array size"); 12161 } 12162 12163 self.splice(0, self.length); 12164 var i, value; 12165 12166 if (block === nil) { 12167 for (i = 0; i < size; i++) { 12168 self.push(obj); 12169 } 12170 } 12171 else { 12172 for (i = 0, value; i < size; i++) { 12173 value = block(i); 12174 self[i] = value; 12175 } 12176 } 12177 12178 return self; 12179 }, -1); 12180 $defs(self, '$try_convert', function $$try_convert(obj) { 12181 12182 return $Opal['$coerce_to?'](obj, $$$('Array'), "to_ary") 12183 }); 12184 12185 $def(self, '$&', function $Array_$$2(other) { 12186 var self = this; 12187 12188 12189 other = ($eqeqeq($$$('Array'), other) ? (other.$to_a()) : (($coerce_to(other, $$$('Array'), 'to_ary')).$to_a())); 12190 12191 var result = [], hash = $hash2([], {}), i, length, item; 12192 12193 for (i = 0, length = other.length; i < length; i++) { 12194 $hash_put(hash, other[i], true); 12195 } 12196 12197 for (i = 0, length = self.length; i < length; i++) { 12198 item = self[i]; 12199 if ($hash_delete(hash, item) !== undefined) { 12200 result.push(item); 12201 } 12202 } 12203 12204 return result; 12205 }); 12206 12207 $def(self, '$|', function $Array_$$3(other) { 12208 var self = this; 12209 12210 12211 other = ($eqeqeq($$$('Array'), other) ? (other.$to_a()) : (($coerce_to(other, $$$('Array'), 'to_ary')).$to_a())); 12212 12213 var hash = $hash2([], {}), i, length; 12214 12215 for (i = 0, length = self.length; i < length; i++) { 12216 $hash_put(hash, self[i], true); 12217 } 12218 12219 for (i = 0, length = other.length; i < length; i++) { 12220 $hash_put(hash, other[i], true); 12221 } 12222 12223 return hash.$keys(); 12224 }); 12225 12226 $def(self, '$*', function $Array_$$4(other) { 12227 var self = this; 12228 12229 12230 if ($truthy(other['$respond_to?']("to_str"))) { 12231 return self.$join(other.$to_str()) 12232 } other = $coerce_to(other, $$$('Integer'), 'to_int'); 12233 if ($truthy(other < 0)) { 12234 $Kernel.$raise($$$('ArgumentError'), "negative argument"); 12235 } 12236 var result = [], 12237 converted = self.$to_a(); 12238 12239 for (var i = 0; i < other; i++) { 12240 result = result.concat(converted); 12241 } 12242 12243 return result; 12244 }); 12245 12246 $def(self, '$+', function $Array_$plus$5(other) { 12247 var self = this; 12248 12249 12250 other = ($eqeqeq($$$('Array'), other) ? (other.$to_a()) : (($coerce_to(other, $$$('Array'), 'to_ary')).$to_a())); 12251 return self.concat(other); }); 12252 12253 $def(self, '$-', function $Array_$minus$6(other) { 12254 var self = this; 12255 12256 12257 other = ($eqeqeq($$$('Array'), other) ? (other.$to_a()) : (($coerce_to(other, $$$('Array'), 'to_ary')).$to_a())); 12258 if ($truthy(self.length === 0)) { 12259 return [] 12260 } if ($truthy(other.length === 0)) { 12261 return self.slice() 12262 } 12263 var result = [], hash = $hash2([], {}), i, length, item; 12264 12265 for (i = 0, length = other.length; i < length; i++) { 12266 $hash_put(hash, other[i], true); 12267 } 12268 12269 for (i = 0, length = self.length; i < length; i++) { 12270 item = self[i]; 12271 if ($hash_get(hash, item) === undefined) { 12272 result.push(item); 12273 } 12274 } 12275 12276 return result; 12277 }); 12278 12279 $def(self, '$<<', function $Array_$lt$lt$7(object) { 12280 var self = this; 12281 12282 12283 $deny_frozen_access(self); 12284 self.push(object); 12285 return self; 12286 }); 12287 12288 $def(self, '$<=>', function $Array_$lt_eq_gt$8(other) { 12289 var self = this; 12290 12291 12292 if ($eqeqeq($$$('Array'), other)) { 12293 other = other.$to_a(); 12294 } else if ($truthy(other['$respond_to?']("to_ary"))) { 12295 other = other.$to_ary().$to_a(); 12296 } else { 12297 return nil 12298 } 12299 if (self.$hash() === other.$hash()) { 12300 return 0; 12301 } 12302 12303 var count = Math.min(self.length, other.length); 12304 12305 for (var i = 0; i < count; i++) { 12306 var tmp = (self[i])['$<=>'](other[i]); 12307 12308 if (tmp !== 0) { 12309 return tmp; 12310 } 12311 } 12312 12313 return (self.length)['$<=>'](other.length); 12314 }); 12315 12316 $def(self, '$==', function $Array_$eq_eq$9(other) { 12317 var self = this; 12318 12319 12320 var recursed = {}; 12321 12322 function _eqeq(array, other) { 12323 var i, length, a, b; 12324 12325 if (array === other) 12326 return true; 12327 12328 if (!other.$$is_array) { 12329 if ($respond_to(other, '$to_ary')) { 12330 return (other)['$=='](array); 12331 } else { 12332 return false; 12333 } 12334 } 12335 12336 if (array.$$constructor !== Array) 12337 array = (array).$to_a(); 12338 if (other.$$constructor !== Array) 12339 other = (other).$to_a(); 12340 12341 if (array.length !== other.length) { 12342 return false; 12343 } 12344 12345 recursed[(array).$object_id()] = true; 12346 12347 for (i = 0, length = array.length; i < length; i++) { 12348 a = array[i]; 12349 b = other[i]; 12350 if (a.$$is_array) { 12351 if (b.$$is_array && b.length !== a.length) { 12352 return false; 12353 } 12354 if (!recursed.hasOwnProperty((a).$object_id())) { 12355 if (!_eqeq(a, b)) { 12356 return false; 12357 } 12358 } 12359 } else { 12360 if (!(a)['$=='](b)) { 12361 return false; 12362 } 12363 } 12364 } 12365 12366 return true; 12367 } 12368 12369 return _eqeq(self, other); 12370 12371 }); 12372 12373 function $array_slice_range(self, index) { 12374 var size = self.length, 12375 exclude, from, to, result; 12376 12377 exclude = index.excl; 12378 from = index.begin === nil ? 0 : $coerce_to(index.begin, Opal.Integer, 'to_int'); 12379 to = index.end === nil ? -1 : $coerce_to(index.end, Opal.Integer, 'to_int'); 12380 12381 if (from < 0) { 12382 from += size; 12383 12384 if (from < 0) { 12385 return nil; 12386 } 12387 } 12388 12389 if (index.excl_rev && index.begin !== nil) { 12390 from += 1; 12391 } 12392 12393 if (from > size) { 12394 return nil; 12395 } 12396 12397 if (to < 0) { 12398 to += size; 12399 12400 if (to < 0) { 12401 return []; 12402 } 12403 } 12404 12405 if (!exclude || index.end === nil) { 12406 to += 1; 12407 } 12408 12409 result = self.slice(from, to); 12410 return result; 12411 } 12412 12413 function $array_slice_arithmetic_seq(self, index) { 12414 var array, out = [], i = 0, pseudorange; 12415 12416 if (index.step < 0) { 12417 pseudorange = { 12418 begin: index.range.end, 12419 end: index.range.begin, 12420 excl: false, 12421 excl_rev: index.range.excl 12422 }; 12423 array = $array_slice_range(self, pseudorange).$reverse(); 12424 } 12425 else { 12426 array = $array_slice_range(self, index.range); 12427 } 12428 12429 while (i < array.length) { 12430 out.push(array[i]); 12431 i += Math.abs(index.step); 12432 } 12433 12434 return out; 12435 } 12436 12437 function $array_slice_index_length(self, index, length) { 12438 var size = self.length, 12439 result; 12440 12441 index = $coerce_to(index, Opal.Integer, 'to_int'); 12442 12443 if (index < 0) { 12444 index += size; 12445 12446 if (index < 0) { 12447 return nil; 12448 } 12449 } 12450 12451 if (length === undefined) { 12452 if (index >= size || index < 0) { 12453 return nil; 12454 } 12455 12456 return self[index]; 12457 } 12458 else { 12459 length = $coerce_to(length, Opal.Integer, 'to_int'); 12460 12461 if (length < 0 || index > size || index < 0) { 12462 return nil; 12463 } 12464 12465 result = self.slice(index, index + length); 12466 } 12467 return result; 12468 } 12469 12470 $def(self, '$[]', function $Array_$$$10(index, length) { 12471 var self = this; 12472 12473 if (index.$$is_range) { 12474 return $array_slice_range(self, index); 12475 } 12476 else if (index.$$is_arithmetic_seq) { 12477 return $array_slice_arithmetic_seq(self, index); 12478 } 12479 else { 12480 return $array_slice_index_length(self, index, length); 12481 } 12482 }, -2); 12483 12484 $def(self, '$[]=', function $Array_$$$eq$11(index, value, extra) { 12485 var self = this, data = nil, length = nil; 12486 $deny_frozen_access(self); 12487 data = nil; 12488 12489 var i, size = self.length; 12490 12491 if (index.$$is_range) { 12492 if (value.$$is_array) 12493 data = value.$to_a(); 12494 else if (value['$respond_to?']("to_ary")) 12495 data = value.$to_ary().$to_a(); 12496 else 12497 data = [value]; 12498 12499 var exclude = index.excl, 12500 from = index.begin === nil ? 0 : $coerce_to(index.begin, Opal.Integer, 'to_int'), 12501 to = index.end === nil ? -1 : $coerce_to(index.end, Opal.Integer, 'to_int'); 12502 12503 if (from < 0) { 12504 from += size; 12505 12506 if (from < 0) { 12507 $Kernel.$raise($$$('RangeError'), "" + (index.$inspect()) + " out of range"); 12508 } 12509 } 12510 12511 if (to < 0) { 12512 to += size; 12513 } 12514 12515 if (!exclude || index.end === nil) { 12516 to += 1; 12517 } 12518 12519 if (from > size) { 12520 for (i = size; i < from; i++) { 12521 self[i] = nil; 12522 } 12523 } 12524 12525 if (to < 0) { 12526 self.splice.apply(self, [from, 0].concat(data)); 12527 } 12528 else { 12529 self.splice.apply(self, [from, to - from].concat(data)); 12530 } 12531 12532 return value; 12533 } else { 12534 if (extra === undefined) { 12535 (length = 1); 12536 } else { 12537 length = value; 12538 value = extra; 12539 12540 if (value.$$is_array) 12541 data = value.$to_a(); 12542 else if (value['$respond_to?']("to_ary")) 12543 data = value.$to_ary().$to_a(); 12544 else 12545 data = [value]; 12546 } 12547 12548 var old; 12549 12550 index = $coerce_to(index, $$$('Integer'), 'to_int'); 12551 length = $coerce_to(length, $$$('Integer'), 'to_int'); 12552 12553 if (index < 0) { 12554 old = index; 12555 index += size; 12556 12557 if (index < 0) { 12558 $Kernel.$raise($$$('IndexError'), "index " + (old) + " too small for array; minimum " + (-self.length)); 12559 } 12560 } 12561 12562 if (length < 0) { 12563 $Kernel.$raise($$$('IndexError'), "negative length (" + (length) + ")"); 12564 } 12565 12566 if (index > size) { 12567 for (i = size; i < index; i++) { 12568 self[i] = nil; 12569 } 12570 } 12571 12572 if (extra === undefined) { 12573 self[index] = value; 12574 } 12575 else { 12576 self.splice.apply(self, [index, length].concat(data)); 12577 } 12578 12579 return value; 12580 } 12581 }, -3); 12582 12583 $def(self, '$any?', function $Array_any$ques$12(pattern) { 12584 var block = $Array_any$ques$12.$$p || nil, self = this; 12585 12586 $Array_any$ques$12.$$p = null; 12587 if (self.length === 0) return false; 12588 return $send2(self, $find_super(self, 'any?', $Array_any$ques$12, false, true), 'any?', [pattern], block); 12589 }, -1); 12590 12591 $def(self, '$assoc', function $$assoc(object) { 12592 var self = this; 12593 12594 12595 for (var i = 0, length = self.length, item; i < length; i++) { 12596 if (item = self[i], item.length && (item[0])['$=='](object)) { 12597 return item; 12598 } 12599 } 12600 12601 return nil; 12602 12603 }); 12604 12605 $def(self, '$at', function $$at(index) { 12606 var self = this; 12607 12608 12609 index = $coerce_to(index, $$$('Integer'), 'to_int'); 12610 12611 if (index < 0) { 12612 index += self.length; 12613 } 12614 12615 if (index < 0 || index >= self.length) { 12616 return nil; 12617 } 12618 12619 return self[index]; 12620 12621 }); 12622 12623 $def(self, '$bsearch_index', function $$bsearch_index() { 12624 var block = $$bsearch_index.$$p || nil, self = this; 12625 12626 $$bsearch_index.$$p = null; 12627 if (!(block !== nil)) { 12628 return self.$enum_for("bsearch_index") 12629 } 12630 var min = 0, 12631 max = self.length, 12632 mid, 12633 val, 12634 ret, 12635 smaller = false, 12636 satisfied = nil; 12637 12638 while (min < max) { 12639 mid = min + Math.floor((max - min) / 2); 12640 val = self[mid]; 12641 ret = $yield1(block, val); 12642 12643 if (ret === true) { 12644 satisfied = mid; 12645 smaller = true; 12646 } 12647 else if (ret === false || ret === nil) { 12648 smaller = false; 12649 } 12650 else if (ret.$$is_number) { 12651 if (ret === 0) { return mid; } 12652 smaller = (ret < 0); 12653 } 12654 else { 12655 $Kernel.$raise($$$('TypeError'), "wrong argument type " + ((ret).$class()) + " (must be numeric, true, false or nil)"); 12656 } 12657 12658 if (smaller) { max = mid; } else { min = mid + 1; } 12659 } 12660 12661 return satisfied; 12662 }); 12663 12664 $def(self, '$bsearch', function $$bsearch() { 12665 var block = $$bsearch.$$p || nil, self = this, index = nil; 12666 12667 $$bsearch.$$p = null; 12668 if (!(block !== nil)) { 12669 return self.$enum_for("bsearch") 12670 } index = $send(self, 'bsearch_index', [], block.$to_proc()); 12671 12672 if (index != null && index.$$is_number) { 12673 return self[index]; 12674 } else { 12675 return index; 12676 } 12677 }); 12678 12679 $def(self, '$cycle', function $$cycle(n) { 12680 var block = $$cycle.$$p || nil, self = this; 12681 12682 $$cycle.$$p = null; 12683 if (n == null) n = nil; 12684 if (!(block !== nil)) { 12685 return $send(self, 'enum_for', ["cycle", n], function $$13(){var self = $$13.$$s == null ? this : $$13.$$s; 12686 12687 if ($truthy(n['$nil?']())) { 12688 return $$$($$$('Float'), 'INFINITY') 12689 } else { 12690 12691 n = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int"); 12692 if ($truthy($rb_gt(n, 0))) { 12693 return $rb_times(self.$enumerator_size(), n) 12694 } else { 12695 return 0 12696 } }}, {$$s: self}) 12697 } if (($truthy(self['$empty?']()) || ($eqeq(n, 0)))) { 12698 return nil 12699 } 12700 var i, length; 12701 12702 if (n === nil) { 12703 while (true) { 12704 for (i = 0, length = self.length; i < length; i++) { 12705 $yield1(block, self[i]); 12706 } 12707 } 12708 } 12709 else { 12710 n = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int"); 12711 if (n <= 0) { 12712 return self; 12713 } 12714 12715 while (n > 0) { 12716 for (i = 0, length = self.length; i < length; i++) { 12717 $yield1(block, self[i]); 12718 } 12719 12720 n--; 12721 } 12722 } 12723 return self; 12724 }, -1); 12725 12726 $def(self, '$clear', function $$clear() { 12727 var self = this; 12728 12729 12730 $deny_frozen_access(self); 12731 self.splice(0, self.length); 12732 return self; 12733 }); 12734 12735 $def(self, '$count', function $$count(object) { 12736 var block = $$count.$$p || nil, self = this; 12737 12738 $$count.$$p = null; 12739 if (($truthy(object !== undefined) || ($truthy(block)))) { 12740 return $send2(self, $find_super(self, 'count', $$count, false, true), 'count', [object], block) 12741 } else { 12742 return self.$size() 12743 } }, -1); 12744 12745 $def(self, '$initialize_copy', function $$initialize_copy(other) { 12746 var self = this; 12747 12748 return self.$replace(other) 12749 }); 12750 12751 $def(self, '$collect', function $$collect() { 12752 var block = $$collect.$$p || nil, self = this; 12753 12754 $$collect.$$p = null; 12755 if (!(block !== nil)) { 12756 return $send(self, 'enum_for', ["collect"], function $$14(){var self = $$14.$$s == null ? this : $$14.$$s; 12757 12758 return self.$size()}, {$$s: self}) 12759 } 12760 var result = []; 12761 12762 for (var i = 0, length = self.length; i < length; i++) { 12763 var value = $yield1(block, self[i]); 12764 result.push(value); 12765 } 12766 12767 return result; 12768 }); 12769 12770 $def(self, '$collect!', function $Array_collect$excl$15() { 12771 var block = $Array_collect$excl$15.$$p || nil, self = this; 12772 12773 $Array_collect$excl$15.$$p = null; 12774 if (!(block !== nil)) { 12775 return $send(self, 'enum_for', ["collect!"], function $$16(){var self = $$16.$$s == null ? this : $$16.$$s; 12776 12777 return self.$size()}, {$$s: self}) 12778 } 12779 $deny_frozen_access(self); 12780 12781 for (var i = 0, length = self.length; i < length; i++) { 12782 var value = $yield1(block, self[i]); 12783 self[i] = value; 12784 } 12785 return self; 12786 }); 12787 12788 function binomial_coefficient(n, k) { 12789 if (n === k || k === 0) { 12790 return 1; 12791 } 12792 12793 if (k > 0 && n > k) { 12794 return binomial_coefficient(n - 1, k - 1) + binomial_coefficient(n - 1, k); 12795 } 12796 12797 return 0; 12798 } 12799 12800 $def(self, '$combination', function $$combination(n) { 12801 var $yield = $$combination.$$p || nil, self = this, num = nil; 12802 12803 $$combination.$$p = null; 12804 12805 num = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int"); 12806 if (!($yield !== nil)) { 12807 return $send(self, 'enum_for', ["combination", num], function $$17(){var self = $$17.$$s == null ? this : $$17.$$s; 12808 12809 return binomial_coefficient(self.length, num)}, {$$s: self}) 12810 } 12811 var i, length, stack, chosen, lev, done, next; 12812 12813 if (num === 0) { 12814 Opal.yield1($yield, []); 12815 } else if (num === 1) { 12816 for (i = 0, length = self.length; i < length; i++) { 12817 Opal.yield1($yield, [self[i]]); 12818 } 12819 } 12820 else if (num === self.length) { 12821 Opal.yield1($yield, self.slice()); 12822 } 12823 else if (num >= 0 && num < self.length) { 12824 stack = []; 12825 for (i = 0; i <= num + 1; i++) { 12826 stack.push(0); 12827 } 12828 12829 chosen = []; 12830 lev = 0; 12831 done = false; 12832 stack[0] = -1; 12833 12834 while (!done) { 12835 chosen[lev] = self[stack[lev+1]]; 12836 while (lev < num - 1) { 12837 lev++; 12838 next = stack[lev+1] = stack[lev] + 1; 12839 chosen[lev] = self[next]; 12840 } 12841 Opal.yield1($yield, chosen.slice()); 12842 lev++; 12843 do { 12844 done = (lev === 0); 12845 stack[lev]++; 12846 lev--; 12847 } while ( stack[lev+1] + num === self.length + lev + 1 ); 12848 } 12849 } 12850 return self; 12851 }); 12852 12853 $def(self, '$repeated_combination', function $$repeated_combination(n) { 12854 var $yield = $$repeated_combination.$$p || nil, self = this, num = nil; 12855 12856 $$repeated_combination.$$p = null; 12857 12858 num = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int"); 12859 if (!($yield !== nil)) { 12860 return $send(self, 'enum_for', ["repeated_combination", num], function $$18(){var self = $$18.$$s == null ? this : $$18.$$s; 12861 12862 return binomial_coefficient(self.length + num - 1, num);}, {$$s: self}) 12863 } 12864 function iterate(max, from, buffer, self) { 12865 if (buffer.length == max) { 12866 var copy = buffer.slice(); 12867 Opal.yield1($yield, copy); 12868 return; 12869 } 12870 for (var i = from; i < self.length; i++) { 12871 buffer.push(self[i]); 12872 iterate(max, i, buffer, self); 12873 buffer.pop(); 12874 } 12875 } 12876 12877 if (num >= 0) { 12878 iterate(num, 0, [], self); 12879 } 12880 return self; 12881 }); 12882 12883 $def(self, '$compact', function $$compact() { 12884 var self = this; 12885 12886 12887 var result = []; 12888 12889 for (var i = 0, length = self.length, item; i < length; i++) { 12890 if ((item = self[i]) !== nil) { 12891 result.push(item); 12892 } 12893 } 12894 12895 return result; 12896 12897 }); 12898 12899 $def(self, '$compact!', function $Array_compact$excl$19() { 12900 var self = this; 12901 12902 12903 $deny_frozen_access(self); 12904 12905 var original = self.length; 12906 12907 for (var i = 0, length = self.length; i < length; i++) { 12908 if (self[i] === nil) { 12909 self.splice(i, 1); 12910 12911 length--; 12912 i--; 12913 } 12914 } 12915 12916 return self.length === original ? nil : self; 12917 12918 }); 12919 12920 $def(self, '$concat', function $$concat($a) { 12921 var $post_args, others, self = this; 12922 12923 12924 $post_args = $slice(arguments); 12925 others = $post_args; 12926 $deny_frozen_access(self); 12927 others = $send(others, 'map', [], function $$20(other){var self = $$20.$$s == null ? this : $$20.$$s; 12928 12929 12930 if (other == null) other = nil; 12931 other = ($eqeqeq($$$('Array'), other) ? (other.$to_a()) : (($coerce_to(other, $$$('Array'), 'to_ary')).$to_a())); 12932 if ($truthy(other['$equal?'](self))) { 12933 other = other.$dup(); 12934 } return other;}, {$$s: self}); 12935 $send(others, 'each', [], function $$21(other){var self = $$21.$$s == null ? this : $$21.$$s; 12936 12937 12938 if (other == null) other = nil; 12939 12940 for (var i = 0, length = other.length; i < length; i++) { 12941 self.push(other[i]); 12942 } 12943}, {$$s: self}); 12944 return self; 12945 }, -1); 12946 12947 $def(self, '$delete', function $Array_delete$22(object) { 12948 var $yield = $Array_delete$22.$$p || nil, self = this; 12949 12950 $Array_delete$22.$$p = null; 12951 12952 var original = self.length; 12953 12954 for (var i = 0, length = original; i < length; i++) { 12955 if ((self[i])['$=='](object)) { 12956 $deny_frozen_access(self); 12957 12958 self.splice(i, 1); 12959 12960 length--; 12961 i--; 12962 } 12963 } 12964 12965 if (self.length === original) { 12966 if (($yield !== nil)) { 12967 return Opal.yieldX($yield, []); 12968 } 12969 return nil; 12970 } 12971 return object; 12972 12973 }); 12974 12975 $def(self, '$delete_at', function $$delete_at(index) { 12976 var self = this; 12977 12978 12979 $deny_frozen_access(self); 12980 12981 index = $coerce_to(index, $$$('Integer'), 'to_int'); 12982 12983 if (index < 0) { 12984 index += self.length; 12985 } 12986 12987 if (index < 0 || index >= self.length) { 12988 return nil; 12989 } 12990 12991 var result = self[index]; 12992 12993 self.splice(index, 1); 12994 12995 return result; 12996 12997 }); 12998 12999 $def(self, '$delete_if', function $$delete_if() { 13000 var block = $$delete_if.$$p || nil, self = this; 13001 13002 $$delete_if.$$p = null; 13003 if (!(block !== nil)) { 13004 return $send(self, 'enum_for', ["delete_if"], function $$23(){var self = $$23.$$s == null ? this : $$23.$$s; 13005 13006 return self.$size()}, {$$s: self}) 13007 } 13008 $deny_frozen_access(self); 13009 13010 filterIf(self, $falsy, block) 13011 ; 13012 return self; 13013 }); 13014 13015 $def(self, '$difference', function $$difference($a) { 13016 var $post_args, arrays, self = this; 13017 13018 13019 $post_args = $slice(arguments); 13020 arrays = $post_args; 13021 return $send(arrays, 'reduce', [self.$to_a().$dup()], function $$24(a, b){ 13022 13023 if (a == null) a = nil; 13024 if (b == null) b = nil; 13025 return $rb_minus(a, b);}); 13026 }, -1); 13027 13028 $def(self, '$dig', function $$dig(idx, $a) { 13029 var $post_args, idxs, self = this, item = nil; 13030 13031 13032 $post_args = $slice(arguments, 1); 13033 idxs = $post_args; 13034 item = self['$[]'](idx); 13035 13036 if (item === nil || idxs.length === 0) { 13037 return item; 13038 } 13039 if (!$truthy(item['$respond_to?']("dig"))) { 13040 $Kernel.$raise($$$('TypeError'), "" + (item.$class()) + " does not have #dig method"); 13041 } return $send(item, 'dig', $to_a(idxs)); 13042 }, -2); 13043 13044 $def(self, '$drop', function $$drop(number) { 13045 var self = this; 13046 13047 13048 number = $coerce_to(number, $$$('Integer'), 'to_int'); 13049 13050 if (number < 0) { 13051 $Kernel.$raise($$$('ArgumentError')); 13052 } 13053 13054 return self.slice(number); 13055 13056 }); 13057 13058 $def(self, '$dup', function $$dup() { 13059 var $yield = $$dup.$$p || nil, self = this; 13060 13061 $$dup.$$p = null; 13062 13063 13064 if (self.$$class === Opal.Array && 13065 self.$$class.$allocate.$$pristine && 13066 self.$copy_instance_variables.$$pristine && 13067 self.$initialize_dup.$$pristine) { 13068 return self.slice(0); 13069 } 13070 return $send2(self, $find_super(self, 'dup', $$dup, false, true), 'dup', [], $yield); 13071 }); 13072 13073 $def(self, '$each', function $$each() { 13074 var block = $$each.$$p || nil, self = this; 13075 13076 $$each.$$p = null; 13077 if (!(block !== nil)) { 13078 return $send(self, 'enum_for', ["each"], function $$25(){var self = $$25.$$s == null ? this : $$25.$$s; 13079 13080 return self.$size()}, {$$s: self}) 13081 } 13082 for (var i = 0, length = self.length; i < length; i++) { 13083 $yield1(block, self[i]); 13084 } 13085 return self; 13086 }); 13087 13088 $def(self, '$each_index', function $$each_index() { 13089 var block = $$each_index.$$p || nil, self = this; 13090 13091 $$each_index.$$p = null; 13092 if (!(block !== nil)) { 13093 return $send(self, 'enum_for', ["each_index"], function $$26(){var self = $$26.$$s == null ? this : $$26.$$s; 13094 13095 return self.$size()}, {$$s: self}) 13096 } 13097 for (var i = 0, length = self.length; i < length; i++) { 13098 $yield1(block, i); 13099 } 13100 return self; 13101 }); 13102 13103 $def(self, '$empty?', function $Array_empty$ques$27() { 13104 var self = this; 13105 13106 return self.length === 0; 13107 }); 13108 13109 $def(self, '$eql?', function $Array_eql$ques$28(other) { 13110 var self = this; 13111 13112 13113 var recursed = {}; 13114 13115 function _eql(array, other) { 13116 var i, length, a, b; 13117 13118 if (!other.$$is_array) { 13119 return false; 13120 } 13121 13122 other = other.$to_a(); 13123 13124 if (array.length !== other.length) { 13125 return false; 13126 } 13127 13128 recursed[(array).$object_id()] = true; 13129 13130 for (i = 0, length = array.length; i < length; i++) { 13131 a = array[i]; 13132 b = other[i]; 13133 if (a.$$is_array) { 13134 if (b.$$is_array && b.length !== a.length) { 13135 return false; 13136 } 13137 if (!recursed.hasOwnProperty((a).$object_id())) { 13138 if (!_eql(a, b)) { 13139 return false; 13140 } 13141 } 13142 } else { 13143 if (!(a)['$eql?'](b)) { 13144 return false; 13145 } 13146 } 13147 } 13148 13149 return true; 13150 } 13151 13152 return _eql(self, other); 13153 13154 }); 13155 13156 $def(self, '$fetch', function $$fetch(index, defaults) { 13157 var block = $$fetch.$$p || nil, self = this; 13158 13159 $$fetch.$$p = null; 13160 13161 var original = index; 13162 13163 index = $coerce_to(index, $$$('Integer'), 'to_int'); 13164 13165 if (index < 0) { 13166 index += self.length; 13167 } 13168 13169 if (index >= 0 && index < self.length) { 13170 return self[index]; 13171 } 13172 13173 if (block !== nil && defaults != null) { 13174 self.$warn("warning: block supersedes default value argument"); 13175 } 13176 13177 if (block !== nil) { 13178 return block(original); 13179 } 13180 13181 if (defaults != null) { 13182 return defaults; 13183 } 13184 13185 if (self.length === 0) { 13186 $Kernel.$raise($$$('IndexError'), "index " + (original) + " outside of array bounds: 0...0"); 13187 } 13188 else { 13189 $Kernel.$raise($$$('IndexError'), "index " + (original) + " outside of array bounds: -" + (self.length) + "..." + (self.length)); 13190 } 13191 }, -2); 13192 13193 $def(self, '$fill', function $$fill($a) { 13194 var block = $$fill.$$p || nil, $post_args, args, $b, $c, self = this, one = nil, two = nil, obj = nil, left = nil, right = nil; 13195 13196 $$fill.$$p = null; 13197 $post_args = $slice(arguments); 13198 args = $post_args; 13199 13200 $deny_frozen_access(self); 13201 13202 var i, value; 13203 if ($truthy(block)) { 13204 13205 if ($truthy(args.length > 2)) { 13206 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (args.$length()) + " for 0..2)"); 13207 } $c = args, $b = $to_ary($c), (one = ($b[0] == null ? nil : $b[0])), (two = ($b[1] == null ? nil : $b[1])); 13208 } else { 13209 13210 if ($truthy(args.length == 0)) { 13211 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (0 for 1..3)"); 13212 } else if ($truthy(args.length > 3)) { 13213 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (args.$length()) + " for 1..3)"); 13214 } $c = args, $b = $to_ary($c), (obj = ($b[0] == null ? nil : $b[0])), (one = ($b[1] == null ? nil : $b[1])), (two = ($b[2] == null ? nil : $b[2])); 13215 } if ($eqeqeq($$$('Range'), one)) { 13216 13217 if ($truthy(two)) { 13218 $Kernel.$raise($$$('TypeError'), "length invalid with range"); 13219 } left = one.begin === nil ? 0 : $coerce_to(one.begin, $$$('Integer'), 'to_int'); 13220 if ($truthy(left < 0)) { 13221 left += this.length; 13222 } if ($truthy(left < 0)) { 13223 $Kernel.$raise($$$('RangeError'), "" + (one.$inspect()) + " out of range"); 13224 } right = one.end === nil ? -1 : $coerce_to(one.end, $$$('Integer'), 'to_int'); 13225 if ($truthy(right < 0)) { 13226 right += this.length; 13227 } if (!$truthy(one['$exclude_end?']())) { 13228 right += 1; 13229 } if ($truthy(right <= left)) { 13230 return self 13231 } } else if ($truthy(one)) { 13232 13233 left = $coerce_to(one, $$$('Integer'), 'to_int'); 13234 if ($truthy(left < 0)) { 13235 left += this.length; 13236 } if ($truthy(left < 0)) { 13237 left = 0; 13238 } if ($truthy(two)) { 13239 13240 right = $coerce_to(two, $$$('Integer'), 'to_int'); 13241 if ($truthy(right == 0)) { 13242 return self 13243 } right += left; 13244 } else { 13245 right = this.length; 13246 } } else { 13247 13248 left = 0; 13249 right = this.length; 13250 } if ($truthy(left > this.length)) { 13251 13252 for (i = this.length; i < right; i++) { 13253 self[i] = nil; 13254 } 13255 13256 } if ($truthy(right > this.length)) { 13257 this.length = right; 13258 } if ($truthy(block)) { 13259 13260 for (this.length; left < right; left++) { 13261 value = block(left); 13262 self[left] = value; 13263 } 13264 13265 } else { 13266 13267 for (this.length; left < right; left++) { 13268 self[left] = obj; 13269 } 13270 13271 } return self; 13272 }, -1); 13273 13274 $def(self, '$first', function $$first(count) { 13275 var self = this; 13276 13277 if (count == null) { 13278 return self.length === 0 ? nil : self[0]; 13279 } 13280 13281 count = $coerce_to(count, $$$('Integer'), 'to_int'); 13282 13283 if (count < 0) { 13284 $Kernel.$raise($$$('ArgumentError'), "negative array size"); 13285 } 13286 13287 return self.slice(0, count); 13288 }, -1); 13289 13290 $def(self, '$flatten', function $$flatten(level) { 13291 var self = this; 13292 13293 function _flatten(array, level) { 13294 var result = [], 13295 i, length, 13296 item, ary; 13297 13298 array = (array).$to_a(); 13299 13300 for (i = 0, length = array.length; i < length; i++) { 13301 item = array[i]; 13302 13303 if (!$respond_to(item, '$to_ary', true)) { 13304 result.push(item); 13305 continue; 13306 } 13307 13308 ary = (item).$to_ary(); 13309 13310 if (ary === nil) { 13311 result.push(item); 13312 continue; 13313 } 13314 13315 if (!ary.$$is_array) { 13316 $Kernel.$raise($$$('TypeError')); 13317 } 13318 13319 if (ary === self) { 13320 $Kernel.$raise($$$('ArgumentError')); 13321 } 13322 13323 switch (level) { 13324 case undefined: 13325 result = result.concat(_flatten(ary)); 13326 break; 13327 case 0: 13328 result.push(ary); 13329 break; 13330 default: 13331 result.push.apply(result, _flatten(ary, level - 1)); 13332 } 13333 } 13334 return result; 13335 } 13336 13337 if (level !== undefined) { 13338 level = $coerce_to(level, $$$('Integer'), 'to_int'); 13339 } 13340 13341 return _flatten(self, level); 13342 }, -1); 13343 13344 $def(self, '$flatten!', function $Array_flatten$excl$29(level) { 13345 var self = this; 13346 13347 $deny_frozen_access(self); 13348 13349 var flattened = self.$flatten(level); 13350 13351 if (self.length == flattened.length) { 13352 for (var i = 0, length = self.length; i < length; i++) { 13353 if (self[i] !== flattened[i]) { 13354 break; 13355 } 13356 } 13357 13358 if (i == length) { 13359 return nil; 13360 } 13361 } 13362 13363 self.$replace(flattened); 13364 return self; 13365 }, -1); 13366 13367 $def(self, '$freeze', function $$freeze() { 13368 var self = this; 13369 13370 13371 if ($truthy(self['$frozen?']())) { 13372 return self 13373 } return $freeze(self); }); 13374 13375 $def(self, '$hash', function $$hash() { 13376 var self = this; 13377 13378 13379 var top = ($hash_ids === undefined), 13380 result = ['A'], 13381 hash_id = self.$object_id(), 13382 item, i, key; 13383 13384 try { 13385 if (top) { 13386 $hash_ids = Object.create(null); 13387 } 13388 13389 // return early for recursive structures 13390 if ($hash_ids[hash_id]) { 13391 return 'self'; 13392 } 13393 13394 for (key in $hash_ids) { 13395 item = $hash_ids[key]; 13396 if (self['$eql?'](item)) { 13397 return 'self'; 13398 } 13399 } 13400 13401 $hash_ids[hash_id] = self; 13402 13403 for (i = 0; i < self.length; i++) { 13404 item = self[i]; 13405 result.push(item.$hash()); 13406 } 13407 13408 return result.join(','); 13409 } finally { 13410 if (top) { 13411 $hash_ids = undefined; 13412 } 13413 } 13414 13415 }); 13416 13417 $def(self, '$include?', function $Array_include$ques$30(member) { 13418 var self = this; 13419 13420 13421 for (var i = 0, length = self.length; i < length; i++) { 13422 if ((self[i])['$=='](member)) { 13423 return true; 13424 } 13425 } 13426 13427 return false; 13428 13429 }); 13430 13431 $def(self, '$index', function $$index(object) { 13432 var block = $$index.$$p || nil, self = this; 13433 13434 $$index.$$p = null; 13435 13436 var i, length, value; 13437 13438 if (object != null && block !== nil) { 13439 self.$warn("warning: given block not used"); 13440 } 13441 13442 if (object != null) { 13443 for (i = 0, length = self.length; i < length; i++) { 13444 if ((self[i])['$=='](object)) { 13445 return i; 13446 } 13447 } 13448 } 13449 else if (block !== nil) { 13450 for (i = 0, length = self.length; i < length; i++) { 13451 value = block(self[i]); 13452 13453 if (value !== false && value !== nil) { 13454 return i; 13455 } 13456 } 13457 } 13458 else { 13459 return self.$enum_for("index"); 13460 } 13461 13462 return nil; 13463 }, -1); 13464 13465 $def(self, '$insert', function $$insert(index, $a) { 13466 var $post_args, objects, self = this; 13467 13468 13469 $post_args = $slice(arguments, 1); 13470 objects = $post_args; 13471 13472 $deny_frozen_access(self); 13473 13474 index = $coerce_to(index, $$$('Integer'), 'to_int'); 13475 13476 if (objects.length > 0) { 13477 if (index < 0) { 13478 index += self.length + 1; 13479 13480 if (index < 0) { 13481 $Kernel.$raise($$$('IndexError'), "" + (index) + " is out of bounds"); 13482 } 13483 } 13484 if (index > self.length) { 13485 for (var i = self.length; i < index; i++) { 13486 self.push(nil); 13487 } 13488 } 13489 13490 self.splice.apply(self, [index, 0].concat(objects)); 13491 } 13492 return self; 13493 }, -2); 13494 var inspect_stack = []; 13495 13496 $def(self, '$inspect', function $$inspect() { 13497 var self = this; 13498 13499 13500 13501 var result = [], 13502 id = self.$__id__(), 13503 pushed = true; 13504 13505 return (function() { try { 13506 13507 13508 if (inspect_stack.indexOf(id) !== -1) { 13509 pushed = false; 13510 return '[...]'; 13511 } 13512 inspect_stack.push(id); 13513 13514 for (var i = 0, length = self.length; i < length; i++) { 13515 var item = self['$[]'](i); 13516 13517 result.push($$('Opal').$inspect(item)); 13518 } 13519 13520 return '[' + result.join(', ') + ']'; 13521 ; 13522 return nil; 13523 } finally { 13524 if (pushed) inspect_stack.pop(); 13525 } })(); }); 13526 13527 $def(self, '$intersection', function $$intersection($a) { 13528 var $post_args, arrays, self = this; 13529 13530 13531 $post_args = $slice(arguments); 13532 arrays = $post_args; 13533 return $send(arrays, 'reduce', [self.$to_a().$dup()], function $$31(a, b){ 13534 13535 if (a == null) a = nil; 13536 if (b == null) b = nil; 13537 return a['$&'](b);}); 13538 }, -1); 13539 13540 $def(self, '$intersect?', function $Array_intersect$ques$32(other) { 13541 var self = this; 13542 13543 return self.$intersection(other)['$empty?']()['$!']() 13544 }); 13545 13546 $def(self, '$join', function $$join(sep) { 13547 var self = this; 13548 if ($gvars[","] == null) $gvars[","] = nil; 13549 13550 13551 if (sep == null) sep = nil; 13552 if ($truthy(self.length === 0)) { 13553 return "" 13554 } if ($truthy(sep === nil)) { 13555 sep = $gvars[","]; 13556 } 13557 var result = []; 13558 var i, length, item, tmp; 13559 13560 for (i = 0, length = self.length; i < length; i++) { 13561 item = self[i]; 13562 13563 if ($respond_to(item, '$to_str')) { 13564 tmp = (item).$to_str(); 13565 13566 if (tmp !== nil) { 13567 result.push((tmp).$to_s()); 13568 13569 continue; 13570 } 13571 } 13572 13573 if ($respond_to(item, '$to_ary')) { 13574 tmp = (item).$to_ary(); 13575 13576 if (tmp === self) { 13577 $Kernel.$raise($$$('ArgumentError')); 13578 } 13579 13580 if (tmp !== nil) { 13581 result.push((tmp).$join(sep)); 13582 13583 continue; 13584 } 13585 } 13586 13587 if ($respond_to(item, '$to_s')) { 13588 tmp = (item).$to_s(); 13589 13590 if (tmp !== nil) { 13591 result.push(tmp); 13592 13593 continue; 13594 } 13595 } 13596 13597 $Kernel.$raise($$$('NoMethodError').$new("" + ($$('Opal').$inspect(self.$item())) + " doesn't respond to #to_str, #to_ary or #to_s", "to_str")); 13598 } 13599 13600 if (sep === nil) { 13601 return result.join(''); 13602 } 13603 else { 13604 return result.join($Opal['$coerce_to!'](sep, $$$('String'), "to_str").$to_s()); 13605 } 13606 }, -1); 13607 13608 $def(self, '$keep_if', function $$keep_if() { 13609 var block = $$keep_if.$$p || nil, self = this; 13610 13611 $$keep_if.$$p = null; 13612 if (!(block !== nil)) { 13613 return $send(self, 'enum_for', ["keep_if"], function $$33(){var self = $$33.$$s == null ? this : $$33.$$s; 13614 13615 return self.$size()}, {$$s: self}) 13616 } 13617 $deny_frozen_access(self); 13618 13619 filterIf(self, $truthy, block) 13620 ; 13621 return self; 13622 }); 13623 13624 $def(self, '$last', function $$last(count) { 13625 var self = this; 13626 13627 if (count == null) { 13628 return self.length === 0 ? nil : self[self.length - 1]; 13629 } 13630 13631 count = $coerce_to(count, $$$('Integer'), 'to_int'); 13632 13633 if (count < 0) { 13634 $Kernel.$raise($$$('ArgumentError'), "negative array size"); 13635 } 13636 13637 if (count > self.length) { 13638 count = self.length; 13639 } 13640 13641 return self.slice(self.length - count, self.length); 13642 }, -1); 13643 13644 $def(self, '$length', function $$length() { 13645 var self = this; 13646 13647 return self.length; 13648 }); 13649 13650 $def(self, '$max', function $$max(n) { 13651 var block = $$max.$$p || nil, self = this; 13652 13653 $$max.$$p = null; 13654 return $send(self.$each(), 'max', [n], block.$to_proc()); 13655 }, -1); 13656 13657 $def(self, '$min', function $$min() { 13658 var block = $$min.$$p || nil, self = this; 13659 13660 $$min.$$p = null; 13661 return $send(self.$each(), 'min', [], block.$to_proc()); 13662 }); 13663 13664 // Returns the product of from, from-1, ..., from - how_many + 1. 13665 function descending_factorial(from, how_many) { 13666 var count = how_many >= 0 ? 1 : 0; 13667 while (how_many) { 13668 count *= from; 13669 from--; 13670 how_many--; 13671 } 13672 return count; 13673 } 13674 13675 $def(self, '$permutation', function $$permutation(num) { 13676 var block = $$permutation.$$p || nil, self = this, perm = nil, used = nil; 13677 13678 $$permutation.$$p = null; 13679 if (!(block !== nil)) { 13680 return $send(self, 'enum_for', ["permutation", num], function $$34(){var self = $$34.$$s == null ? this : $$34.$$s; 13681 13682 return descending_factorial(self.length, num === undefined ? self.length : num);}, {$$s: self}) 13683 } 13684 var permute, offensive, output; 13685 13686 if (num === undefined) { 13687 num = self.length; 13688 } 13689 else { 13690 num = $coerce_to(num, $$$('Integer'), 'to_int'); 13691 } 13692 13693 if (num < 0 || self.length < num) ; 13694 else if (num === 0) { 13695 // exactly one permutation: the zero-length array 13696 Opal.yield1(block, []); 13697 } 13698 else if (num === 1) { 13699 // this is a special, easy case 13700 for (var i = 0; i < self.length; i++) { 13701 Opal.yield1(block, [self[i]]); 13702 } 13703 } 13704 else { 13705 // this is the general case 13706 (perm = $$('Array').$new(num)); 13707 (used = $$('Array').$new(self.length, false)); 13708 13709 permute = function(num, perm, index, used, blk) { 13710 self = this; 13711 for(var i = 0; i < self.length; i++){ 13712 if(used['$[]'](i)['$!']()) { 13713 perm[index] = i; 13714 if(index < num - 1) { 13715 used[i] = true; 13716 permute.call(self, num, perm, index + 1, used, blk); 13717 used[i] = false; 13718 } 13719 else { 13720 output = []; 13721 for (var j = 0; j < perm.length; j++) { 13722 output.push(self[perm[j]]); 13723 } 13724 $yield1(blk, output); 13725 } 13726 } 13727 } 13728 }; 13729 13730 if ((block !== nil)) { 13731 // offensive (both definitions) copy. 13732 offensive = self.slice(); 13733 permute.call(offensive, num, perm, 0, used, block); 13734 } 13735 else { 13736 permute.call(self, num, perm, 0, used, block); 13737 } 13738 } 13739 return self; 13740 }, -1); 13741 13742 $def(self, '$repeated_permutation', function $$repeated_permutation(n) { 13743 var $yield = $$repeated_permutation.$$p || nil, self = this, num = nil; 13744 13745 $$repeated_permutation.$$p = null; 13746 13747 num = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int"); 13748 if (!($yield !== nil)) { 13749 return $send(self, 'enum_for', ["repeated_permutation", num], function $$35(){var self = $$35.$$s == null ? this : $$35.$$s; 13750 13751 if ($truthy($rb_ge(num, 0))) { 13752 return self.$size()['$**'](num) 13753 } else { 13754 return 0 13755 }}, {$$s: self}) 13756 } 13757 function iterate(max, buffer, self) { 13758 if (buffer.length == max) { 13759 var copy = buffer.slice(); 13760 Opal.yield1($yield, copy); 13761 return; 13762 } 13763 for (var i = 0; i < self.length; i++) { 13764 buffer.push(self[i]); 13765 iterate(max, buffer, self); 13766 buffer.pop(); 13767 } 13768 } 13769 13770 iterate(num, [], self.slice()); 13771 return self; 13772 }); 13773 13774 $def(self, '$pop', function $$pop(count) { 13775 var self = this; 13776 $deny_frozen_access(self); 13777 if ($truthy(count === undefined)) { 13778 13779 if ($truthy(self.length === 0)) { 13780 return nil 13781 } return self.pop(); 13782 } count = $coerce_to(count, $$$('Integer'), 'to_int'); 13783 if ($truthy(count < 0)) { 13784 $Kernel.$raise($$$('ArgumentError'), "negative array size"); 13785 } if ($truthy(self.length === 0)) { 13786 return [] 13787 } if ($truthy(count === 1)) { 13788 return [self.pop()]; 13789 } else if ($truthy(count > self.length)) { 13790 return self.splice(0, self.length); 13791 } else { 13792 return self.splice(self.length - count, self.length); 13793 } }, -1); 13794 13795 $def(self, '$product', function $$product($a) { 13796 var block = $$product.$$p || nil, $post_args, args, self = this; 13797 13798 $$product.$$p = null; 13799 $post_args = $slice(arguments); 13800 args = $post_args; 13801 13802 var result = (block !== nil) ? null : [], 13803 n = args.length + 1, 13804 counters = new Array(n), 13805 lengths = new Array(n), 13806 arrays = new Array(n), 13807 i, m, subarray, len, resultlen = 1; 13808 13809 arrays[0] = self; 13810 for (i = 1; i < n; i++) { 13811 arrays[i] = $coerce_to(args[i - 1], $$$('Array'), 'to_ary'); 13812 } 13813 13814 for (i = 0; i < n; i++) { 13815 len = arrays[i].length; 13816 if (len === 0) { 13817 return result || self; 13818 } 13819 resultlen *= len; 13820 if (resultlen > 2147483647) { 13821 $Kernel.$raise($$$('RangeError'), "too big to product"); 13822 } 13823 lengths[i] = len; 13824 counters[i] = 0; 13825 } 13826 13827 outer_loop: for (;;) { 13828 subarray = []; 13829 for (i = 0; i < n; i++) { 13830 subarray.push(arrays[i][counters[i]]); 13831 } 13832 if (result) { 13833 result.push(subarray); 13834 } else { 13835 Opal.yield1(block, subarray); 13836 } 13837 m = n - 1; 13838 counters[m]++; 13839 while (counters[m] === lengths[m]) { 13840 counters[m] = 0; 13841 if (--m < 0) break outer_loop; 13842 counters[m]++; 13843 } 13844 } 13845 13846 return result || self; 13847 }, -1); 13848 13849 $def(self, '$push', function $$push($a) { 13850 var $post_args, objects, self = this; 13851 13852 13853 $post_args = $slice(arguments); 13854 objects = $post_args; 13855 13856 $deny_frozen_access(self); 13857 13858 for (var i = 0, length = objects.length; i < length; i++) { 13859 self.push(objects[i]); 13860 } 13861 return self; 13862 }, -1); 13863 13864 $def(self, '$rassoc', function $$rassoc(object) { 13865 var self = this; 13866 13867 13868 for (var i = 0, length = self.length, item; i < length; i++) { 13869 item = self[i]; 13870 13871 if (item.length && item[1] !== undefined) { 13872 if ((item[1])['$=='](object)) { 13873 return item; 13874 } 13875 } 13876 } 13877 13878 return nil; 13879 13880 }); 13881 13882 $def(self, '$reject', function $$reject() { 13883 var block = $$reject.$$p || nil, self = this; 13884 13885 $$reject.$$p = null; 13886 if (!(block !== nil)) { 13887 return $send(self, 'enum_for', ["reject"], function $$36(){var self = $$36.$$s == null ? this : $$36.$$s; 13888 13889 return self.$size()}, {$$s: self}) 13890 } 13891 var result = []; 13892 13893 for (var i = 0, length = self.length, value; i < length; i++) { 13894 value = block(self[i]); 13895 13896 if (value === false || value === nil) { 13897 result.push(self[i]); 13898 } 13899 } 13900 return result; 13901 }); 13902 13903 $def(self, '$reject!', function $Array_reject$excl$37() { 13904 var block = $Array_reject$excl$37.$$p || nil, self = this, original = nil; 13905 13906 $Array_reject$excl$37.$$p = null; 13907 if (!(block !== nil)) { 13908 return $send(self, 'enum_for', ["reject!"], function $$38(){var self = $$38.$$s == null ? this : $$38.$$s; 13909 13910 return self.$size()}, {$$s: self}) 13911 } $deny_frozen_access(self); 13912 original = self.$length(); 13913 $send(self, 'delete_if', [], block.$to_proc()); 13914 if ($eqeq(self.$length(), original)) { 13915 return nil 13916 } else { 13917 return self 13918 } }); 13919 13920 $def(self, '$replace', function $$replace(other) { 13921 var self = this; 13922 13923 13924 $deny_frozen_access(self); 13925 other = ($eqeqeq($$$('Array'), other) ? (other.$to_a()) : (($coerce_to(other, $$$('Array'), 'to_ary')).$to_a())); 13926 13927 self.splice(0, self.length); 13928 self.push.apply(self, other); 13929 return self; 13930 }); 13931 13932 $def(self, '$reverse', function $$reverse() { 13933 var self = this; 13934 13935 return self.slice(0).reverse(); 13936 }); 13937 13938 $def(self, '$reverse!', function $Array_reverse$excl$39() { 13939 var self = this; 13940 13941 13942 $deny_frozen_access(self); 13943 return self.reverse(); }); 13944 13945 $def(self, '$reverse_each', function $$reverse_each() { 13946 var block = $$reverse_each.$$p || nil, self = this; 13947 13948 $$reverse_each.$$p = null; 13949 if (!(block !== nil)) { 13950 return $send(self, 'enum_for', ["reverse_each"], function $$40(){var self = $$40.$$s == null ? this : $$40.$$s; 13951 13952 return self.$size()}, {$$s: self}) 13953 } $send(self.$reverse(), 'each', [], block.$to_proc()); 13954 return self; 13955 }); 13956 13957 $def(self, '$rindex', function $$rindex(object) { 13958 var block = $$rindex.$$p || nil, self = this; 13959 13960 $$rindex.$$p = null; 13961 13962 var i, value; 13963 13964 if (object != null && block !== nil) { 13965 self.$warn("warning: given block not used"); 13966 } 13967 13968 if (object != null) { 13969 for (i = self.length - 1; i >= 0; i--) { 13970 if (i >= self.length) { 13971 break; 13972 } 13973 if ((self[i])['$=='](object)) { 13974 return i; 13975 } 13976 } 13977 } 13978 else if (block !== nil) { 13979 for (i = self.length - 1; i >= 0; i--) { 13980 if (i >= self.length) { 13981 break; 13982 } 13983 13984 value = block(self[i]); 13985 13986 if (value !== false && value !== nil) { 13987 return i; 13988 } 13989 } 13990 } 13991 else if (object == null) { 13992 return self.$enum_for("rindex"); 13993 } 13994 13995 return nil; 13996 }, -1); 13997 13998 $def(self, '$rotate', function $$rotate(n) { 13999 var self = this; 14000 14001 14002 if (n == null) n = 1; 14003 14004 var ary, idx, firstPart, lastPart; 14005 14006 n = $coerce_to(n, $$$('Integer'), 'to_int'); 14007 14008 if (self.length === 1) { 14009 return self.slice(); 14010 } 14011 if (self.length === 0) { 14012 return []; 14013 } 14014 14015 ary = self.slice(); 14016 idx = n % ary.length; 14017 14018 firstPart = ary.slice(idx); 14019 lastPart = ary.slice(0, idx); 14020 return firstPart.concat(lastPart); 14021 }, -1); 14022 14023 $def(self, '$rotate!', function $Array_rotate$excl$41(cnt) { 14024 var self = this, ary = nil; 14025 14026 14027 if (cnt == null) cnt = 1; 14028 14029 $deny_frozen_access(self); 14030 14031 if (self.length === 0 || self.length === 1) { 14032 return self; 14033 } 14034 cnt = $coerce_to(cnt, $$$('Integer'), 'to_int'); 14035 ary = self.$rotate(cnt); 14036 return self.$replace(ary); 14037 }, -1); 14038 (function($base, $super) { 14039 var self = $klass($base, $super, 'SampleRandom'); 14040 14041 var $proto = self.$$prototype; 14042 14043 $proto.rng = nil; 14044 14045 14046 $def(self, '$initialize', $assign_ivar("rng")); 14047 return $def(self, '$rand', function $$rand(size) { 14048 var self = this, random = nil; 14049 14050 14051 random = $coerce_to(self.rng.$rand(size), $$$('Integer'), 'to_int'); 14052 if ($truthy(random < 0)) { 14053 $Kernel.$raise($$$('RangeError'), "random value must be >= 0"); 14054 } if (!$truthy(random < size)) { 14055 $Kernel.$raise($$$('RangeError'), "random value must be less than Array size"); 14056 } return random; 14057 }); 14058 })(self, null); 14059 14060 $def(self, '$sample', function $$sample(count, options) { 14061 var self = this, o = nil, rng = nil; 14062 if ($truthy(count === undefined)) { 14063 return self.$at($Kernel.$rand(self.length)) 14064 } if ($truthy(options === undefined)) { 14065 if ($truthy((o = $Opal['$coerce_to?'](count, $$$('Hash'), "to_hash")))) { 14066 14067 options = o; 14068 count = nil; 14069 } else { 14070 14071 options = nil; 14072 count = $coerce_to(count, $$$('Integer'), 'to_int'); 14073 } 14074 } else { 14075 14076 count = $coerce_to(count, $$$('Integer'), 'to_int'); 14077 options = $coerce_to(options, $$$('Hash'), 'to_hash'); 14078 } if (($truthy(count) && ($truthy(count < 0)))) { 14079 $Kernel.$raise($$$('ArgumentError'), "count must be greater than 0"); 14080 } if ($truthy(options)) { 14081 rng = options['$[]']("random"); 14082 } rng = (($truthy(rng) && ($truthy(rng['$respond_to?']("rand")))) ? ($$('SampleRandom').$new(rng)) : ($Kernel)); 14083 if (!$truthy(count)) { 14084 return self[rng.$rand(self.length)] 14085 } 14086 14087 var abandon, spin, result, i, j, k, targetIndex, oldValue; 14088 14089 if (count > self.length) { 14090 count = self.length; 14091 } 14092 14093 switch (count) { 14094 case 0: 14095 return []; 14096 case 1: 14097 return [self[rng.$rand(self.length)]]; 14098 case 2: 14099 i = rng.$rand(self.length); 14100 j = rng.$rand(self.length - 1); 14101 if (i <= j) { 14102 j++; 14103 } 14104 return [self[i], self[j]]; 14105 default: 14106 if (self.length / count > 3) { 14107 abandon = false; 14108 spin = 0; 14109 14110 result = $$('Array').$new(count); 14111 i = 1; 14112 14113 result[0] = rng.$rand(self.length); 14114 while (i < count) { 14115 k = rng.$rand(self.length); 14116 j = 0; 14117 14118 while (j < i) { 14119 while (k === result[j]) { 14120 spin++; 14121 if (spin > 100) { 14122 abandon = true; 14123 break; 14124 } 14125 k = rng.$rand(self.length); 14126 } 14127 if (abandon) { break; } 14128 14129 j++; 14130 } 14131 14132 if (abandon) { break; } 14133 14134 result[i] = k; 14135 14136 i++; 14137 } 14138 14139 if (!abandon) { 14140 i = 0; 14141 while (i < count) { 14142 result[i] = self[result[i]]; 14143 i++; 14144 } 14145 14146 return result; 14147 } 14148 } 14149 14150 result = self.slice(); 14151 14152 for (var c = 0; c < count; c++) { 14153 targetIndex = rng.$rand(self.length - c) + c; 14154 oldValue = result[c]; 14155 result[c] = result[targetIndex]; 14156 result[targetIndex] = oldValue; 14157 } 14158 14159 return count === self.length ? result : (result)['$[]'](0, count); 14160 } 14161 }, -1); 14162 14163 $def(self, '$select', function $$select() { 14164 var block = $$select.$$p || nil, self = this; 14165 14166 $$select.$$p = null; 14167 if (!(block !== nil)) { 14168 return $send(self, 'enum_for', ["select"], function $$42(){var self = $$42.$$s == null ? this : $$42.$$s; 14169 14170 return self.$size()}, {$$s: self}) 14171 } 14172 var result = []; 14173 14174 for (var i = 0, length = self.length, item, value; i < length; i++) { 14175 item = self[i]; 14176 14177 value = $yield1(block, item); 14178 14179 if ($truthy(value)) { 14180 result.push(item); 14181 } 14182 } 14183 14184 return result; 14185 }); 14186 14187 $def(self, '$select!', function $Array_select$excl$43() { 14188 var block = $Array_select$excl$43.$$p || nil, self = this; 14189 14190 $Array_select$excl$43.$$p = null; 14191 if (!(block !== nil)) { 14192 return $send(self, 'enum_for', ["select!"], function $$44(){var self = $$44.$$s == null ? this : $$44.$$s; 14193 14194 return self.$size()}, {$$s: self}) 14195 } 14196 $deny_frozen_access(self); 14197 14198 var original = self.length; 14199 $send(self, 'keep_if', [], block.$to_proc()); 14200 return self.length === original ? nil : self; 14201 }); 14202 14203 $def(self, '$shift', function $$shift(count) { 14204 var self = this; 14205 $deny_frozen_access(self); 14206 if ($truthy(count === undefined)) { 14207 14208 if ($truthy(self.length === 0)) { 14209 return nil 14210 } return shiftNoArg(self); 14211 } count = $coerce_to(count, $$$('Integer'), 'to_int'); 14212 if ($truthy(count < 0)) { 14213 $Kernel.$raise($$$('ArgumentError'), "negative array size"); 14214 } if ($truthy(self.length === 0)) { 14215 return [] 14216 } return self.splice(0, count); }, -1); 14217 14218 $def(self, '$shuffle', function $$shuffle(rng) { 14219 var self = this; 14220 return self.$dup().$to_a()['$shuffle!'](rng); 14221 }, -1); 14222 14223 $def(self, '$shuffle!', function $Array_shuffle$excl$45(rng) { 14224 var self = this; 14225 14226 $deny_frozen_access(self); 14227 14228 var randgen, i = self.length, j, tmp; 14229 14230 if (rng !== undefined) { 14231 rng = $Opal['$coerce_to?'](rng, $$$('Hash'), "to_hash"); 14232 14233 if (rng !== nil) { 14234 rng = rng['$[]']("random"); 14235 14236 if (rng !== nil && rng['$respond_to?']("rand")) { 14237 randgen = rng; 14238 } 14239 } 14240 } 14241 14242 while (i) { 14243 if (randgen) { 14244 j = randgen.$rand(i).$to_int(); 14245 14246 if (j < 0) { 14247 $Kernel.$raise($$$('RangeError'), "random number too small " + (j)); 14248 } 14249 14250 if (j >= i) { 14251 $Kernel.$raise($$$('RangeError'), "random number too big " + (j)); 14252 } 14253 } 14254 else { 14255 j = self.$rand(i); 14256 } 14257 14258 tmp = self[--i]; 14259 self[i] = self[j]; 14260 self[j] = tmp; 14261 } 14262 14263 return self; 14264 }, -1); 14265 14266 $def(self, '$slice!', function $Array_slice$excl$46(index, length) { 14267 var self = this, result = nil, range = nil, range_start = nil, range_end = nil, start = nil; 14268 $deny_frozen_access(self); 14269 result = nil; 14270 if ($truthy(length === undefined)) { 14271 if ($eqeqeq($$$('Range'), index)) { 14272 14273 range = index; 14274 result = self['$[]'](range); 14275 range_start = range.begin === nil ? 0 : $coerce_to(range.begin, $$$('Integer'), 'to_int'); 14276 range_end = range.end === nil ? -1 : $coerce_to(range.end, $$$('Integer'), 'to_int'); 14277 14278 if (range_start < 0) { 14279 range_start += self.length; 14280 } 14281 14282 if (range_end < 0) { 14283 range_end += self.length; 14284 } else if (range_end >= self.length) { 14285 range_end = self.length - 1; 14286 if (range.excl) { 14287 range_end += 1; 14288 } 14289 } 14290 14291 var range_length = range_end - range_start; 14292 if (range.excl && range.end !== nil) { 14293 range_end -= 1; 14294 } else { 14295 range_length += 1; 14296 } 14297 14298 if (range_start < self.length && range_start >= 0 && range_end < self.length && range_end >= 0 && range_length > 0) { 14299 self.splice(range_start, range_length); 14300 } 14301 } else { 14302 14303 start = $coerce_to(index, $$$('Integer'), 'to_int'); 14304 14305 if (start < 0) { 14306 start += self.length; 14307 } 14308 14309 if (start < 0 || start >= self.length) { 14310 return nil; 14311 } 14312 14313 result = self[start]; 14314 14315 if (start === 0) { 14316 self.shift(); 14317 } else { 14318 self.splice(start, 1); 14319 } 14320 } 14321 } else { 14322 14323 start = $coerce_to(index, $$$('Integer'), 'to_int'); 14324 length = $coerce_to(length, $$$('Integer'), 'to_int'); 14325 14326 if (length < 0) { 14327 return nil; 14328 } 14329 14330 result = self['$[]'](start, length); 14331 14332 if (start < 0) { 14333 start += self.length; 14334 } 14335 14336 if (start + length > self.length) { 14337 length = self.length - start; 14338 } 14339 14340 if (start < self.length && start >= 0) { 14341 self.splice(start, length); 14342 } 14343 } return result; 14344 }, -2); 14345 14346 $def(self, '$sort', function $$sort() { 14347 var block = $$sort.$$p || nil, self = this; 14348 14349 $$sort.$$p = null; 14350 if (!$truthy(self.length > 1)) { 14351 return self 14352 } 14353 if (block === nil) { 14354 block = function(a, b) { 14355 return (a)['$<=>'](b); 14356 }; 14357 } 14358 14359 return self.slice().sort(function(x, y) { 14360 var ret = block(x, y); 14361 14362 if (ret === nil) { 14363 $Kernel.$raise($$$('ArgumentError'), "comparison of " + ((x).$inspect()) + " with " + ((y).$inspect()) + " failed"); 14364 } 14365 14366 return $rb_gt(ret, 0) ? 1 : ($rb_lt(ret, 0) ? -1 : 0); 14367 }); 14368 }); 14369 14370 $def(self, '$sort!', function $Array_sort$excl$47() { 14371 var block = $Array_sort$excl$47.$$p || nil, self = this; 14372 14373 $Array_sort$excl$47.$$p = null; 14374 14375 $deny_frozen_access(self); 14376 14377 var result; 14378 14379 if ((block !== nil)) { 14380 result = $send((self.slice()), 'sort', [], block.$to_proc()); 14381 } 14382 else { 14383 result = (self.slice()).$sort(); 14384 } 14385 14386 self.length = 0; 14387 for(var i = 0, length = result.length; i < length; i++) { 14388 self.push(result[i]); 14389 } 14390 14391 return self; 14392 }); 14393 14394 $def(self, '$sort_by!', function $Array_sort_by$excl$48() { 14395 var block = $Array_sort_by$excl$48.$$p || nil, self = this; 14396 14397 $Array_sort_by$excl$48.$$p = null; 14398 if (!(block !== nil)) { 14399 return $send(self, 'enum_for', ["sort_by!"], function $$49(){var self = $$49.$$s == null ? this : $$49.$$s; 14400 14401 return self.$size()}, {$$s: self}) 14402 } $deny_frozen_access(self); 14403 return self.$replace($send(self, 'sort_by', [], block.$to_proc())); 14404 }); 14405 14406 $def(self, '$take', function $$take(count) { 14407 var self = this; 14408 14409 14410 if (count < 0) { 14411 $Kernel.$raise($$$('ArgumentError')); 14412 } 14413 14414 return self.slice(0, count); 14415 14416 }); 14417 14418 $def(self, '$take_while', function $$take_while() { 14419 var block = $$take_while.$$p || nil, self = this; 14420 14421 $$take_while.$$p = null; 14422 14423 var result = []; 14424 14425 for (var i = 0, length = self.length, item, value; i < length; i++) { 14426 item = self[i]; 14427 14428 value = block(item); 14429 14430 if (value === false || value === nil) { 14431 return result; 14432 } 14433 14434 result.push(item); 14435 } 14436 14437 return result; 14438 }); 14439 14440 $def(self, '$to_a', function $$to_a() { 14441 var self = this; 14442 14443 14444 if (self.$$class === Opal.Array) { 14445 return self; 14446 } 14447 else { 14448 return Opal.Array.$new(self); 14449 } 14450 14451 }); 14452 14453 $def(self, '$to_ary', $return_self); 14454 14455 $def(self, '$to_h', function $$to_h() { 14456 var block = $$to_h.$$p || nil, self = this, array = nil; 14457 14458 $$to_h.$$p = null; 14459 array = self; 14460 if ((block !== nil)) { 14461 array = $send(array, 'map', [], block.$to_proc()); 14462 } 14463 var i, len = array.length, ary, key, val, hash = $hash2([], {}); 14464 14465 for (i = 0; i < len; i++) { 14466 ary = $Opal['$coerce_to?'](array[i], $$$('Array'), "to_ary"); 14467 if (!ary.$$is_array) { 14468 $Kernel.$raise($$$('TypeError'), "wrong element type " + ((ary).$class()) + " at " + (i) + " (expected array)"); 14469 } 14470 if (ary.length !== 2) { 14471 $Kernel.$raise($$$('ArgumentError'), "wrong array length at " + (i) + " (expected 2, was " + ((ary).$length()) + ")"); 14472 } 14473 key = ary[0]; 14474 val = ary[1]; 14475 $hash_put(hash, key, val); 14476 } 14477 14478 return hash; 14479 }); 14480 14481 $def(self, '$transpose', function $$transpose() { 14482 var self = this, result = nil, max = nil; 14483 14484 14485 if ($truthy(self['$empty?']())) { 14486 return [] 14487 } result = []; 14488 max = nil; 14489 $send(self, 'each', [], function $$50(row){var $ret_or_1 = nil; 14490 14491 14492 if (row == null) row = nil; 14493 row = ($eqeqeq($$$('Array'), row) ? (row.$to_a()) : (($coerce_to(row, $$$('Array'), 'to_ary')).$to_a())); 14494 max = ($truthy(($ret_or_1 = max)) ? ($ret_or_1) : (row.length)); 14495 if ($neqeq(row.length, max)) { 14496 $Kernel.$raise($$$('IndexError'), "element size differs (" + (row.length) + " should be " + (max) + ")"); 14497 } return $send((row.length), 'times', [], function $$51(i){var $a, entry = nil; 14498 14499 14500 if (i == null) i = nil; 14501 entry = ($truthy(($ret_or_1 = result['$[]'](i))) ? ($ret_or_1) : (($a = [i, []], $send(result, '[]=', $a), $a[$a.length - 1]))); 14502 return entry['$<<'](row.$at(i));});}); 14503 return result; 14504 }); 14505 14506 $def(self, '$union', function $$union($a) { 14507 var $post_args, arrays, self = this; 14508 14509 14510 $post_args = $slice(arguments); 14511 arrays = $post_args; 14512 return $send(arrays, 'reduce', [self.$uniq()], function $$52(a, b){ 14513 14514 if (a == null) a = nil; 14515 if (b == null) b = nil; 14516 return a['$|'](b);}); 14517 }, -1); 14518 14519 $def(self, '$uniq', function $$uniq() { 14520 var block = $$uniq.$$p || nil, self = this; 14521 14522 $$uniq.$$p = null; 14523 14524 var hash = $hash2([], {}), i, length, item, key; 14525 14526 if (block === nil) { 14527 for (i = 0, length = self.length; i < length; i++) { 14528 item = self[i]; 14529 if ($hash_get(hash, item) === undefined) { 14530 $hash_put(hash, item, item); 14531 } 14532 } 14533 } 14534 else { 14535 for (i = 0, length = self.length; i < length; i++) { 14536 item = self[i]; 14537 key = $yield1(block, item); 14538 if ($hash_get(hash, key) === undefined) { 14539 $hash_put(hash, key, item); 14540 } 14541 } 14542 } 14543 14544 return (hash).$values(); 14545 }); 14546 14547 $def(self, '$uniq!', function $Array_uniq$excl$53() { 14548 var block = $Array_uniq$excl$53.$$p || nil, self = this; 14549 14550 $Array_uniq$excl$53.$$p = null; 14551 14552 $deny_frozen_access(self); 14553 14554 var original_length = self.length, hash = $hash2([], {}), i, length, item, key; 14555 14556 for (i = 0, length = original_length; i < length; i++) { 14557 item = self[i]; 14558 key = (block === nil ? item : $yield1(block, item)); 14559 14560 if ($hash_get(hash, key) === undefined) { 14561 $hash_put(hash, key, item); 14562 continue; 14563 } 14564 14565 self.splice(i, 1); 14566 length--; 14567 i--; 14568 } 14569 14570 return self.length === original_length ? nil : self; 14571 }); 14572 14573 $def(self, '$unshift', function $$unshift($a) { 14574 var $post_args, objects, self = this; 14575 14576 14577 $post_args = $slice(arguments); 14578 objects = $post_args; 14579 14580 $deny_frozen_access(self); 14581 14582 var selfLength = self.length; 14583 var objectsLength = objects.length; 14584 if (objectsLength == 0) return self; 14585 var index = selfLength - objectsLength; 14586 for (var i = 0; i < objectsLength; i++) { 14587 self.push(self[index + i]); 14588 } 14589 var len = selfLength - 1; 14590 while (len - objectsLength >= 0) { 14591 self[len] = self[len - objectsLength]; 14592 len--; 14593 } 14594 for (var j = 0; j < objectsLength; j++) { 14595 self[j] = objects[j]; 14596 } 14597 return self; 14598 }, -1); 14599 14600 $def(self, '$values_at', function $$values_at($a) { 14601 var $post_args, args, self = this, out = nil; 14602 14603 14604 $post_args = $slice(arguments); 14605 args = $post_args; 14606 out = []; 14607 $send(args, 'each', [], function $$54(elem){var self = $$54.$$s == null ? this : $$54.$$s, finish = nil, start = nil, i = nil; 14608 14609 14610 if (elem == null) elem = nil; 14611 if ($truthy(elem['$is_a?']($$$('Range')))) { 14612 14613 finish = elem.$end() === nil ? -1 : $coerce_to(elem.$end(), $$$('Integer'), 'to_int'); 14614 start = elem.$begin() === nil ? 0 : $coerce_to(elem.$begin(), $$$('Integer'), 'to_int'); 14615 14616 if (start < 0) { 14617 start = start + self.length; 14618 return nil; 14619 } 14620 14621 if (finish < 0) { 14622 finish = finish + self.length; 14623 } 14624 if (elem['$exclude_end?']() && elem.$end() !== nil) { 14625 finish--; 14626 } 14627 if (finish < start) { 14628 return nil; 14629 } 14630 return $send(start, 'upto', [finish], function $$55(i){var self = $$55.$$s == null ? this : $$55.$$s; 14631 14632 14633 if (i == null) i = nil; 14634 return out['$<<'](self.$at(i));}, {$$s: self}); 14635 } else { 14636 14637 i = $coerce_to(elem, $$$('Integer'), 'to_int'); 14638 return out['$<<'](self.$at(i)); 14639 }}, {$$s: self}); 14640 return out; 14641 }, -1); 14642 14643 $def(self, '$zip', function $$zip($a) { 14644 var block = $$zip.$$p || nil, $post_args, others, self = this, $ret_or_1 = nil; 14645 14646 $$zip.$$p = null; 14647 $post_args = $slice(arguments); 14648 others = $post_args; 14649 14650 var result = [], size = self.length, part, o, i, j, jj; 14651 14652 for (j = 0, jj = others.length; j < jj; j++) { 14653 o = others[j]; 14654 if (o.$$is_array) { 14655 continue; 14656 } 14657 if (o.$$is_range || o.$$is_enumerator) { 14658 others[j] = o.$take(size); 14659 continue; 14660 } 14661 others[j] = ($truthy(($ret_or_1 = $Opal['$coerce_to?'](o, $$$('Array'), "to_ary"))) ? ($ret_or_1) : ($Opal['$coerce_to!'](o, $$$('Enumerator'), "to_enum", "each"))).$to_a(); 14662 } 14663 14664 for (i = 0; i < size; i++) { 14665 part = [self[i]]; 14666 14667 for (j = 0, jj = others.length; j < jj; j++) { 14668 o = others[j][i]; 14669 14670 if (o == null) { 14671 o = nil; 14672 } 14673 14674 part[j + 1] = o; 14675 } 14676 14677 result[i] = part; 14678 } 14679 14680 if (block !== nil) { 14681 for (i = 0; i < size; i++) { 14682 Opal.yield1(block, result[i]); 14683 } 14684 14685 return nil; 14686 } 14687 14688 return result; 14689 }, -1); 14690 $defs(self, '$inherited', function $$inherited(klass) { 14691 14692 14693 klass.$$prototype.$to_a = function() { 14694 return this.slice(0, this.length); 14695 }; 14696 14697 }); 14698 14699 $def(self, '$instance_variables', function $$instance_variables() { 14700 var $yield = $$instance_variables.$$p || nil, self = this; 14701 14702 $$instance_variables.$$p = null; 14703 return $send($send2(self, $find_super(self, 'instance_variables', $$instance_variables, false, true), 'instance_variables', [], $yield), 'reject', [], function $$56(ivar){var $ret_or_1 = nil; 14704 14705 14706 if (ivar == null) ivar = nil; 14707 if ($truthy(($ret_or_1 = /^@\d+$/.test(ivar)))) { 14708 return $ret_or_1 14709 } else { 14710 return ivar['$==']("@length") 14711 }}) 14712 }); 14713 14714 $def(self, '$pack', function $$pack($a) { 14715 14716 14717 $slice(arguments); 14718 return $Kernel.$raise("To use Array#pack, you must first require 'corelib/array/pack'."); 14719 }, -1); 14720 $alias(self, "append", "push"); 14721 $alias(self, "filter", "select"); 14722 $alias(self, "filter!", "select!"); 14723 $alias(self, "map", "collect"); 14724 $alias(self, "map!", "collect!"); 14725 $alias(self, "prepend", "unshift"); 14726 $alias(self, "size", "length"); 14727 $alias(self, "slice", "[]"); 14728 $alias(self, "to_s", "inspect"); 14729 $Opal.$pristine(self.$singleton_class(), "allocate"); 14730 return $Opal.$pristine(self, "copy_instance_variables", "initialize_dup"); 14731 })('::', Array, $nesting); 14732}; 14733 14734Opal.modules["corelib/hash"] = function(Opal) {/* Generated by Opal 1.7.3 */ 14735 var $yield1 = Opal.yield1, $hash = Opal.hash, $hash_init = Opal.hash_init, $hash_get = Opal.hash_get, $hash_put = Opal.hash_put, $hash_delete = Opal.hash_delete, $deny_frozen_access = Opal.deny_frozen_access, $freeze = Opal.freeze, $klass = Opal.klass, $slice = Opal.slice, $Opal = Opal.Opal, $Kernel = Opal.Kernel, $defs = Opal.defs, $def = Opal.def, $send = Opal.send, $rb_ge = Opal.rb_ge, $rb_gt = Opal.rb_gt, $hash2 = Opal.hash2, $truthy = Opal.truthy, $to_a = Opal.to_a, $return_self = Opal.return_self, $alias = Opal.alias, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 14736 14737 Opal.add_stubs('require,include,coerce_to?,[],merge!,allocate,raise,coerce_to!,each,fetch,>=,>,==,compare_by_identity,lambda?,abs,arity,enum_for,size,respond_to?,class,dig,except!,dup,delete,new,inspect,map,to_proc,flatten,frozen?,eql?,default,default_proc,default_proc=,default=,to_h,proc,clone,select,select!,has_key?,indexes,index,length,[]=,has_value?'); 14738 14739 self.$require("corelib/enumerable"); 14740 return (function($base, $super, $parent_nesting) { 14741 var self = $klass($base, $super, 'Hash'); 14742 14743 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 14744 14745 14746 self.$include($$$('Enumerable')); 14747 self.$$prototype.$$is_hash = true; 14748 $defs(self, '$[]', function $Hash_$$$1($a) { 14749 var $post_args, argv, self = this; 14750 14751 14752 $post_args = $slice(arguments); 14753 argv = $post_args; 14754 14755 var hash, argc = argv.length, i; 14756 14757 if (argc === 1) { 14758 hash = $Opal['$coerce_to?'](argv['$[]'](0), $$$('Hash'), "to_hash"); 14759 if (hash !== nil) { 14760 return self.$allocate()['$merge!'](hash); 14761 } 14762 14763 argv = $Opal['$coerce_to?'](argv['$[]'](0), $$$('Array'), "to_ary"); 14764 if (argv === nil) { 14765 $Kernel.$raise($$$('ArgumentError'), "odd number of arguments for Hash"); 14766 } 14767 14768 argc = argv.length; 14769 hash = self.$allocate(); 14770 14771 for (i = 0; i < argc; i++) { 14772 if (!argv[i].$$is_array) continue; 14773 switch(argv[i].length) { 14774 case 1: 14775 hash.$store(argv[i][0], nil); 14776 break; 14777 case 2: 14778 hash.$store(argv[i][0], argv[i][1]); 14779 break; 14780 default: 14781 $Kernel.$raise($$$('ArgumentError'), "invalid number of elements (" + (argv[i].length) + " for 1..2)"); 14782 } 14783 } 14784 14785 return hash; 14786 } 14787 14788 if (argc % 2 !== 0) { 14789 $Kernel.$raise($$$('ArgumentError'), "odd number of arguments for Hash"); 14790 } 14791 14792 hash = self.$allocate(); 14793 14794 for (i = 0; i < argc; i += 2) { 14795 hash.$store(argv[i], argv[i + 1]); 14796 } 14797 14798 return hash; 14799 }, -1); 14800 $defs(self, '$allocate', function $$allocate() { 14801 var self = this; 14802 14803 14804 var hash = new self.$$constructor(); 14805 14806 $hash_init(hash); 14807 14808 hash.$$none = nil; 14809 hash.$$proc = nil; 14810 14811 return hash; 14812 14813 }); 14814 $defs(self, '$try_convert', function $$try_convert(obj) { 14815 14816 return $Opal['$coerce_to?'](obj, $$$('Hash'), "to_hash") 14817 }); 14818 14819 $def(self, '$initialize', function $$initialize(defaults) { 14820 var block = $$initialize.$$p || nil, self = this; 14821 14822 $$initialize.$$p = null; 14823 14824 $deny_frozen_access(self); 14825 14826 if (defaults !== undefined && block !== nil) { 14827 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (1 for 0)"); 14828 } 14829 self.$$none = (defaults === undefined ? nil : defaults); 14830 self.$$proc = block; 14831 14832 return self; 14833 }, -1); 14834 14835 $def(self, '$==', function $Hash_$eq_eq$2(other) { 14836 var self = this; 14837 14838 14839 if (self === other) { 14840 return true; 14841 } 14842 14843 if (!other.$$is_hash) { 14844 return false; 14845 } 14846 14847 if (self.$$keys.length !== other.$$keys.length) { 14848 return false; 14849 } 14850 14851 for (var i = 0, keys = self.$$keys, length = keys.length, key, value, other_value; i < length; i++) { 14852 key = keys[i]; 14853 14854 if (key.$$is_string) { 14855 value = self.$$smap[key]; 14856 other_value = other.$$smap[key]; 14857 } else { 14858 value = key.value; 14859 other_value = $hash_get(other, key.key); 14860 } 14861 14862 if (other_value === undefined || !value['$eql?'](other_value)) { 14863 return false; 14864 } 14865 } 14866 14867 return true; 14868 14869 }); 14870 14871 $def(self, '$>=', function $Hash_$gt_eq$3(other) { 14872 var self = this, result = nil; 14873 14874 14875 other = $Opal['$coerce_to!'](other, $$$('Hash'), "to_hash"); 14876 14877 if (self.$$keys.length < other.$$keys.length) { 14878 return false 14879 } 14880 result = true; 14881 $send(other, 'each', [], function $$4(other_key, other_val){var self = $$4.$$s == null ? this : $$4.$$s, val = nil; 14882 14883 14884 if (other_key == null) other_key = nil; 14885 if (other_val == null) other_val = nil; 14886 val = self.$fetch(other_key, null); 14887 14888 if (val == null || val !== other_val) { 14889 result = false; 14890 return; 14891 } 14892}, {$$s: self}); 14893 return result; 14894 }); 14895 14896 $def(self, '$>', function $Hash_$gt$5(other) { 14897 var self = this; 14898 14899 14900 other = $Opal['$coerce_to!'](other, $$$('Hash'), "to_hash"); 14901 14902 if (self.$$keys.length <= other.$$keys.length) { 14903 return false 14904 } 14905 return $rb_ge(self, other); 14906 }); 14907 14908 $def(self, '$<', function $Hash_$lt$6(other) { 14909 var self = this; 14910 14911 14912 other = $Opal['$coerce_to!'](other, $$$('Hash'), "to_hash"); 14913 return $rb_gt(other, self); 14914 }); 14915 14916 $def(self, '$<=', function $Hash_$lt_eq$7(other) { 14917 var self = this; 14918 14919 14920 other = $Opal['$coerce_to!'](other, $$$('Hash'), "to_hash"); 14921 return $rb_ge(other, self); 14922 }); 14923 14924 $def(self, '$[]', function $Hash_$$$8(key) { 14925 var self = this; 14926 14927 14928 var value = $hash_get(self, key); 14929 14930 if (value !== undefined) { 14931 return value; 14932 } 14933 14934 return self.$default(key); 14935 14936 }); 14937 14938 $def(self, '$[]=', function $Hash_$$$eq$9(key, value) { 14939 var self = this; 14940 14941 14942 $deny_frozen_access(self); 14943 14944 $hash_put(self, key, value); 14945 return value; 14946 14947 }); 14948 14949 $def(self, '$assoc', function $$assoc(object) { 14950 var self = this; 14951 14952 14953 for (var i = 0, keys = self.$$keys, length = keys.length, key; i < length; i++) { 14954 key = keys[i]; 14955 14956 if (key.$$is_string) { 14957 if ((key)['$=='](object)) { 14958 return [key, self.$$smap[key]]; 14959 } 14960 } else { 14961 if ((key.key)['$=='](object)) { 14962 return [key.key, key.value]; 14963 } 14964 } 14965 } 14966 14967 return nil; 14968 14969 }); 14970 14971 $def(self, '$clear', function $$clear() { 14972 var self = this; 14973 14974 14975 $deny_frozen_access(self); 14976 14977 $hash_init(self); 14978 return self; 14979 14980 }); 14981 14982 $def(self, '$clone', function $$clone() { 14983 var self = this; 14984 14985 14986 var hash = new self.$$class(); 14987 14988 $hash_init(hash); 14989 Opal.hash_clone(self, hash); 14990 14991 return hash; 14992 14993 }); 14994 14995 $def(self, '$compact', function $$compact() { 14996 var self = this; 14997 14998 14999 var hash = $hash(); 15000 15001 for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) { 15002 key = keys[i]; 15003 15004 if (key.$$is_string) { 15005 value = self.$$smap[key]; 15006 } else { 15007 value = key.value; 15008 key = key.key; 15009 } 15010 15011 if (value !== nil) { 15012 $hash_put(hash, key, value); 15013 } 15014 } 15015 15016 return hash; 15017 15018 }); 15019 15020 $def(self, '$compact!', function $Hash_compact$excl$10() { 15021 var self = this; 15022 15023 15024 $deny_frozen_access(self); 15025 15026 var changes_were_made = false; 15027 15028 for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) { 15029 key = keys[i]; 15030 15031 if (key.$$is_string) { 15032 value = self.$$smap[key]; 15033 } else { 15034 value = key.value; 15035 key = key.key; 15036 } 15037 15038 if (value === nil) { 15039 if ($hash_delete(self, key) !== undefined) { 15040 changes_were_made = true; 15041 length--; 15042 i--; 15043 } 15044 } 15045 } 15046 15047 return changes_were_made ? self : nil; 15048 15049 }); 15050 15051 $def(self, '$compare_by_identity', function $$compare_by_identity() { 15052 var self = this; 15053 15054 15055 $deny_frozen_access(self); 15056 15057 var i, ii, key, keys = self.$$keys, identity_hash; 15058 15059 if (self.$$by_identity) return self; 15060 if (self.$$keys.length === 0) { 15061 self.$$by_identity = true; 15062 return self; 15063 } 15064 15065 identity_hash = $hash2([], {}).$compare_by_identity(); 15066 for(i = 0, ii = keys.length; i < ii; i++) { 15067 key = keys[i]; 15068 if (!key.$$is_string) key = key.key; 15069 $hash_put(identity_hash, key, $hash_get(self, key)); 15070 } 15071 15072 self.$$by_identity = true; 15073 self.$$map = identity_hash.$$map; 15074 self.$$smap = identity_hash.$$smap; 15075 return self; 15076 15077 }); 15078 15079 $def(self, '$compare_by_identity?', function $Hash_compare_by_identity$ques$11() { 15080 var self = this; 15081 15082 return self.$$by_identity === true; 15083 }); 15084 15085 $def(self, '$default', function $Hash_default$12(key) { 15086 var self = this; 15087 15088 if (key !== undefined && self.$$proc !== nil && self.$$proc !== undefined) { 15089 return self.$$proc.$call(self, key); 15090 } 15091 if (self.$$none === undefined) { 15092 return nil; 15093 } 15094 return self.$$none; 15095 }, -1); 15096 15097 $def(self, '$default=', function $Hash_default$eq$13(object) { 15098 var self = this; 15099 15100 15101 $deny_frozen_access(self); 15102 15103 self.$$proc = nil; 15104 self.$$none = object; 15105 15106 return object; 15107 15108 }); 15109 15110 $def(self, '$default_proc', function $$default_proc() { 15111 var self = this; 15112 15113 15114 if (self.$$proc !== undefined) { 15115 return self.$$proc; 15116 } 15117 return nil; 15118 15119 }); 15120 15121 $def(self, '$default_proc=', function $Hash_default_proc$eq$14(default_proc) { 15122 var self = this; 15123 15124 15125 $deny_frozen_access(self); 15126 15127 var proc = default_proc; 15128 15129 if (proc !== nil) { 15130 proc = $Opal['$coerce_to!'](proc, $$$('Proc'), "to_proc"); 15131 15132 if ((proc)['$lambda?']() && (proc).$arity().$abs() !== 2) { 15133 $Kernel.$raise($$$('TypeError'), "default_proc takes two arguments"); 15134 } 15135 } 15136 15137 self.$$none = nil; 15138 self.$$proc = proc; 15139 15140 return default_proc; 15141 15142 }); 15143 15144 $def(self, '$delete', function $Hash_delete$15(key) { 15145 var block = $Hash_delete$15.$$p || nil, self = this; 15146 15147 $Hash_delete$15.$$p = null; 15148 15149 $deny_frozen_access(self); 15150 var value = $hash_delete(self, key); 15151 15152 if (value !== undefined) { 15153 return value; 15154 } 15155 15156 if (block !== nil) { 15157 return Opal.yield1(block, key); 15158 } 15159 15160 return nil; 15161 }); 15162 15163 $def(self, '$delete_if', function $$delete_if() { 15164 var block = $$delete_if.$$p || nil, self = this; 15165 15166 $$delete_if.$$p = null; 15167 if (!$truthy(block)) { 15168 return $send(self, 'enum_for', ["delete_if"], function $$16(){var self = $$16.$$s == null ? this : $$16.$$s; 15169 15170 return self.$size()}, {$$s: self}) 15171 } 15172 $deny_frozen_access(self); 15173 15174 for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) { 15175 key = keys[i]; 15176 15177 if (key.$$is_string) { 15178 value = self.$$smap[key]; 15179 } else { 15180 value = key.value; 15181 key = key.key; 15182 } 15183 15184 obj = block(key, value); 15185 15186 if (obj !== false && obj !== nil) { 15187 if ($hash_delete(self, key) !== undefined) { 15188 length--; 15189 i--; 15190 } 15191 } 15192 } 15193 15194 return self; 15195 }); 15196 15197 $def(self, '$dig', function $$dig(key, $a) { 15198 var $post_args, keys, self = this, item = nil; 15199 15200 15201 $post_args = $slice(arguments, 1); 15202 keys = $post_args; 15203 item = self['$[]'](key); 15204 15205 if (item === nil || keys.length === 0) { 15206 return item; 15207 } 15208 if (!$truthy(item['$respond_to?']("dig"))) { 15209 $Kernel.$raise($$$('TypeError'), "" + (item.$class()) + " does not have #dig method"); 15210 } return $send(item, 'dig', $to_a(keys)); 15211 }, -2); 15212 15213 $def(self, '$each', function $$each() { 15214 var block = $$each.$$p || nil, self = this; 15215 15216 $$each.$$p = null; 15217 if (!$truthy(block)) { 15218 return $send(self, 'enum_for', ["each"], function $$17(){var self = $$17.$$s == null ? this : $$17.$$s; 15219 15220 return self.$size()}, {$$s: self}) 15221 } 15222 for (var i = 0, keys = self.$$keys.slice(), length = keys.length, key, value; i < length; i++) { 15223 key = keys[i]; 15224 15225 if (key.$$is_string) { 15226 value = self.$$smap[key]; 15227 } else { 15228 value = key.value; 15229 key = key.key; 15230 } 15231 15232 $yield1(block, [key, value]); 15233 } 15234 15235 return self; 15236 }); 15237 15238 $def(self, '$each_key', function $$each_key() { 15239 var block = $$each_key.$$p || nil, self = this; 15240 15241 $$each_key.$$p = null; 15242 if (!$truthy(block)) { 15243 return $send(self, 'enum_for', ["each_key"], function $$18(){var self = $$18.$$s == null ? this : $$18.$$s; 15244 15245 return self.$size()}, {$$s: self}) 15246 } 15247 for (var i = 0, keys = self.$$keys.slice(), length = keys.length, key; i < length; i++) { 15248 key = keys[i]; 15249 15250 block(key.$$is_string ? key : key.key); 15251 } 15252 15253 return self; 15254 }); 15255 15256 $def(self, '$each_value', function $$each_value() { 15257 var block = $$each_value.$$p || nil, self = this; 15258 15259 $$each_value.$$p = null; 15260 if (!$truthy(block)) { 15261 return $send(self, 'enum_for', ["each_value"], function $$19(){var self = $$19.$$s == null ? this : $$19.$$s; 15262 15263 return self.$size()}, {$$s: self}) 15264 } 15265 for (var i = 0, keys = self.$$keys.slice(), length = keys.length, key; i < length; i++) { 15266 key = keys[i]; 15267 15268 block(key.$$is_string ? self.$$smap[key] : key.value); 15269 } 15270 15271 return self; 15272 }); 15273 15274 $def(self, '$empty?', function $Hash_empty$ques$20() { 15275 var self = this; 15276 15277 return self.$$keys.length === 0; 15278 }); 15279 15280 $def(self, '$except', function $$except($a) { 15281 var $post_args, keys, self = this; 15282 15283 15284 $post_args = $slice(arguments); 15285 keys = $post_args; 15286 return $send(self.$dup(), 'except!', $to_a(keys)); 15287 }, -1); 15288 15289 $def(self, '$except!', function $Hash_except$excl$21($a) { 15290 var $post_args, keys, self = this; 15291 15292 15293 $post_args = $slice(arguments); 15294 keys = $post_args; 15295 $send(keys, 'each', [], function $$22(key){var self = $$22.$$s == null ? this : $$22.$$s; 15296 15297 15298 if (key == null) key = nil; 15299 return self.$delete(key);}, {$$s: self}); 15300 return self; 15301 }, -1); 15302 15303 $def(self, '$fetch', function $$fetch(key, defaults) { 15304 var block = $$fetch.$$p || nil, self = this; 15305 15306 $$fetch.$$p = null; 15307 15308 var value = $hash_get(self, key); 15309 15310 if (value !== undefined) { 15311 return value; 15312 } 15313 15314 if (block !== nil) { 15315 return block(key); 15316 } 15317 15318 if (defaults !== undefined) { 15319 return defaults; 15320 } 15321 return $Kernel.$raise($$$('KeyError').$new("key not found: " + (key.$inspect()), $hash2(["key", "receiver"], {"key": key, "receiver": self}))); 15322 }, -2); 15323 15324 $def(self, '$fetch_values', function $$fetch_values($a) { 15325 var block = $$fetch_values.$$p || nil, $post_args, keys, self = this; 15326 15327 $$fetch_values.$$p = null; 15328 $post_args = $slice(arguments); 15329 keys = $post_args; 15330 return $send(keys, 'map', [], function $$23(key){var self = $$23.$$s == null ? this : $$23.$$s; 15331 15332 15333 if (key == null) key = nil; 15334 return $send(self, 'fetch', [key], block.$to_proc());}, {$$s: self}); 15335 }, -1); 15336 15337 $def(self, '$flatten', function $$flatten(level) { 15338 var self = this; 15339 15340 15341 if (level == null) level = 1; 15342 level = $Opal['$coerce_to!'](level, $$$('Integer'), "to_int"); 15343 15344 var result = []; 15345 15346 for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) { 15347 key = keys[i]; 15348 15349 if (key.$$is_string) { 15350 value = self.$$smap[key]; 15351 } else { 15352 value = key.value; 15353 key = key.key; 15354 } 15355 15356 result.push(key); 15357 15358 if (value.$$is_array) { 15359 if (level === 1) { 15360 result.push(value); 15361 continue; 15362 } 15363 15364 result = result.concat((value).$flatten(level - 2)); 15365 continue; 15366 } 15367 15368 result.push(value); 15369 } 15370 15371 return result; 15372 }, -1); 15373 15374 $def(self, '$freeze', function $$freeze() { 15375 var self = this; 15376 15377 15378 if ($truthy(self['$frozen?']())) { 15379 return self 15380 } return $freeze(self); }); 15381 15382 $def(self, '$has_key?', function $Hash_has_key$ques$24(key) { 15383 var self = this; 15384 15385 return $hash_get(self, key) !== undefined; 15386 }); 15387 15388 $def(self, '$has_value?', function $Hash_has_value$ques$25(value) { 15389 var self = this; 15390 15391 15392 for (var i = 0, keys = self.$$keys, length = keys.length, key; i < length; i++) { 15393 key = keys[i]; 15394 15395 if (((key.$$is_string ? self.$$smap[key] : key.value))['$=='](value)) { 15396 return true; 15397 } 15398 } 15399 15400 return false; 15401 15402 }); 15403 15404 $def(self, '$hash', function $$hash() { 15405 var self = this; 15406 15407 15408 var top = (Opal.hash_ids === undefined), 15409 hash_id = self.$object_id(), 15410 result = ['Hash'], 15411 key, item; 15412 15413 try { 15414 if (top) { 15415 Opal.hash_ids = Object.create(null); 15416 } 15417 15418 if (Opal[hash_id]) { 15419 return 'self'; 15420 } 15421 15422 for (key in Opal.hash_ids) { 15423 item = Opal.hash_ids[key]; 15424 if (self['$eql?'](item)) { 15425 return 'self'; 15426 } 15427 } 15428 15429 Opal.hash_ids[hash_id] = self; 15430 15431 for (var i = 0, keys = self.$$keys, length = keys.length; i < length; i++) { 15432 key = keys[i]; 15433 15434 if (key.$$is_string) { 15435 result.push([key, self.$$smap[key].$hash()]); 15436 } else { 15437 result.push([key.key_hash, key.value.$hash()]); 15438 } 15439 } 15440 15441 return result.sort().join(); 15442 15443 } finally { 15444 if (top) { 15445 Opal.hash_ids = undefined; 15446 } 15447 } 15448 15449 }); 15450 15451 $def(self, '$index', function $$index(object) { 15452 var self = this; 15453 15454 15455 for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) { 15456 key = keys[i]; 15457 15458 if (key.$$is_string) { 15459 value = self.$$smap[key]; 15460 } else { 15461 value = key.value; 15462 key = key.key; 15463 } 15464 15465 if ((value)['$=='](object)) { 15466 return key; 15467 } 15468 } 15469 15470 return nil; 15471 15472 }); 15473 15474 $def(self, '$indexes', function $$indexes($a) { 15475 var $post_args, args, self = this; 15476 15477 15478 $post_args = $slice(arguments); 15479 args = $post_args; 15480 15481 var result = []; 15482 15483 for (var i = 0, length = args.length, key, value; i < length; i++) { 15484 key = args[i]; 15485 value = $hash_get(self, key); 15486 15487 if (value === undefined) { 15488 result.push(self.$default()); 15489 continue; 15490 } 15491 15492 result.push(value); 15493 } 15494 15495 return result; 15496 }, -1); 15497 var inspect_ids; 15498 15499 $def(self, '$inspect', function $$inspect() { 15500 var self = this; 15501 15502 15503 15504 var top = (inspect_ids === undefined), 15505 hash_id = self.$object_id(), 15506 result = []; 15507 15508 return (function() { try { 15509 15510 15511 if (top) { 15512 inspect_ids = {}; 15513 } 15514 15515 if (inspect_ids.hasOwnProperty(hash_id)) { 15516 return '{...}'; 15517 } 15518 15519 inspect_ids[hash_id] = true; 15520 15521 for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) { 15522 key = keys[i]; 15523 15524 if (key.$$is_string) { 15525 value = self.$$smap[key]; 15526 } else { 15527 value = key.value; 15528 key = key.key; 15529 } 15530 15531 key = $$('Opal').$inspect(key); 15532 value = $$('Opal').$inspect(value); 15533 15534 result.push(key + '=>' + value); 15535 } 15536 15537 return '{' + result.join(', ') + '}'; 15538 ; 15539 return nil; 15540 } finally { 15541 if (top) inspect_ids = undefined; 15542 } })(); }); 15543 15544 $def(self, '$invert', function $$invert() { 15545 var self = this; 15546 15547 15548 var hash = $hash(); 15549 15550 for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) { 15551 key = keys[i]; 15552 15553 if (key.$$is_string) { 15554 value = self.$$smap[key]; 15555 } else { 15556 value = key.value; 15557 key = key.key; 15558 } 15559 15560 $hash_put(hash, value, key); 15561 } 15562 15563 return hash; 15564 15565 }); 15566 15567 $def(self, '$keep_if', function $$keep_if() { 15568 var block = $$keep_if.$$p || nil, self = this; 15569 15570 $$keep_if.$$p = null; 15571 if (!$truthy(block)) { 15572 return $send(self, 'enum_for', ["keep_if"], function $$26(){var self = $$26.$$s == null ? this : $$26.$$s; 15573 15574 return self.$size()}, {$$s: self}) 15575 } 15576 $deny_frozen_access(self); 15577 15578 for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) { 15579 key = keys[i]; 15580 15581 if (key.$$is_string) { 15582 value = self.$$smap[key]; 15583 } else { 15584 value = key.value; 15585 key = key.key; 15586 } 15587 15588 obj = block(key, value); 15589 15590 if (obj === false || obj === nil) { 15591 if ($hash_delete(self, key) !== undefined) { 15592 length--; 15593 i--; 15594 } 15595 } 15596 } 15597 15598 return self; 15599 }); 15600 15601 $def(self, '$keys', function $$keys() { 15602 var self = this; 15603 15604 15605 var result = []; 15606 15607 for (var i = 0, keys = self.$$keys, length = keys.length, key; i < length; i++) { 15608 key = keys[i]; 15609 15610 if (key.$$is_string) { 15611 result.push(key); 15612 } else { 15613 result.push(key.key); 15614 } 15615 } 15616 15617 return result; 15618 15619 }); 15620 15621 $def(self, '$length', function $$length() { 15622 var self = this; 15623 15624 return self.$$keys.length; 15625 }); 15626 15627 $def(self, '$merge', function $$merge($a) { 15628 var block = $$merge.$$p || nil, $post_args, others, self = this; 15629 15630 $$merge.$$p = null; 15631 $post_args = $slice(arguments); 15632 others = $post_args; 15633 return $send(self.$dup(), 'merge!', $to_a(others), block.$to_proc()); 15634 }, -1); 15635 15636 $def(self, '$merge!', function $Hash_merge$excl$27($a) { 15637 var block = $Hash_merge$excl$27.$$p || nil, $post_args, others, self = this; 15638 15639 $Hash_merge$excl$27.$$p = null; 15640 $post_args = $slice(arguments); 15641 others = $post_args; 15642 15643 $deny_frozen_access(self); 15644 var i, j, other, other_keys, length, key, value, other_value; 15645 for (i = 0; i < others.length; ++i) { 15646 other = $Opal['$coerce_to!'](others[i], $$$('Hash'), "to_hash"); 15647 other_keys = other.$$keys, length = other_keys.length; 15648 15649 if (block === nil) { 15650 for (j = 0; j < length; j++) { 15651 key = other_keys[j]; 15652 15653 if (key.$$is_string) { 15654 other_value = other.$$smap[key]; 15655 } else { 15656 other_value = key.value; 15657 key = key.key; 15658 } 15659 15660 $hash_put(self, key, other_value); 15661 } 15662 } else { 15663 for (j = 0; j < length; j++) { 15664 key = other_keys[j]; 15665 15666 if (key.$$is_string) { 15667 other_value = other.$$smap[key]; 15668 } else { 15669 other_value = key.value; 15670 key = key.key; 15671 } 15672 15673 value = $hash_get(self, key); 15674 15675 if (value === undefined) { 15676 $hash_put(self, key, other_value); 15677 continue; 15678 } 15679 15680 $hash_put(self, key, block(key, value, other_value)); 15681 } 15682 } 15683 } 15684 15685 return self; 15686 }, -1); 15687 15688 $def(self, '$rassoc', function $$rassoc(object) { 15689 var self = this; 15690 15691 15692 for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) { 15693 key = keys[i]; 15694 15695 if (key.$$is_string) { 15696 value = self.$$smap[key]; 15697 } else { 15698 value = key.value; 15699 key = key.key; 15700 } 15701 15702 if ((value)['$=='](object)) { 15703 return [key, value]; 15704 } 15705 } 15706 15707 return nil; 15708 15709 }); 15710 15711 $def(self, '$rehash', function $$rehash() { 15712 var self = this; 15713 15714 15715 $deny_frozen_access(self); 15716 Opal.hash_rehash(self); 15717 return self; 15718 15719 }); 15720 15721 $def(self, '$reject', function $$reject() { 15722 var block = $$reject.$$p || nil, self = this; 15723 15724 $$reject.$$p = null; 15725 if (!$truthy(block)) { 15726 return $send(self, 'enum_for', ["reject"], function $$28(){var self = $$28.$$s == null ? this : $$28.$$s; 15727 15728 return self.$size()}, {$$s: self}) 15729 } 15730 var hash = $hash(); 15731 15732 for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) { 15733 key = keys[i]; 15734 15735 if (key.$$is_string) { 15736 value = self.$$smap[key]; 15737 } else { 15738 value = key.value; 15739 key = key.key; 15740 } 15741 15742 obj = block(key, value); 15743 15744 if (obj === false || obj === nil) { 15745 $hash_put(hash, key, value); 15746 } 15747 } 15748 15749 return hash; 15750 }); 15751 15752 $def(self, '$reject!', function $Hash_reject$excl$29() { 15753 var block = $Hash_reject$excl$29.$$p || nil, self = this; 15754 15755 $Hash_reject$excl$29.$$p = null; 15756 if (!$truthy(block)) { 15757 return $send(self, 'enum_for', ["reject!"], function $$30(){var self = $$30.$$s == null ? this : $$30.$$s; 15758 15759 return self.$size()}, {$$s: self}) 15760 } 15761 $deny_frozen_access(self); 15762 15763 var changes_were_made = false; 15764 15765 for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) { 15766 key = keys[i]; 15767 15768 if (key.$$is_string) { 15769 value = self.$$smap[key]; 15770 } else { 15771 value = key.value; 15772 key = key.key; 15773 } 15774 15775 obj = block(key, value); 15776 15777 if (obj !== false && obj !== nil) { 15778 if ($hash_delete(self, key) !== undefined) { 15779 changes_were_made = true; 15780 length--; 15781 i--; 15782 } 15783 } 15784 } 15785 15786 return changes_were_made ? self : nil; 15787 }); 15788 15789 $def(self, '$replace', function $$replace(other) { 15790 var self = this; 15791 15792 15793 $deny_frozen_access(self); other = $Opal['$coerce_to!'](other, $$$('Hash'), "to_hash"); 15794 15795 $hash_init(self); 15796 15797 for (var i = 0, other_keys = other.$$keys, length = other_keys.length, key, value, other_value; i < length; i++) { 15798 key = other_keys[i]; 15799 15800 if (key.$$is_string) { 15801 other_value = other.$$smap[key]; 15802 } else { 15803 other_value = key.value; 15804 key = key.key; 15805 } 15806 15807 $hash_put(self, key, other_value); 15808 } 15809 if ($truthy(other.$default_proc())) { 15810 self['$default_proc='](other.$default_proc()); 15811 } else { 15812 self['$default='](other.$default()); 15813 } return self; 15814 }); 15815 15816 $def(self, '$select', function $$select() { 15817 var block = $$select.$$p || nil, self = this; 15818 15819 $$select.$$p = null; 15820 if (!$truthy(block)) { 15821 return $send(self, 'enum_for', ["select"], function $$31(){var self = $$31.$$s == null ? this : $$31.$$s; 15822 15823 return self.$size()}, {$$s: self}) 15824 } 15825 var hash = $hash(); 15826 15827 for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) { 15828 key = keys[i]; 15829 15830 if (key.$$is_string) { 15831 value = self.$$smap[key]; 15832 } else { 15833 value = key.value; 15834 key = key.key; 15835 } 15836 15837 obj = block(key, value); 15838 15839 if (obj !== false && obj !== nil) { 15840 $hash_put(hash, key, value); 15841 } 15842 } 15843 15844 return hash; 15845 }); 15846 15847 $def(self, '$select!', function $Hash_select$excl$32() { 15848 var block = $Hash_select$excl$32.$$p || nil, self = this; 15849 15850 $Hash_select$excl$32.$$p = null; 15851 if (!$truthy(block)) { 15852 return $send(self, 'enum_for', ["select!"], function $$33(){var self = $$33.$$s == null ? this : $$33.$$s; 15853 15854 return self.$size()}, {$$s: self}) 15855 } 15856 $deny_frozen_access(self); 15857 15858 var result = nil; 15859 15860 for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) { 15861 key = keys[i]; 15862 15863 if (key.$$is_string) { 15864 value = self.$$smap[key]; 15865 } else { 15866 value = key.value; 15867 key = key.key; 15868 } 15869 15870 obj = block(key, value); 15871 15872 if (obj === false || obj === nil) { 15873 if ($hash_delete(self, key) !== undefined) { 15874 length--; 15875 i--; 15876 } 15877 result = self; 15878 } 15879 } 15880 15881 return result; 15882 }); 15883 15884 $def(self, '$shift', function $$shift() { 15885 var self = this; 15886 15887 15888 $deny_frozen_access(self); 15889 var keys = self.$$keys, 15890 key; 15891 15892 if (keys.length > 0) { 15893 key = keys[0]; 15894 15895 key = key.$$is_string ? key : key.key; 15896 15897 return [key, $hash_delete(self, key)]; 15898 } 15899 15900 return nil; 15901 15902 }); 15903 15904 $def(self, '$slice', function $$slice($a) { 15905 var $post_args, keys, self = this; 15906 15907 15908 $post_args = $slice(arguments); 15909 keys = $post_args; 15910 15911 var result = $hash(); 15912 15913 for (var i = 0, length = keys.length; i < length; i++) { 15914 var key = keys[i], value = $hash_get(self, key); 15915 15916 if (value !== undefined) { 15917 $hash_put(result, key, value); 15918 } 15919 } 15920 15921 return result; 15922 }, -1); 15923 15924 $def(self, '$to_a', function $$to_a() { 15925 var self = this; 15926 15927 15928 var result = []; 15929 15930 for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) { 15931 key = keys[i]; 15932 15933 if (key.$$is_string) { 15934 value = self.$$smap[key]; 15935 } else { 15936 value = key.value; 15937 key = key.key; 15938 } 15939 15940 result.push([key, value]); 15941 } 15942 15943 return result; 15944 15945 }); 15946 15947 $def(self, '$to_h', function $$to_h() { 15948 var block = $$to_h.$$p || nil, self = this; 15949 15950 $$to_h.$$p = null; 15951 if ((block !== nil)) { 15952 return $send(self, 'map', [], block.$to_proc()).$to_h() 15953 } 15954 if (self.$$class === Opal.Hash) { 15955 return self; 15956 } 15957 15958 var hash = new Opal.Hash(); 15959 15960 $hash_init(hash); 15961 Opal.hash_clone(self, hash); 15962 15963 return hash; 15964 }); 15965 15966 $def(self, '$to_hash', $return_self); 15967 15968 $def(self, '$to_proc', function $$to_proc() { 15969 var self = this; 15970 15971 return $send(self, 'proc', [], function $$34(key){var self = $$34.$$s == null ? this : $$34.$$s; 15972 15973 if (key == null) { 15974 $Kernel.$raise($$$('ArgumentError'), "no key given"); 15975 } 15976 return self['$[]'](key);}, {$$arity: -1, $$s: self}) 15977 }); 15978 15979 $def(self, '$transform_keys', function $$transform_keys() { 15980 var block = $$transform_keys.$$p || nil, self = this; 15981 15982 $$transform_keys.$$p = null; 15983 if (!$truthy(block)) { 15984 return $send(self, 'enum_for', ["transform_keys"], function $$35(){var self = $$35.$$s == null ? this : $$35.$$s; 15985 15986 return self.$size()}, {$$s: self}) 15987 } 15988 var result = $hash(); 15989 15990 for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) { 15991 key = keys[i]; 15992 15993 if (key.$$is_string) { 15994 value = self.$$smap[key]; 15995 } else { 15996 value = key.value; 15997 key = key.key; 15998 } 15999 16000 key = $yield1(block, key); 16001 16002 $hash_put(result, key, value); 16003 } 16004 16005 return result; 16006 }); 16007 16008 $def(self, '$transform_keys!', function $Hash_transform_keys$excl$36() { 16009 var block = $Hash_transform_keys$excl$36.$$p || nil, self = this; 16010 16011 $Hash_transform_keys$excl$36.$$p = null; 16012 if (!$truthy(block)) { 16013 return $send(self, 'enum_for', ["transform_keys!"], function $$37(){var self = $$37.$$s == null ? this : $$37.$$s; 16014 16015 return self.$size()}, {$$s: self}) 16016 } 16017 $deny_frozen_access(self); 16018 16019 var keys = Opal.slice(self.$$keys), 16020 i, length = keys.length, key, value, new_key; 16021 16022 for (i = 0; i < length; i++) { 16023 key = keys[i]; 16024 16025 if (key.$$is_string) { 16026 value = self.$$smap[key]; 16027 } else { 16028 value = key.value; 16029 key = key.key; 16030 } 16031 16032 new_key = $yield1(block, key); 16033 16034 $hash_delete(self, key); 16035 $hash_put(self, new_key, value); 16036 } 16037 16038 return self; 16039 }); 16040 16041 $def(self, '$transform_values', function $$transform_values() { 16042 var block = $$transform_values.$$p || nil, self = this; 16043 16044 $$transform_values.$$p = null; 16045 if (!$truthy(block)) { 16046 return $send(self, 'enum_for', ["transform_values"], function $$38(){var self = $$38.$$s == null ? this : $$38.$$s; 16047 16048 return self.$size()}, {$$s: self}) 16049 } 16050 var result = $hash(); 16051 16052 for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) { 16053 key = keys[i]; 16054 16055 if (key.$$is_string) { 16056 value = self.$$smap[key]; 16057 } else { 16058 value = key.value; 16059 key = key.key; 16060 } 16061 16062 value = $yield1(block, value); 16063 16064 $hash_put(result, key, value); 16065 } 16066 16067 return result; 16068 }); 16069 16070 $def(self, '$transform_values!', function $Hash_transform_values$excl$39() { 16071 var block = $Hash_transform_values$excl$39.$$p || nil, self = this; 16072 16073 $Hash_transform_values$excl$39.$$p = null; 16074 if (!$truthy(block)) { 16075 return $send(self, 'enum_for', ["transform_values!"], function $$40(){var self = $$40.$$s == null ? this : $$40.$$s; 16076 16077 return self.$size()}, {$$s: self}) 16078 } 16079 $deny_frozen_access(self); 16080 16081 for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) { 16082 key = keys[i]; 16083 16084 if (key.$$is_string) { 16085 value = self.$$smap[key]; 16086 } else { 16087 value = key.value; 16088 key = key.key; 16089 } 16090 16091 value = $yield1(block, value); 16092 16093 $hash_put(self, key, value); 16094 } 16095 16096 return self; 16097 }); 16098 16099 $def(self, '$values', function $$values() { 16100 var self = this; 16101 16102 16103 var result = []; 16104 16105 for (var i = 0, keys = self.$$keys, length = keys.length, key; i < length; i++) { 16106 key = keys[i]; 16107 16108 if (key.$$is_string) { 16109 result.push(self.$$smap[key]); 16110 } else { 16111 result.push(key.value); 16112 } 16113 } 16114 16115 return result; 16116 16117 }); 16118 $alias(self, "dup", "clone"); 16119 $alias(self, "each_pair", "each"); 16120 $alias(self, "eql?", "=="); 16121 $alias(self, "filter", "select"); 16122 $alias(self, "filter!", "select!"); 16123 $alias(self, "include?", "has_key?"); 16124 $alias(self, "indices", "indexes"); 16125 $alias(self, "key", "index"); 16126 $alias(self, "key?", "has_key?"); 16127 $alias(self, "member?", "has_key?"); 16128 $alias(self, "size", "length"); 16129 $alias(self, "store", "[]="); 16130 $alias(self, "to_s", "inspect"); 16131 $alias(self, "update", "merge!"); 16132 $alias(self, "value?", "has_value?"); 16133 return $alias(self, "values_at", "indexes"); 16134 })('::', null, $nesting); 16135}; 16136 16137Opal.modules["corelib/number"] = function(Opal) {/* Generated by Opal 1.7.3 */ 16138 var $klass = Opal.klass, $Opal = Opal.Opal, $Kernel = Opal.Kernel, $def = Opal.def, $eqeqeq = Opal.eqeqeq, $truthy = Opal.truthy, $rb_gt = Opal.rb_gt, $not = Opal.not, $rb_lt = Opal.rb_lt, $alias = Opal.alias, $send2 = Opal.send2, $find_super = Opal.find_super, $send = Opal.send, $rb_plus = Opal.rb_plus, $rb_minus = Opal.rb_minus, $eqeq = Opal.eqeq, $return_self = Opal.return_self, $rb_divide = Opal.rb_divide, $to_ary = Opal.to_ary, $rb_times = Opal.rb_times, $rb_le = Opal.rb_le, $rb_ge = Opal.rb_ge, $return_val = Opal.return_val, $const_set = Opal.const_set, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 16139 16140 Opal.add_stubs('require,bridge,raise,name,class,Float,respond_to?,coerce_to!,__coerced__,===,>,!,**,new,<,to_f,==,nan?,infinite?,enum_for,+,-,gcd,lcm,%,/,frexp,to_i,ldexp,rationalize,*,<<,to_r,truncate,-@,size,<=,>=,inspect,angle,to_s,is_a?,abs,__id__,next,coerce_to?'); 16141 16142 self.$require("corelib/numeric"); 16143 (function($base, $super, $parent_nesting) { 16144 var self = $klass($base, $super, 'Number'); 16145 16146 16147 $Opal.$bridge(Number, self); 16148 Opal.prop(self.$$prototype, '$$is_number', true); 16149 self.$$is_number_class = true; 16150 (function(self, $parent_nesting) { 16151 16152 16153 16154 $def(self, '$allocate', function $$allocate() { 16155 var self = this; 16156 16157 return $Kernel.$raise($$$('TypeError'), "allocator undefined for " + (self.$name())) 16158 }); 16159 16160 16161 Opal.udef(self, '$' + "new"); return nil; })(Opal.get_singleton_class(self)); 16162 16163 $def(self, '$coerce', function $$coerce(other) { 16164 var self = this; 16165 16166 16167 if (other === nil) { 16168 $Kernel.$raise($$$('TypeError'), "can't convert " + (other.$class()) + " into Float"); 16169 } 16170 else if (other.$$is_string) { 16171 return [$Kernel.$Float(other), self]; 16172 } 16173 else if (other['$respond_to?']("to_f")) { 16174 return [$Opal['$coerce_to!'](other, $$$('Float'), "to_f"), self]; 16175 } 16176 else if (other.$$is_number) { 16177 return [other, self]; 16178 } 16179 else { 16180 $Kernel.$raise($$$('TypeError'), "can't convert " + (other.$class()) + " into Float"); 16181 } 16182 16183 }); 16184 16185 $def(self, '$__id__', function $$__id__() { 16186 var self = this; 16187 16188 return (self * 2) + 1; 16189 }); 16190 16191 $def(self, '$+', function $Number_$plus$1(other) { 16192 var self = this; 16193 16194 16195 if (other.$$is_number) { 16196 return self + other; 16197 } 16198 else { 16199 return self.$__coerced__("+", other); 16200 } 16201 16202 }); 16203 16204 $def(self, '$-', function $Number_$minus$2(other) { 16205 var self = this; 16206 16207 16208 if (other.$$is_number) { 16209 return self - other; 16210 } 16211 else { 16212 return self.$__coerced__("-", other); 16213 } 16214 16215 }); 16216 16217 $def(self, '$*', function $Number_$$3(other) { 16218 var self = this; 16219 16220 16221 if (other.$$is_number) { 16222 return self * other; 16223 } 16224 else { 16225 return self.$__coerced__("*", other); 16226 } 16227 16228 }); 16229 16230 $def(self, '$/', function $Number_$slash$4(other) { 16231 var self = this; 16232 16233 16234 if (other.$$is_number) { 16235 return self / other; 16236 } 16237 else { 16238 return self.$__coerced__("/", other); 16239 } 16240 16241 }); 16242 16243 $def(self, '$%', function $Number_$percent$5(other) { 16244 var self = this; 16245 16246 16247 if (other.$$is_number) { 16248 if (other == -Infinity) { 16249 return other; 16250 } 16251 else if (other == 0) { 16252 $Kernel.$raise($$$('ZeroDivisionError'), "divided by 0"); 16253 } 16254 else if (other < 0 || self < 0) { 16255 return (self % other + other) % other; 16256 } 16257 else { 16258 return self % other; 16259 } 16260 } 16261 else { 16262 return self.$__coerced__("%", other); 16263 } 16264 16265 }); 16266 16267 $def(self, '$&', function $Number_$$6(other) { 16268 var self = this; 16269 16270 16271 if (other.$$is_number) { 16272 return self & other; 16273 } 16274 else { 16275 return self.$__coerced__("&", other); 16276 } 16277 16278 }); 16279 16280 $def(self, '$|', function $Number_$$7(other) { 16281 var self = this; 16282 16283 16284 if (other.$$is_number) { 16285 return self | other; 16286 } 16287 else { 16288 return self.$__coerced__("|", other); 16289 } 16290 16291 }); 16292 16293 $def(self, '$^', function $Number_$$8(other) { 16294 var self = this; 16295 16296 16297 if (other.$$is_number) { 16298 return self ^ other; 16299 } 16300 else { 16301 return self.$__coerced__("^", other); 16302 } 16303 16304 }); 16305 16306 $def(self, '$<', function $Number_$lt$9(other) { 16307 var self = this; 16308 16309 16310 if (other.$$is_number) { 16311 return self < other; 16312 } 16313 else { 16314 return self.$__coerced__("<", other); 16315 } 16316 16317 }); 16318 16319 $def(self, '$<=', function $Number_$lt_eq$10(other) { 16320 var self = this; 16321 16322 16323 if (other.$$is_number) { 16324 return self <= other; 16325 } 16326 else { 16327 return self.$__coerced__("<=", other); 16328 } 16329 16330 }); 16331 16332 $def(self, '$>', function $Number_$gt$11(other) { 16333 var self = this; 16334 16335 16336 if (other.$$is_number) { 16337 return self > other; 16338 } 16339 else { 16340 return self.$__coerced__(">", other); 16341 } 16342 16343 }); 16344 16345 $def(self, '$>=', function $Number_$gt_eq$12(other) { 16346 var self = this; 16347 16348 16349 if (other.$$is_number) { 16350 return self >= other; 16351 } 16352 else { 16353 return self.$__coerced__(">=", other); 16354 } 16355 16356 }); 16357 16358 var spaceship_operator = function(self, other) { 16359 if (other.$$is_number) { 16360 if (isNaN(self) || isNaN(other)) { 16361 return nil; 16362 } 16363 16364 if (self > other) { 16365 return 1; 16366 } else if (self < other) { 16367 return -1; 16368 } else { 16369 return 0; 16370 } 16371 } 16372 else { 16373 return self.$__coerced__("<=>", other); 16374 } 16375 } 16376 ; 16377 16378 $def(self, '$<=>', function $Number_$lt_eq_gt$13(other) { 16379 var self = this; 16380 16381 try { 16382 return spaceship_operator(self, other); 16383 } catch ($err) { 16384 if (Opal.rescue($err, [$$$('ArgumentError')])) { 16385 try { 16386 return nil 16387 } finally { Opal.pop_exception(); } 16388 } else { throw $err; } 16389 } 16390 }); 16391 16392 $def(self, '$<<', function $Number_$lt$lt$14(count) { 16393 var self = this; 16394 16395 16396 count = $Opal['$coerce_to!'](count, $$$('Integer'), "to_int"); 16397 return count > 0 ? self << count : self >> -count; 16398 }); 16399 16400 $def(self, '$>>', function $Number_$gt$gt$15(count) { 16401 var self = this; 16402 16403 16404 count = $Opal['$coerce_to!'](count, $$$('Integer'), "to_int"); 16405 return count > 0 ? self >> count : self << -count; 16406 }); 16407 16408 $def(self, '$[]', function $Number_$$$16(bit) { 16409 var self = this; 16410 16411 16412 bit = $Opal['$coerce_to!'](bit, $$$('Integer'), "to_int"); 16413 16414 if (bit < 0) { 16415 return 0; 16416 } 16417 if (bit >= 32) { 16418 return self < 0 ? 1 : 0; 16419 } 16420 return (self >> bit) & 1; 16421 }); 16422 16423 $def(self, '$+@', function $Number_$plus$$17() { 16424 var self = this; 16425 16426 return +self; 16427 }); 16428 16429 $def(self, '$-@', function $Number_$minus$$18() { 16430 var self = this; 16431 16432 return -self; 16433 }); 16434 16435 $def(self, '$~', function $Number_$$19() { 16436 var self = this; 16437 16438 return ~self; 16439 }); 16440 16441 $def(self, '$**', function $Number_$$$20(other) { 16442 var self = this; 16443 16444 if ($eqeqeq($$$('Integer'), other)) { 16445 if (($not($$$('Integer')['$==='](self)) || ($truthy($rb_gt(other, 0))))) { 16446 return Math.pow(self, other); 16447 } else { 16448 return $$$('Rational').$new(self, 1)['$**'](other) 16449 } 16450 } else if (($rb_lt(self, 0) && (($eqeqeq($$$('Float'), other) || ($eqeqeq($$$('Rational'), other)))))) { 16451 return $$$('Complex').$new(self, 0)['$**'](other.$to_f()) 16452 } else if ($truthy(other.$$is_number != null)) { 16453 return Math.pow(self, other); 16454 } else { 16455 return self.$__coerced__("**", other) 16456 } 16457 }); 16458 16459 $def(self, '$==', function $Number_$eq_eq$21(other) { 16460 var self = this; 16461 16462 16463 if (other.$$is_number) { 16464 return self.valueOf() === other.valueOf(); 16465 } 16466 else if (other['$respond_to?']("==")) { 16467 return other['$=='](self); 16468 } 16469 else { 16470 return false; 16471 } 16472 16473 }); 16474 $alias(self, "===", "=="); 16475 16476 $def(self, '$abs', function $$abs() { 16477 var self = this; 16478 16479 return Math.abs(self); 16480 }); 16481 16482 $def(self, '$abs2', function $$abs2() { 16483 var self = this; 16484 16485 return Math.abs(self * self); 16486 }); 16487 16488 $def(self, '$allbits?', function $Number_allbits$ques$22(mask) { 16489 var self = this; 16490 16491 16492 mask = $Opal['$coerce_to!'](mask, $$$('Integer'), "to_int"); 16493 return (self & mask) == mask; }); 16494 16495 $def(self, '$anybits?', function $Number_anybits$ques$23(mask) { 16496 var self = this; 16497 16498 16499 mask = $Opal['$coerce_to!'](mask, $$$('Integer'), "to_int"); 16500 return (self & mask) !== 0; }); 16501 16502 $def(self, '$angle', function $$angle() { 16503 var self = this; 16504 16505 16506 if ($truthy(self['$nan?']())) { 16507 return self 16508 } 16509 if (self == 0) { 16510 if (1 / self > 0) { 16511 return 0; 16512 } 16513 else { 16514 return Math.PI; 16515 } 16516 } 16517 else if (self < 0) { 16518 return Math.PI; 16519 } 16520 else { 16521 return 0; 16522 } 16523 }); 16524 16525 $def(self, '$bit_length', function $$bit_length() { 16526 var self = this; 16527 16528 16529 if (!$eqeqeq($$$('Integer'), self)) { 16530 $Kernel.$raise($$$('NoMethodError').$new("undefined method `bit_length` for " + (self) + ":Float", "bit_length")); 16531 } 16532 if (self === 0 || self === -1) { 16533 return 0; 16534 } 16535 16536 var result = 0, 16537 value = self < 0 ? ~self : self; 16538 16539 while (value != 0) { 16540 result += 1; 16541 value >>>= 1; 16542 } 16543 16544 return result; 16545 }); 16546 16547 $def(self, '$ceil', function $$ceil(ndigits) { 16548 var self = this; 16549 16550 16551 if (ndigits == null) ndigits = 0; 16552 16553 var f = self.$to_f(); 16554 16555 if (f % 1 === 0 && ndigits >= 0) { 16556 return f; 16557 } 16558 16559 var factor = Math.pow(10, ndigits), 16560 result = Math.ceil(f * factor) / factor; 16561 16562 if (f % 1 === 0) { 16563 result = Math.round(result); 16564 } 16565 16566 return result; 16567 }, -1); 16568 16569 $def(self, '$chr', function $$chr(encoding) { 16570 var self = this; 16571 return Opal.enc(String.fromCharCode(self), encoding || "BINARY"); }, -1); 16572 16573 $def(self, '$denominator', function $$denominator() { 16574 var $yield = $$denominator.$$p || nil, self = this; 16575 16576 $$denominator.$$p = null; 16577 if (($truthy(self['$nan?']()) || ($truthy(self['$infinite?']())))) { 16578 return 1 16579 } else { 16580 return $send2(self, $find_super(self, 'denominator', $$denominator, false, true), 'denominator', [], $yield) 16581 } 16582 }); 16583 16584 $def(self, '$downto', function $$downto(stop) { 16585 var block = $$downto.$$p || nil, self = this; 16586 16587 $$downto.$$p = null; 16588 if (!(block !== nil)) { 16589 return $send(self, 'enum_for', ["downto", stop], function $$24(){var self = $$24.$$s == null ? this : $$24.$$s; 16590 16591 16592 if (!$eqeqeq($$$('Numeric'), stop)) { 16593 $Kernel.$raise($$$('ArgumentError'), "comparison of " + (self.$class()) + " with " + (stop.$class()) + " failed"); 16594 } if ($truthy($rb_gt(stop, self))) { 16595 return 0 16596 } else { 16597 return $rb_plus($rb_minus(self, stop), 1) 16598 }}, {$$s: self}) 16599 } 16600 if (!stop.$$is_number) { 16601 $Kernel.$raise($$$('ArgumentError'), "comparison of " + (self.$class()) + " with " + (stop.$class()) + " failed"); 16602 } 16603 for (var i = self; i >= stop; i--) { 16604 block(i); 16605 } 16606 return self; 16607 }); 16608 16609 $def(self, '$equal?', function $Number_equal$ques$25(other) { 16610 var self = this, $ret_or_1 = nil; 16611 16612 if ($truthy(($ret_or_1 = self['$=='](other)))) { 16613 return $ret_or_1 16614 } else { 16615 return isNaN(self) && isNaN(other); 16616 } 16617 }); 16618 16619 $def(self, '$even?', function $Number_even$ques$26() { 16620 var self = this; 16621 16622 return self % 2 === 0; 16623 }); 16624 16625 $def(self, '$floor', function $$floor(ndigits) { 16626 var self = this; 16627 16628 16629 if (ndigits == null) ndigits = 0; 16630 16631 var f = self.$to_f(); 16632 16633 if (f % 1 === 0 && ndigits >= 0) { 16634 return f; 16635 } 16636 16637 var factor = Math.pow(10, ndigits), 16638 result = Math.floor(f * factor) / factor; 16639 16640 if (f % 1 === 0) { 16641 result = Math.round(result); 16642 } 16643 16644 return result; 16645 }, -1); 16646 16647 $def(self, '$gcd', function $$gcd(other) { 16648 var self = this; 16649 16650 16651 if (!$eqeqeq($$$('Integer'), other)) { 16652 $Kernel.$raise($$$('TypeError'), "not an integer"); 16653 } 16654 var min = Math.abs(self), 16655 max = Math.abs(other); 16656 16657 while (min > 0) { 16658 var tmp = min; 16659 16660 min = max % min; 16661 max = tmp; 16662 } 16663 16664 return max; 16665 }); 16666 16667 $def(self, '$gcdlcm', function $$gcdlcm(other) { 16668 var self = this; 16669 16670 return [self.$gcd(other), self.$lcm(other)] 16671 }); 16672 16673 $def(self, '$integer?', function $Number_integer$ques$27() { 16674 var self = this; 16675 16676 return self % 1 === 0; 16677 }); 16678 16679 $def(self, '$is_a?', function $Number_is_a$ques$28(klass) { 16680 var $yield = $Number_is_a$ques$28.$$p || nil, self = this; 16681 16682 $Number_is_a$ques$28.$$p = null; 16683 16684 if (($eqeq(klass, $$$('Integer')) && ($eqeqeq($$$('Integer'), self)))) { 16685 return true 16686 } if (($eqeq(klass, $$$('Integer')) && ($eqeqeq($$$('Integer'), self)))) { 16687 return true 16688 } if (($eqeq(klass, $$$('Float')) && ($eqeqeq($$$('Float'), self)))) { 16689 return true 16690 } return $send2(self, $find_super(self, 'is_a?', $Number_is_a$ques$28, false, true), 'is_a?', [klass], $yield); 16691 }); 16692 16693 $def(self, '$instance_of?', function $Number_instance_of$ques$29(klass) { 16694 var $yield = $Number_instance_of$ques$29.$$p || nil, self = this; 16695 16696 $Number_instance_of$ques$29.$$p = null; 16697 16698 if (($eqeq(klass, $$$('Integer')) && ($eqeqeq($$$('Integer'), self)))) { 16699 return true 16700 } if (($eqeq(klass, $$$('Integer')) && ($eqeqeq($$$('Integer'), self)))) { 16701 return true 16702 } if (($eqeq(klass, $$$('Float')) && ($eqeqeq($$$('Float'), self)))) { 16703 return true 16704 } return $send2(self, $find_super(self, 'instance_of?', $Number_instance_of$ques$29, false, true), 'instance_of?', [klass], $yield); 16705 }); 16706 16707 $def(self, '$lcm', function $$lcm(other) { 16708 var self = this; 16709 16710 16711 if (!$eqeqeq($$$('Integer'), other)) { 16712 $Kernel.$raise($$$('TypeError'), "not an integer"); 16713 } 16714 if (self == 0 || other == 0) { 16715 return 0; 16716 } 16717 else { 16718 return Math.abs(self * other / self.$gcd(other)); 16719 } 16720 }); 16721 16722 $def(self, '$next', function $$next() { 16723 var self = this; 16724 16725 return self + 1; 16726 }); 16727 16728 $def(self, '$nobits?', function $Number_nobits$ques$30(mask) { 16729 var self = this; 16730 16731 16732 mask = $Opal['$coerce_to!'](mask, $$$('Integer'), "to_int"); 16733 return (self & mask) == 0; }); 16734 16735 $def(self, '$nonzero?', function $Number_nonzero$ques$31() { 16736 var self = this; 16737 16738 return self == 0 ? nil : self; 16739 }); 16740 16741 $def(self, '$numerator', function $$numerator() { 16742 var $yield = $$numerator.$$p || nil, self = this; 16743 16744 $$numerator.$$p = null; 16745 if (($truthy(self['$nan?']()) || ($truthy(self['$infinite?']())))) { 16746 return self 16747 } else { 16748 return $send2(self, $find_super(self, 'numerator', $$numerator, false, true), 'numerator', [], $yield) 16749 } 16750 }); 16751 16752 $def(self, '$odd?', function $Number_odd$ques$32() { 16753 var self = this; 16754 16755 return self % 2 !== 0; 16756 }); 16757 16758 $def(self, '$ord', $return_self); 16759 16760 $def(self, '$pow', function $$pow(b, m) { 16761 var self = this; 16762 16763 if (self == 0) { 16764 $Kernel.$raise($$$('ZeroDivisionError'), "divided by 0"); 16765 } 16766 16767 if (m === undefined) { 16768 return self['$**'](b); 16769 } else { 16770 if (!($$$('Integer')['$==='](b))) { 16771 $Kernel.$raise($$$('TypeError'), "Integer#pow() 2nd argument not allowed unless a 1st argument is integer"); 16772 } 16773 16774 if (b < 0) { 16775 $Kernel.$raise($$$('TypeError'), "Integer#pow() 1st argument cannot be negative when 2nd argument specified"); 16776 } 16777 16778 if (!($$$('Integer')['$==='](m))) { 16779 $Kernel.$raise($$$('TypeError'), "Integer#pow() 2nd argument not allowed unless all arguments are integers"); 16780 } 16781 16782 if (m === 0) { 16783 $Kernel.$raise($$$('ZeroDivisionError'), "divided by 0"); 16784 } 16785 16786 return self['$**'](b)['$%'](m) 16787 } 16788 }, -2); 16789 16790 $def(self, '$pred', function $$pred() { 16791 var self = this; 16792 16793 return self - 1; 16794 }); 16795 16796 $def(self, '$quo', function $$quo(other) { 16797 var $yield = $$quo.$$p || nil, self = this; 16798 16799 $$quo.$$p = null; 16800 if ($eqeqeq($$$('Integer'), self)) { 16801 return $send2(self, $find_super(self, 'quo', $$quo, false, true), 'quo', [other], $yield) 16802 } else { 16803 return $rb_divide(self, other) 16804 } 16805 }); 16806 16807 $def(self, '$rationalize', function $$rationalize(eps) { 16808 var $a, $b, self = this, f = nil, n = nil; 16809 16810 if (arguments.length > 1) { 16811 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (arguments.length) + " for 0..1)"); 16812 } 16813 if ($eqeqeq($$$('Integer'), self)) { 16814 return $$$('Rational').$new(self, 1) 16815 } else if ($truthy(self['$infinite?']())) { 16816 return $Kernel.$raise($$$('FloatDomainError'), "Infinity") 16817 } else if ($truthy(self['$nan?']())) { 16818 return $Kernel.$raise($$$('FloatDomainError'), "NaN") 16819 } else if ($truthy(eps == null)) { 16820 16821 $b = $$$('Math').$frexp(self), $a = $to_ary($b), (f = ($a[0] == null ? nil : $a[0])), (n = ($a[1] == null ? nil : $a[1])); 16822 f = $$$('Math').$ldexp(f, $$$($$$('Float'), 'MANT_DIG')).$to_i(); 16823 n = $rb_minus(n, $$$($$$('Float'), 'MANT_DIG')); 16824 return $$$('Rational').$new($rb_times(2, f), (1)['$<<']($rb_minus(1, n))).$rationalize($$$('Rational').$new(1, (1)['$<<']($rb_minus(1, n)))); 16825 } else { 16826 return self.$to_r().$rationalize(eps) 16827 } }, -1); 16828 16829 $def(self, '$remainder', function $$remainder(y) { 16830 var self = this; 16831 16832 return $rb_minus(self, $rb_times(y, $rb_divide(self, y).$truncate())) 16833 }); 16834 16835 $def(self, '$round', function $$round(ndigits) { 16836 var $a, $b, self = this, exp = nil; 16837 if ($eqeqeq($$$('Integer'), self)) { 16838 16839 if ($truthy(ndigits == null)) { 16840 return self 16841 } if (($eqeqeq($$$('Float'), ndigits) && ($truthy(ndigits['$infinite?']())))) { 16842 $Kernel.$raise($$$('RangeError'), "Infinity"); 16843 } ndigits = $Opal['$coerce_to!'](ndigits, $$$('Integer'), "to_int"); 16844 if ($truthy($rb_lt(ndigits, $$$($$$('Integer'), 'MIN')))) { 16845 $Kernel.$raise($$$('RangeError'), "out of bounds"); 16846 } if ($truthy(ndigits >= 0)) { 16847 return self 16848 } ndigits = ndigits['$-@'](); 16849 16850 if (0.415241 * ndigits - 0.125 > self.$size()) { 16851 return 0; 16852 } 16853 16854 var f = Math.pow(10, ndigits), 16855 x = Math.floor((Math.abs(self) + f / 2) / f) * f; 16856 16857 return self < 0 ? -x : x; 16858 } else { 16859 16860 if (($truthy(self['$nan?']()) && ($truthy(ndigits == null)))) { 16861 $Kernel.$raise($$$('FloatDomainError'), "NaN"); 16862 } ndigits = $Opal['$coerce_to!'](ndigits || 0, $$$('Integer'), "to_int"); 16863 if ($truthy($rb_le(ndigits, 0))) { 16864 if ($truthy(self['$nan?']())) { 16865 $Kernel.$raise($$$('RangeError'), "NaN"); 16866 } else if ($truthy(self['$infinite?']())) { 16867 $Kernel.$raise($$$('FloatDomainError'), "Infinity"); 16868 } 16869 } else if ($eqeq(ndigits, 0)) { 16870 return Math.round(self) 16871 } else if (($truthy(self['$nan?']()) || ($truthy(self['$infinite?']())))) { 16872 return self 16873 } $b = $$$('Math').$frexp(self), $a = $to_ary($b), (($a[0] == null ? nil : $a[0])), (exp = ($a[1] == null ? nil : $a[1])); 16874 if ($truthy($rb_ge(ndigits, $rb_minus($rb_plus($$$($$$('Float'), 'DIG'), 2), ($truthy($rb_gt(exp, 0)) ? ($rb_divide(exp, 4)) : ($rb_minus($rb_divide(exp, 3), 1))))))) { 16875 return self 16876 } if ($truthy($rb_lt(ndigits, ($truthy($rb_gt(exp, 0)) ? ($rb_plus($rb_divide(exp, 3), 1)) : ($rb_divide(exp, 4)))['$-@']()))) { 16877 return 0 16878 } return Math.round(self * Math.pow(10, ndigits)) / Math.pow(10, ndigits); } }, -1); 16879 16880 $def(self, '$times', function $$times() { 16881 var block = $$times.$$p || nil, self = this; 16882 16883 $$times.$$p = null; 16884 if (!$truthy(block)) { 16885 return $send(self, 'enum_for', ["times"], function $$33(){var self = $$33.$$s == null ? this : $$33.$$s; 16886 16887 return self}, {$$s: self}) 16888 } 16889 for (var i = 0; i < self; i++) { 16890 block(i); 16891 } 16892 return self; 16893 }); 16894 16895 $def(self, '$to_f', $return_self); 16896 16897 $def(self, '$to_i', function $$to_i() { 16898 var self = this; 16899 16900 return self < 0 ? Math.ceil(self) : Math.floor(self); 16901 }); 16902 16903 $def(self, '$to_r', function $$to_r() { 16904 var $a, $b, self = this, f = nil, e = nil; 16905 16906 if ($eqeqeq($$$('Integer'), self)) { 16907 return $$$('Rational').$new(self, 1) 16908 } else { 16909 16910 $b = $$$('Math').$frexp(self), $a = $to_ary($b), (f = ($a[0] == null ? nil : $a[0])), (e = ($a[1] == null ? nil : $a[1])); 16911 f = $$$('Math').$ldexp(f, $$$($$$('Float'), 'MANT_DIG')).$to_i(); 16912 e = $rb_minus(e, $$$($$$('Float'), 'MANT_DIG')); 16913 return $rb_times(f, $$$($$$('Float'), 'RADIX')['$**'](e)).$to_r(); 16914 } 16915 }); 16916 16917 $def(self, '$to_s', function $$to_s(base) { 16918 var self = this; 16919 16920 16921 if (base == null) base = 10; 16922 base = $Opal['$coerce_to!'](base, $$$('Integer'), "to_int"); 16923 if (($truthy($rb_lt(base, 2)) || ($truthy($rb_gt(base, 36))))) { 16924 $Kernel.$raise($$$('ArgumentError'), "invalid radix " + (base)); 16925 } if (($eqeq(self, 0) && ($truthy(1/self === -Infinity)))) { 16926 return "-0.0" 16927 } return self.toString(base); }, -1); 16928 16929 $def(self, '$truncate', function $$truncate(ndigits) { 16930 var self = this; 16931 16932 16933 if (ndigits == null) ndigits = 0; 16934 16935 var f = self.$to_f(); 16936 16937 if (f % 1 === 0 && ndigits >= 0) { 16938 return f; 16939 } 16940 16941 var factor = Math.pow(10, ndigits), 16942 result = parseInt(f * factor, 10) / factor; 16943 16944 if (f % 1 === 0) { 16945 result = Math.round(result); 16946 } 16947 16948 return result; 16949 }, -1); 16950 16951 $def(self, '$digits', function $$digits(base) { 16952 var self = this; 16953 16954 16955 if (base == null) base = 10; 16956 if ($rb_lt(self, 0)) { 16957 $Kernel.$raise($$$($$$('Math'), 'DomainError'), "out of domain"); 16958 } base = $Opal['$coerce_to!'](base, $$$('Integer'), "to_int"); 16959 if ($truthy($rb_lt(base, 2))) { 16960 $Kernel.$raise($$$('ArgumentError'), "invalid radix " + (base)); 16961 } 16962 if (self != parseInt(self)) $Kernel.$raise($$$('NoMethodError'), "undefined method `digits' for " + (self.$inspect())); 16963 16964 var value = self, result = []; 16965 16966 if (self == 0) { 16967 return [0]; 16968 } 16969 16970 while (value != 0) { 16971 result.push(value % base); 16972 value = parseInt(value / base, 10); 16973 } 16974 16975 return result; 16976 }, -1); 16977 16978 $def(self, '$divmod', function $$divmod(other) { 16979 var $yield = $$divmod.$$p || nil, self = this; 16980 16981 $$divmod.$$p = null; 16982 if (($truthy(self['$nan?']()) || ($truthy(other['$nan?']())))) { 16983 return $Kernel.$raise($$$('FloatDomainError'), "NaN") 16984 } else if ($truthy(self['$infinite?']())) { 16985 return $Kernel.$raise($$$('FloatDomainError'), "Infinity") 16986 } else { 16987 return $send2(self, $find_super(self, 'divmod', $$divmod, false, true), 'divmod', [other], $yield) 16988 } 16989 }); 16990 16991 $def(self, '$upto', function $$upto(stop) { 16992 var block = $$upto.$$p || nil, self = this; 16993 16994 $$upto.$$p = null; 16995 if (!(block !== nil)) { 16996 return $send(self, 'enum_for', ["upto", stop], function $$34(){var self = $$34.$$s == null ? this : $$34.$$s; 16997 16998 16999 if (!$eqeqeq($$$('Numeric'), stop)) { 17000 $Kernel.$raise($$$('ArgumentError'), "comparison of " + (self.$class()) + " with " + (stop.$class()) + " failed"); 17001 } if ($truthy($rb_lt(stop, self))) { 17002 return 0 17003 } else { 17004 return $rb_plus($rb_minus(stop, self), 1) 17005 }}, {$$s: self}) 17006 } 17007 if (!stop.$$is_number) { 17008 $Kernel.$raise($$$('ArgumentError'), "comparison of " + (self.$class()) + " with " + (stop.$class()) + " failed"); 17009 } 17010 for (var i = self; i <= stop; i++) { 17011 block(i); 17012 } 17013 return self; 17014 }); 17015 17016 $def(self, '$zero?', function $Number_zero$ques$35() { 17017 var self = this; 17018 17019 return self == 0; 17020 }); 17021 17022 $def(self, '$size', $return_val(4)); 17023 17024 $def(self, '$nan?', function $Number_nan$ques$36() { 17025 var self = this; 17026 17027 return isNaN(self); 17028 }); 17029 17030 $def(self, '$finite?', function $Number_finite$ques$37() { 17031 var self = this; 17032 17033 return self != Infinity && self != -Infinity && !isNaN(self); 17034 }); 17035 17036 $def(self, '$infinite?', function $Number_infinite$ques$38() { 17037 var self = this; 17038 17039 17040 if (self == Infinity) { 17041 return +1; 17042 } 17043 else if (self == -Infinity) { 17044 return -1; 17045 } 17046 else { 17047 return nil; 17048 } 17049 17050 }); 17051 17052 $def(self, '$positive?', function $Number_positive$ques$39() { 17053 var self = this; 17054 17055 return self != 0 && (self == Infinity || 1 / self > 0); 17056 }); 17057 17058 $def(self, '$negative?', function $Number_negative$ques$40() { 17059 var self = this; 17060 17061 return self == -Infinity || 1 / self < 0; 17062 }); 17063 17064 function numberToUint8Array(num) { 17065 var uint8array = new Uint8Array(8); 17066 new DataView(uint8array.buffer).setFloat64(0, num, true); 17067 return uint8array; 17068 } 17069 17070 function uint8ArrayToNumber(arr) { 17071 return new DataView(arr.buffer).getFloat64(0, true); 17072 } 17073 17074 function incrementNumberBit(num) { 17075 var arr = numberToUint8Array(num); 17076 for (var i = 0; i < arr.length; i++) { 17077 if (arr[i] === 0xff) { 17078 arr[i] = 0; 17079 } else { 17080 arr[i]++; 17081 break; 17082 } 17083 } 17084 return uint8ArrayToNumber(arr); 17085 } 17086 17087 function decrementNumberBit(num) { 17088 var arr = numberToUint8Array(num); 17089 for (var i = 0; i < arr.length; i++) { 17090 if (arr[i] === 0) { 17091 arr[i] = 0xff; 17092 } else { 17093 arr[i]--; 17094 break; 17095 } 17096 } 17097 return uint8ArrayToNumber(arr); 17098 } 17099 17100 $def(self, '$next_float', function $$next_float() { 17101 var self = this; 17102 17103 17104 if ($eqeq(self, $$$($$$('Float'), 'INFINITY'))) { 17105 return $$$($$$('Float'), 'INFINITY') 17106 } if ($truthy(self['$nan?']())) { 17107 return $$$($$$('Float'), 'NAN') 17108 } if ($rb_ge(self, 0)) { 17109 return incrementNumberBit(Math.abs(self)); 17110 } else { 17111 return decrementNumberBit(self); 17112 } }); 17113 17114 $def(self, '$prev_float', function $$prev_float() { 17115 var self = this; 17116 17117 17118 if ($eqeq(self, $$$($$$('Float'), 'INFINITY')['$-@']())) { 17119 return $$$($$$('Float'), 'INFINITY')['$-@']() 17120 } if ($truthy(self['$nan?']())) { 17121 return $$$($$$('Float'), 'NAN') 17122 } if ($rb_gt(self, 0)) { 17123 return decrementNumberBit(self); 17124 } else { 17125 return -incrementNumberBit(Math.abs(self)); 17126 } }); 17127 $alias(self, "arg", "angle"); 17128 $alias(self, "eql?", "=="); 17129 $alias(self, "fdiv", "/"); 17130 $alias(self, "inspect", "to_s"); 17131 $alias(self, "kind_of?", "is_a?"); 17132 $alias(self, "magnitude", "abs"); 17133 $alias(self, "modulo", "%"); 17134 $alias(self, "object_id", "__id__"); 17135 $alias(self, "phase", "angle"); 17136 $alias(self, "succ", "next"); 17137 return $alias(self, "to_int", "to_i"); 17138 })('::', $$$('Numeric')); 17139 $const_set('::', 'Fixnum', $$$('Number')); 17140 (function($base, $super, $parent_nesting) { 17141 var self = $klass($base, $super, 'Integer'); 17142 17143 var $nesting = [self].concat($parent_nesting); 17144 17145 17146 self.$$is_number_class = true; 17147 self.$$is_integer_class = true; 17148 (function(self, $parent_nesting) { 17149 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 17150 17151 17152 17153 $def(self, '$allocate', function $$allocate() { 17154 var self = this; 17155 17156 return $Kernel.$raise($$$('TypeError'), "allocator undefined for " + (self.$name())) 17157 }); 17158 17159 Opal.udef(self, '$' + "new"); 17160 $def(self, '$sqrt', function $$sqrt(n) { 17161 17162 17163 n = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int"); 17164 17165 if (n < 0) { 17166 $Kernel.$raise($$$($$$('Math'), 'DomainError'), "Numerical argument is out of domain - \"isqrt\""); 17167 } 17168 17169 return parseInt(Math.sqrt(n), 10); 17170 }); 17171 return $def(self, '$try_convert', function $$try_convert(object) { 17172 var self = this; 17173 17174 return $$('Opal')['$coerce_to?'](object, self, "to_int") 17175 }); 17176 })(Opal.get_singleton_class(self), $nesting); 17177 $const_set(self, 'MAX', Math.pow(2, 30) - 1); 17178 return $const_set(self, 'MIN', -Math.pow(2, 30)); 17179 })('::', $$$('Numeric'), $nesting); 17180 return (function($base, $super, $parent_nesting) { 17181 var self = $klass($base, $super, 'Float'); 17182 17183 17184 self.$$is_number_class = true; 17185 (function(self, $parent_nesting) { 17186 17187 17188 17189 $def(self, '$allocate', function $$allocate() { 17190 var self = this; 17191 17192 return $Kernel.$raise($$$('TypeError'), "allocator undefined for " + (self.$name())) 17193 }); 17194 17195 Opal.udef(self, '$' + "new"); return $def(self, '$===', function $eq_eq_eq$41(other) { 17196 17197 return !!other.$$is_number; 17198 }); 17199 })(Opal.get_singleton_class(self)); 17200 $const_set(self, 'INFINITY', Infinity); 17201 $const_set(self, 'MAX', Number.MAX_VALUE); 17202 $const_set(self, 'MIN', Number.MIN_VALUE); 17203 $const_set(self, 'NAN', NaN); 17204 $const_set(self, 'DIG', 15); 17205 $const_set(self, 'MANT_DIG', 53); 17206 $const_set(self, 'RADIX', 2); 17207 return $const_set(self, 'EPSILON', Number.EPSILON || 2.2204460492503130808472633361816E-16); 17208 })('::', $$$('Numeric')); 17209}; 17210 17211Opal.modules["corelib/range"] = function(Opal) {/* Generated by Opal 1.7.3 */ 17212 var $klass = Opal.klass, $truthy = Opal.truthy, $Kernel = Opal.Kernel, $def = Opal.def, $not = Opal.not, $send2 = Opal.send2, $find_super = Opal.find_super, $rb_lt = Opal.rb_lt, $rb_le = Opal.rb_le, $send = Opal.send, $eqeq = Opal.eqeq, $eqeqeq = Opal.eqeqeq, $return_ivar = Opal.return_ivar, $rb_gt = Opal.rb_gt, $rb_minus = Opal.rb_minus, $Opal = Opal.Opal, $rb_divide = Opal.rb_divide, $rb_plus = Opal.rb_plus, $rb_times = Opal.rb_times, $rb_ge = Opal.rb_ge, $thrower = Opal.thrower, $alias = Opal.alias, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 17213 17214 Opal.add_stubs('require,include,attr_reader,raise,nil?,<=>,include?,!,<,<=,enum_for,size,upto,to_proc,respond_to?,class,succ,==,===,exclude_end?,eql?,begin,end,last,to_a,>,-@,-,to_i,coerce_to!,ceil,/,is_a?,new,loop,+,*,>=,each_with_index,%,step,bsearch,inspect,[],hash,cover?'); 17215 17216 self.$require("corelib/enumerable"); 17217 return (function($base, $super, $parent_nesting) { 17218 var self = $klass($base, $super, 'Range'); 17219 17220 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype; 17221 17222 $proto.begin = $proto.end = $proto.excl = nil; 17223 17224 self.$include($$$('Enumerable')); 17225 self.$$prototype.$$is_range = true; 17226 self.$attr_reader("begin", "end"); 17227 17228 $def(self, '$initialize', function $$initialize(first, last, exclude) { 17229 var self = this; 17230 17231 17232 if (exclude == null) exclude = false; 17233 if ($truthy(self.begin)) { 17234 $Kernel.$raise($$$('NameError'), "'initialize' called twice"); 17235 } if (!(($truthy(first['$<=>'](last)) || ($truthy(first['$nil?']()))) || ($truthy(last['$nil?']())))) { 17236 $Kernel.$raise($$$('ArgumentError'), "bad value for range"); 17237 } self.begin = first; 17238 self.end = last; 17239 return (self.excl = exclude); 17240 }, -3); 17241 17242 $def(self, '$===', function $Range_$eq_eq_eq$1(value) { 17243 var self = this; 17244 17245 return self['$include?'](value) 17246 }); 17247 17248 function is_infinite(self) { 17249 if (self.begin === nil || self.end === nil || 17250 self.begin === -Infinity || self.end === Infinity || 17251 self.begin === Infinity || self.end === -Infinity) return true; 17252 return false; 17253 } 17254 17255 $def(self, '$count', function $$count() { 17256 var block = $$count.$$p || nil, self = this; 17257 17258 $$count.$$p = null; 17259 if (($not((block !== nil)) && ($truthy(is_infinite(self))))) { 17260 return $$$($$$('Float'), 'INFINITY') 17261 } return $send2(self, $find_super(self, 'count', $$count, false, true), 'count', [], block); 17262 }); 17263 17264 $def(self, '$to_a', function $$to_a() { 17265 var $yield = $$to_a.$$p || nil, self = this; 17266 17267 $$to_a.$$p = null; 17268 17269 if ($truthy(is_infinite(self))) { 17270 $Kernel.$raise($$$('TypeError'), "cannot convert endless range to an array"); 17271 } return $send2(self, $find_super(self, 'to_a', $$to_a, false, true), 'to_a', [], $yield); 17272 }); 17273 17274 $def(self, '$cover?', function $Range_cover$ques$2(value) { 17275 var self = this, beg_cmp = nil, $ret_or_1 = nil, $ret_or_2 = nil, $ret_or_3 = nil, end_cmp = nil; 17276 17277 17278 beg_cmp = ($truthy(($ret_or_1 = ($truthy(($ret_or_2 = ($truthy(($ret_or_3 = self.begin['$nil?']())) ? (-1) : ($ret_or_3)))) ? ($ret_or_2) : (self.begin['$<=>'](value))))) && ($ret_or_1)); 17279 end_cmp = ($truthy(($ret_or_1 = ($truthy(($ret_or_2 = ($truthy(($ret_or_3 = self.end['$nil?']())) ? (-1) : ($ret_or_3)))) ? ($ret_or_2) : (value['$<=>'](self.end))))) && ($ret_or_1)); 17280 if ($truthy(($ret_or_1 = ($truthy(($ret_or_2 = ($truthy(self.excl) ? (($truthy(($ret_or_3 = end_cmp)) ? ($rb_lt(end_cmp, 0)) : ($ret_or_3))) : ($truthy(($ret_or_3 = end_cmp)) ? ($rb_le(end_cmp, 0)) : ($ret_or_3))))) ? (beg_cmp) : ($ret_or_2))))) { 17281 return $rb_le(beg_cmp, 0) 17282 } else { 17283 return $ret_or_1 17284 } }); 17285 17286 $def(self, '$each', function $$each() { 17287 var block = $$each.$$p || nil, self = this, current = nil, last = nil, $ret_or_1 = nil; 17288 17289 $$each.$$p = null; 17290 if (!(block !== nil)) { 17291 return $send(self, 'enum_for', ["each"], function $$3(){var self = $$3.$$s == null ? this : $$3.$$s; 17292 17293 return self.$size()}, {$$s: self}) 17294 } 17295 var i, limit; 17296 17297 if (self.begin.$$is_number && self.end.$$is_number) { 17298 if (self.begin % 1 !== 0 || self.end % 1 !== 0) { 17299 $Kernel.$raise($$$('TypeError'), "can't iterate from Float"); 17300 } 17301 17302 for (i = self.begin, limit = self.end + ($truthy(self.excl) ? (0) : (1)); i < limit; i++) { 17303 block(i); 17304 } 17305 17306 return self; 17307 } 17308 17309 if (self.begin.$$is_string && self.end.$$is_string) { 17310 $send(self.begin, 'upto', [self.end, self.excl], block.$to_proc()); 17311 return self; 17312 } 17313 current = self.begin; 17314 last = self.end; 17315 if (!$truthy(current['$respond_to?']("succ"))) { 17316 $Kernel.$raise($$$('TypeError'), "can't iterate from " + (current.$class())); 17317 } while ($truthy(($truthy(($ret_or_1 = self.end['$nil?']())) ? ($ret_or_1) : ($rb_lt(current['$<=>'](last), 0))))) { 17318 17319 Opal.yield1(block, current); 17320 current = current.$succ(); 17321 } if (($not(self.excl) && ($eqeq(current, last)))) { 17322 Opal.yield1(block, current); 17323 } return self; 17324 }); 17325 17326 $def(self, '$eql?', function $Range_eql$ques$4(other) { 17327 var self = this, $ret_or_1 = nil, $ret_or_2 = nil; 17328 17329 17330 if (!$eqeqeq($$$('Range'), other)) { 17331 return false 17332 } if ($truthy(($ret_or_1 = ($truthy(($ret_or_2 = self.excl['$==='](other['$exclude_end?']()))) ? (self.begin['$eql?'](other.$begin())) : ($ret_or_2))))) { 17333 return self.end['$eql?'](other.$end()) 17334 } else { 17335 return $ret_or_1 17336 } }); 17337 17338 $def(self, '$exclude_end?', $return_ivar("excl")); 17339 17340 $def(self, '$first', function $$first(n) { 17341 var $yield = $$first.$$p || nil, self = this; 17342 17343 $$first.$$p = null; 17344 if ($truthy(self.begin['$nil?']())) { 17345 $Kernel.$raise($$$('RangeError'), "cannot get the minimum of beginless range"); 17346 } if ($truthy(n == null)) { 17347 return self.begin 17348 } return $send2(self, $find_super(self, 'first', $$first, false, true), 'first', [n], $yield); 17349 }, -1); 17350 17351 $def(self, '$last', function $$last(n) { 17352 var self = this; 17353 if ($truthy(self.end['$nil?']())) { 17354 $Kernel.$raise($$$('RangeError'), "cannot get the maximum of endless range"); 17355 } if ($truthy(n == null)) { 17356 return self.end 17357 } return self.$to_a().$last(n); 17358 }, -1); 17359 17360 $def(self, '$max', function $$max() { 17361 var $yield = $$max.$$p || nil, self = this; 17362 17363 $$max.$$p = null; 17364 if ($truthy(self.end['$nil?']())) { 17365 return $Kernel.$raise($$$('RangeError'), "cannot get the maximum of endless range") 17366 } else if (($yield !== nil)) { 17367 return $send2(self, $find_super(self, 'max', $$max, false, true), 'max', [], $yield) 17368 } else if (($not(self.begin['$nil?']()) && (($truthy($rb_gt(self.begin, self.end)) || (($truthy(self.excl) && ($eqeq(self.begin, self.end)))))))) { 17369 return nil 17370 } else { 17371 return self.excl ? self.end - 1 : self.end 17372 } 17373 }); 17374 17375 $def(self, '$min', function $$min() { 17376 var $yield = $$min.$$p || nil, self = this; 17377 17378 $$min.$$p = null; 17379 if ($truthy(self.begin['$nil?']())) { 17380 return $Kernel.$raise($$$('RangeError'), "cannot get the minimum of beginless range") 17381 } else if (($yield !== nil)) { 17382 return $send2(self, $find_super(self, 'min', $$min, false, true), 'min', [], $yield) 17383 } else if (($not(self.end['$nil?']()) && (($truthy($rb_gt(self.begin, self.end)) || (($truthy(self.excl) && ($eqeq(self.begin, self.end)))))))) { 17384 return nil 17385 } else { 17386 return self.begin 17387 } 17388 }); 17389 17390 $def(self, '$size', function $$size() { 17391 var self = this, infinity = nil, range_begin = nil, range_end = nil; 17392 17393 17394 infinity = $$$($$$('Float'), 'INFINITY'); 17395 if ((($eqeq(self.begin, infinity) && ($not(self.end['$nil?']()))) || (($eqeq(self.end, infinity['$-@']()) && ($not(self.begin['$nil?']())))))) { 17396 return 0 17397 } if ($truthy(is_infinite(self))) { 17398 return infinity 17399 } if (!($eqeqeq($$$('Numeric'), self.begin) && ($eqeqeq($$$('Numeric'), self.end)))) { 17400 return nil 17401 } range_begin = self.begin; 17402 range_end = self.end; 17403 if ($truthy(self.excl)) { 17404 range_end = $rb_minus(range_end, 1); 17405 } if ($truthy($rb_lt(range_end, range_begin))) { 17406 return 0 17407 } return (Math.abs(range_end - range_begin) + 1).$to_i(); 17408 }); 17409 17410 $def(self, '$step', function $$step(n) { 17411 var $yield = $$step.$$p || nil, self = this, $ret_or_1 = nil, i = nil; 17412 17413 $$step.$$p = null; 17414 17415 function coerceStepSize() { 17416 if (n == null) { 17417 n = 1; 17418 } 17419 else if (!n.$$is_number) { 17420 n = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int"); 17421 } 17422 17423 if (n < 0) { 17424 $Kernel.$raise($$$('ArgumentError'), "step can't be negative"); 17425 } else if (n === 0) { 17426 $Kernel.$raise($$$('ArgumentError'), "step can't be 0"); 17427 } 17428 } 17429 17430 function enumeratorSize() { 17431 if (!self.begin['$respond_to?']("succ")) { 17432 return nil; 17433 } 17434 17435 if (self.begin.$$is_string && self.end.$$is_string) { 17436 return nil; 17437 } 17438 17439 if (n % 1 === 0) { 17440 return $rb_divide(self.$size(), n).$ceil(); 17441 } else { 17442 // n is a float 17443 var begin = self.begin, end = self.end, 17444 abs = Math.abs, floor = Math.floor, 17445 err = (abs(begin) + abs(end) + abs(end - begin)) / abs(n) * $$$($$$('Float'), 'EPSILON'), 17446 size; 17447 17448 if (err > 0.5) { 17449 err = 0.5; 17450 } 17451 17452 if (self.excl) { 17453 size = floor((end - begin) / n - err); 17454 if (size * n + begin < end) { 17455 size++; 17456 } 17457 } else { 17458 size = floor((end - begin) / n + err) + 1; 17459 } 17460 17461 return size; 17462 } 17463 } 17464 if (!($yield !== nil)) { 17465 if (((($truthy(self.begin['$is_a?']($$('Numeric'))) || ($truthy(self.begin['$nil?']()))) && (($truthy(self.end['$is_a?']($$('Numeric'))) || ($truthy(self.end['$nil?']()))))) && ($not(($truthy(($ret_or_1 = self.begin['$nil?']())) ? (self.end['$nil?']()) : ($ret_or_1)))))) { 17466 return $$$($$$('Enumerator'), 'ArithmeticSequence').$new(self, n, "step") 17467 } else { 17468 return $send(self, 'enum_for', ["step", n], function $$5(){ 17469 17470 coerceStepSize(); 17471 return enumeratorSize(); 17472 }) 17473 } 17474 } coerceStepSize(); 17475 if ($truthy(self.begin.$$is_number && self.end.$$is_number)) { 17476 17477 i = 0; 17478 (function(){try { var $t_break = $thrower('break'); return $send(self, 'loop', [], function $$6(){var self = $$6.$$s == null ? this : $$6.$$s, current = nil; 17479 if (self.begin == null) self.begin = nil; 17480 if (self.excl == null) self.excl = nil; 17481 if (self.end == null) self.end = nil; 17482 17483 17484 current = $rb_plus(self.begin, $rb_times(i, n)); 17485 if ($truthy(self.excl)) { 17486 if ($truthy($rb_ge(current, self.end))) { 17487 $t_break.$throw(); 17488 } 17489 } else if ($truthy($rb_gt(current, self.end))) { 17490 $t_break.$throw(); 17491 }; 17492 Opal.yield1($yield, current); 17493 return (i = $rb_plus(i, 1));}, {$$s: self})} catch($e) { 17494 if ($e === $t_break) return $e.$v; 17495 throw $e; 17496 }})(); 17497 } else { 17498 17499 17500 if (self.begin.$$is_string && self.end.$$is_string && n % 1 !== 0) { 17501 $Kernel.$raise($$$('TypeError'), "no implicit conversion to float from string"); 17502 } 17503 $send(self, 'each_with_index', [], function $$7(value, idx){ 17504 17505 if (value == null) value = nil; 17506 if (idx == null) idx = nil; 17507 if ($eqeq(idx['$%'](n), 0)) { 17508 return Opal.yield1($yield, value); 17509 } else { 17510 return nil 17511 }}); 17512 } return self; 17513 }, -1); 17514 17515 $def(self, '$%', function $Range_$percent$8(n) { 17516 var self = this; 17517 17518 if (($truthy(self.begin['$is_a?']($$('Numeric'))) && ($truthy(self.end['$is_a?']($$('Numeric')))))) { 17519 return $$$($$$('Enumerator'), 'ArithmeticSequence').$new(self, n, "%") 17520 } else { 17521 return self.$step(n) 17522 } 17523 }); 17524 17525 $def(self, '$bsearch', function $$bsearch() { 17526 var block = $$bsearch.$$p || nil, self = this; 17527 17528 $$bsearch.$$p = null; 17529 if (!(block !== nil)) { 17530 return self.$enum_for("bsearch") 17531 } if ($truthy(is_infinite(self) && (self.begin.$$is_number || self.end.$$is_number))) { 17532 $Kernel.$raise($$$('NotImplementedError'), "Can't #bsearch an infinite range"); 17533 } if (!$truthy(self.begin.$$is_number && self.end.$$is_number)) { 17534 $Kernel.$raise($$$('TypeError'), "can't do binary search for " + (self.begin.$class())); 17535 } return $send(self.$to_a(), 'bsearch', [], block.$to_proc()); 17536 }); 17537 17538 $def(self, '$to_s', function $$to_s() { 17539 var self = this, $ret_or_1 = nil; 17540 17541 return "" + (($truthy(($ret_or_1 = self.begin)) ? ($ret_or_1) : (""))) + (($truthy(self.excl) ? ("...") : (".."))) + (($truthy(($ret_or_1 = self.end)) ? ($ret_or_1) : (""))) 17542 }); 17543 17544 $def(self, '$inspect', function $$inspect() { 17545 var self = this, $ret_or_1 = nil; 17546 17547 return "" + (($truthy(($ret_or_1 = self.begin)) ? (self.begin.$inspect()) : ($ret_or_1))) + (($truthy(self.excl) ? ("...") : (".."))) + (($truthy(($ret_or_1 = self.end)) ? (self.end.$inspect()) : ($ret_or_1))) 17548 }); 17549 17550 $def(self, '$marshal_load', function $$marshal_load(args) { 17551 var self = this; 17552 17553 17554 self.begin = args['$[]']("begin"); 17555 self.end = args['$[]']("end"); 17556 return (self.excl = args['$[]']("excl")); 17557 }); 17558 17559 $def(self, '$hash', function $$hash() { 17560 var self = this; 17561 17562 return [self.begin, self.end, self.excl].$hash() 17563 }); 17564 $alias(self, "==", "eql?"); 17565 $alias(self, "include?", "cover?"); 17566 return $alias(self, "member?", "cover?"); 17567 })('::', null, $nesting); 17568}; 17569 17570Opal.modules["corelib/proc"] = function(Opal) {/* Generated by Opal 1.7.3 */ 17571 var $slice = Opal.slice, $klass = Opal.klass, $truthy = Opal.truthy, $Kernel = Opal.Kernel, $defs = Opal.defs, $def = Opal.def, $send = Opal.send, $to_a = Opal.to_a, $return_self = Opal.return_self, $ensure_kwargs = Opal.ensure_kwargs, $Opal = Opal.Opal, $alias = Opal.alias, nil = Opal.nil, $$$ = Opal.$$$; 17572 17573 Opal.add_stubs('raise,proc,call,to_proc,new,source_location,coerce_to!,dup'); 17574 return (function($base, $super) { 17575 var self = $klass($base, $super, 'Proc'); 17576 17577 17578 17579 Opal.prop(self.$$prototype, '$$is_proc', true); 17580 Opal.prop(self.$$prototype, '$$is_lambda', false); 17581 $defs(self, '$new', function $Proc_new$1() { 17582 var block = $Proc_new$1.$$p || nil; 17583 17584 $Proc_new$1.$$p = null; 17585 if (!$truthy(block)) { 17586 $Kernel.$raise($$$('ArgumentError'), "tried to create a Proc object without a block"); 17587 } return block; 17588 }); 17589 17590 $def(self, '$call', function $$call($a) { 17591 var block = $$call.$$p || nil, $post_args, args, self = this; 17592 17593 $$call.$$p = null; 17594 $post_args = $slice(arguments); 17595 args = $post_args; 17596 17597 if (block !== nil) { 17598 self.$$p = block; 17599 } 17600 17601 var result, $brk = self.$$brk, $ret = self.$$ret; 17602 17603 if ($brk || ($ret && self.$$is_lambda)) { 17604 try { 17605 if (self.$$is_lambda) { 17606 result = self.apply(null, args); 17607 } 17608 else { 17609 result = Opal.yieldX(self, args); 17610 } 17611 } catch (err) { 17612 if (err === $brk) { 17613 return err.$v; 17614 } 17615 else if (self.$$is_lambda && err === $ret) { 17616 return err.$v; 17617 } 17618 else { 17619 throw err; 17620 } 17621 } 17622 } 17623 else { 17624 if (self.$$is_lambda) { 17625 result = self.apply(null, args); 17626 } 17627 else { 17628 result = Opal.yieldX(self, args); 17629 } 17630 } 17631 17632 return result; 17633 }, -1); 17634 17635 $def(self, '$>>', function $Proc_$gt$gt$2(other) { 17636 var self = this; 17637 17638 $Proc_$gt$gt$2.$$p = null; 17639 return $send($Kernel, 'proc', [], function $$3($a){var block = $$3.$$p || nil, $post_args, args, self = $$3.$$s == null ? this : $$3.$$s, out = nil; 17640 17641 $$3.$$p = null; 17642 $post_args = $slice(arguments); 17643 args = $post_args; 17644 out = $send(self, 'call', $to_a(args), block.$to_proc()); 17645 return other.$call(out);}, {$$arity: -1, $$s: self}) 17646 }); 17647 17648 $def(self, '$<<', function $Proc_$lt$lt$4(other) { 17649 var self = this; 17650 17651 $Proc_$lt$lt$4.$$p = null; 17652 return $send($Kernel, 'proc', [], function $$5($a){var block = $$5.$$p || nil, $post_args, args, self = $$5.$$s == null ? this : $$5.$$s, out = nil; 17653 17654 $$5.$$p = null; 17655 $post_args = $slice(arguments); 17656 args = $post_args; 17657 out = $send(other, 'call', $to_a(args), block.$to_proc()); 17658 return self.$call(out);}, {$$arity: -1, $$s: self}) 17659 }); 17660 17661 $def(self, '$to_proc', $return_self); 17662 17663 $def(self, '$lambda?', function $Proc_lambda$ques$6() { 17664 var self = this; 17665 17666 return !!self.$$is_lambda; 17667 }); 17668 17669 $def(self, '$arity', function $$arity() { 17670 var self = this; 17671 17672 17673 if (self.$$is_curried) { 17674 return -1; 17675 } else if (self.$$arity != null) { 17676 return self.$$arity; 17677 } else { 17678 return self.length; 17679 } 17680 17681 }); 17682 17683 $def(self, '$source_location', function $$source_location() { 17684 var self = this, $ret_or_1 = nil; 17685 17686 17687 if (self.$$is_curried) { return nil; } if ($truthy(($ret_or_1 = self.$$source_location))) { 17688 return $ret_or_1 17689 } else { 17690 return nil 17691 } }); 17692 17693 $def(self, '$binding', function $$binding() { 17694 var self = this; 17695 17696 17697 if (self.$$is_curried) { $Kernel.$raise($$$('ArgumentError'), "Can't create Binding"); } if ($truthy((($$$('::', 'Binding', 'skip_raise')) ? 'constant' : nil))) { 17698 return $$$('Binding').$new(nil, [], self.$$s, self.$source_location()) 17699 } else { 17700 return nil 17701 } }); 17702 17703 $def(self, '$parameters', function $$parameters($kwargs) { 17704 var lambda, self = this; 17705 17706 17707 $kwargs = $ensure_kwargs($kwargs); 17708 17709 lambda = $kwargs.$$smap["lambda"]; 17710 if (self.$$is_curried) { 17711 return [["rest"]]; 17712 } else if (self.$$parameters) { 17713 if (lambda == null ? self.$$is_lambda : lambda) { 17714 return self.$$parameters; 17715 } else { 17716 var result = [], i, length; 17717 17718 for (i = 0, length = self.$$parameters.length; i < length; i++) { 17719 var parameter = self.$$parameters[i]; 17720 17721 if (parameter[0] === 'req') { 17722 // required arguments always have name 17723 parameter = ['opt', parameter[1]]; 17724 } 17725 17726 result.push(parameter); 17727 } 17728 17729 return result; 17730 } 17731 } else { 17732 return []; 17733 } 17734 }, -1); 17735 17736 $def(self, '$curry', function $$curry(arity) { 17737 var self = this; 17738 17739 if (arity === undefined) { 17740 arity = self.length; 17741 } 17742 else { 17743 arity = $Opal['$coerce_to!'](arity, $$$('Integer'), "to_int"); 17744 if (self.$$is_lambda && arity !== self.length) { 17745 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (arity) + " for " + (self.length) + ")"); 17746 } 17747 } 17748 17749 function curried () { 17750 var args = $slice(arguments), 17751 length = args.length, 17752 result; 17753 17754 if (length > arity && self.$$is_lambda && !self.$$is_curried) { 17755 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (length) + " for " + (arity) + ")"); 17756 } 17757 17758 if (length >= arity) { 17759 return self.$call.apply(self, args); 17760 } 17761 17762 result = function () { 17763 return curried.apply(null, 17764 args.concat($slice(arguments))); 17765 }; 17766 result.$$is_lambda = self.$$is_lambda; 17767 result.$$is_curried = true; 17768 17769 return result; 17770 } 17771 curried.$$is_lambda = self.$$is_lambda; 17772 curried.$$is_curried = true; 17773 return curried; 17774 }, -1); 17775 17776 $def(self, '$dup', function $$dup() { 17777 var self = this; 17778 17779 17780 var original_proc = self.$$original_proc || self, 17781 proc = function () { 17782 return original_proc.apply(this, arguments); 17783 }; 17784 17785 for (var prop in self) { 17786 if (self.hasOwnProperty(prop)) { 17787 proc[prop] = self[prop]; 17788 } 17789 } 17790 17791 return proc; 17792 17793 }); 17794 $alias(self, "===", "call"); 17795 $alias(self, "clone", "dup"); 17796 $alias(self, "yield", "call"); 17797 return $alias(self, "[]", "call"); 17798 })('::', Function) 17799}; 17800 17801Opal.modules["corelib/method"] = function(Opal) {/* Generated by Opal 1.7.3 */ 17802 var $klass = Opal.klass, $def = Opal.def, $truthy = Opal.truthy, $slice = Opal.slice, $alias = Opal.alias, $Kernel = Opal.Kernel, $send = Opal.send, $to_a = Opal.to_a, nil = Opal.nil, $$$ = Opal.$$$; 17803 17804 Opal.add_stubs('attr_reader,arity,curry,>>,<<,new,class,join,source_location,call,raise,bind,to_proc'); 17805 17806 (function($base, $super) { 17807 var self = $klass($base, $super, 'Method'); 17808 17809 var $proto = self.$$prototype; 17810 17811 $proto.method = $proto.receiver = $proto.owner = $proto.name = nil; 17812 17813 self.$attr_reader("owner", "receiver", "name"); 17814 17815 $def(self, '$initialize', function $$initialize(receiver, owner, method, name) { 17816 var self = this; 17817 17818 17819 self.receiver = receiver; 17820 self.owner = owner; 17821 self.name = name; 17822 return (self.method = method); 17823 }); 17824 17825 $def(self, '$arity', function $$arity() { 17826 var self = this; 17827 17828 return self.method.$arity() 17829 }); 17830 17831 $def(self, '$parameters', function $$parameters() { 17832 var self = this; 17833 17834 return self.method.$$parameters 17835 }); 17836 17837 $def(self, '$source_location', function $$source_location() { 17838 var self = this, $ret_or_1 = nil; 17839 17840 if ($truthy(($ret_or_1 = self.method.$$source_location))) { 17841 return $ret_or_1 17842 } else { 17843 return ["(eval)", 0] 17844 } 17845 }); 17846 17847 $def(self, '$comments', function $$comments() { 17848 var self = this, $ret_or_1 = nil; 17849 17850 if ($truthy(($ret_or_1 = self.method.$$comments))) { 17851 return $ret_or_1 17852 } else { 17853 return [] 17854 } 17855 }); 17856 17857 $def(self, '$call', function $$call($a) { 17858 var block = $$call.$$p || nil, $post_args, args, self = this; 17859 17860 $$call.$$p = null; 17861 $post_args = $slice(arguments); 17862 args = $post_args; 17863 17864 self.method.$$p = block; 17865 17866 return self.method.apply(self.receiver, args); 17867 }, -1); 17868 17869 $def(self, '$curry', function $$curry(arity) { 17870 var self = this; 17871 return self.method.$curry(arity); 17872 }, -1); 17873 17874 $def(self, '$>>', function $Method_$gt$gt$1(other) { 17875 var self = this; 17876 17877 return self.method['$>>'](other) 17878 }); 17879 17880 $def(self, '$<<', function $Method_$lt$lt$2(other) { 17881 var self = this; 17882 17883 return self.method['$<<'](other) 17884 }); 17885 17886 $def(self, '$unbind', function $$unbind() { 17887 var self = this; 17888 17889 return $$$('UnboundMethod').$new(self.receiver.$class(), self.owner, self.method, self.name) 17890 }); 17891 17892 $def(self, '$to_proc', function $$to_proc() { 17893 var self = this; 17894 17895 17896 var proc = self.$call.bind(self); 17897 proc.$$unbound = self.method; 17898 proc.$$is_lambda = true; 17899 proc.$$arity = self.method.$$arity == null ? self.method.length : self.method.$$arity; 17900 proc.$$parameters = self.method.$$parameters; 17901 return proc; 17902 17903 }); 17904 17905 $def(self, '$inspect', function $$inspect() { 17906 var self = this; 17907 17908 return "#<" + (self.$class()) + ": " + (self.receiver.$class()) + "#" + (self.name) + " (defined in " + (self.owner) + " in " + (self.$source_location().$join(":")) + ")>" 17909 }); 17910 $alias(self, "[]", "call"); 17911 return $alias(self, "===", "call"); 17912 })('::', null); 17913 return (function($base, $super) { 17914 var self = $klass($base, $super, 'UnboundMethod'); 17915 17916 var $proto = self.$$prototype; 17917 17918 $proto.method = $proto.owner = $proto.name = $proto.source = nil; 17919 17920 self.$attr_reader("source", "owner", "name"); 17921 17922 $def(self, '$initialize', function $$initialize(source, owner, method, name) { 17923 var self = this; 17924 17925 17926 self.source = source; 17927 self.owner = owner; 17928 self.method = method; 17929 return (self.name = name); 17930 }); 17931 17932 $def(self, '$arity', function $$arity() { 17933 var self = this; 17934 17935 return self.method.$arity() 17936 }); 17937 17938 $def(self, '$parameters', function $$parameters() { 17939 var self = this; 17940 17941 return self.method.$$parameters 17942 }); 17943 17944 $def(self, '$source_location', function $$source_location() { 17945 var self = this, $ret_or_1 = nil; 17946 17947 if ($truthy(($ret_or_1 = self.method.$$source_location))) { 17948 return $ret_or_1 17949 } else { 17950 return ["(eval)", 0] 17951 } 17952 }); 17953 17954 $def(self, '$comments', function $$comments() { 17955 var self = this, $ret_or_1 = nil; 17956 17957 if ($truthy(($ret_or_1 = self.method.$$comments))) { 17958 return $ret_or_1 17959 } else { 17960 return [] 17961 } 17962 }); 17963 17964 $def(self, '$bind', function $$bind(object) { 17965 var self = this; 17966 17967 17968 if (self.owner.$$is_module || Opal.is_a(object, self.owner)) { 17969 return $$$('Method').$new(object, self.owner, self.method, self.name); 17970 } 17971 else { 17972 $Kernel.$raise($$$('TypeError'), "can't bind singleton method to a different class (expected " + (object) + ".kind_of?(" + (self.owner) + " to be true)"); 17973 } 17974 17975 }); 17976 17977 $def(self, '$bind_call', function $$bind_call(object, $a) { 17978 var block = $$bind_call.$$p || nil, $post_args, args, self = this; 17979 17980 $$bind_call.$$p = null; 17981 $post_args = $slice(arguments, 1); 17982 args = $post_args; 17983 return $send(self.$bind(object), 'call', $to_a(args), block.$to_proc()); 17984 }, -2); 17985 return $def(self, '$inspect', function $$inspect() { 17986 var self = this; 17987 17988 return "#<" + (self.$class()) + ": " + (self.source) + "#" + (self.name) + " (defined in " + (self.owner) + " in " + (self.$source_location().$join(":")) + ")>" 17989 }); 17990 })('::', null); 17991}; 17992 17993Opal.modules["corelib/variables"] = function(Opal) {/* Generated by Opal 1.7.3 */ 17994 var $gvars = Opal.gvars, $const_set = Opal.const_set, $Object = Opal.Object, $hash2 = Opal.hash2, nil = Opal.nil; 17995 17996 Opal.add_stubs('new'); 17997 17998 $gvars['&'] = $gvars['~'] = $gvars['`'] = $gvars["'"] = nil; 17999 $gvars.LOADED_FEATURES = ($gvars["\""] = Opal.loaded_features); 18000 $gvars.LOAD_PATH = ($gvars[":"] = []); 18001 $gvars["/"] = "\n"; 18002 $gvars[","] = nil; 18003 $const_set('::', 'ARGV', []); 18004 $const_set('::', 'ARGF', $Object.$new()); 18005 $const_set('::', 'ENV', $hash2([], {})); 18006 $gvars.VERBOSE = false; 18007 $gvars.DEBUG = false; 18008 return ($gvars.SAFE = 0); 18009}; 18010 18011Opal.modules["corelib/io"] = function(Opal) {/* Generated by Opal 1.7.3 */ 18012 var $klass = Opal.klass, $const_set = Opal.const_set, $not = Opal.not, $truthy = Opal.truthy, $def = Opal.def, $return_ivar = Opal.return_ivar, $return_val = Opal.return_val, $slice = Opal.slice, $Kernel = Opal.Kernel, $gvars = Opal.gvars, $send = Opal.send, $to_a = Opal.to_a, $rb_plus = Opal.rb_plus, $neqeq = Opal.neqeq, $range = Opal.range, $hash2 = Opal.hash2, $eqeq = Opal.eqeq, $to_ary = Opal.to_ary, $rb_gt = Opal.rb_gt, $assign_ivar_val = Opal.assign_ivar_val, $alias = Opal.alias, $a, nil = Opal.nil, $$$ = Opal.$$$; 18013 18014 Opal.add_stubs('attr_reader,attr_accessor,!,match?,include?,size,write,String,flatten,puts,sysread_noraise,+,!=,[],ord,getc,readchar,raise,gets,==,to_str,length,split,sub,sysread,>,to_a,each_line,enum_for,getbyte,closed_write?,closed_read?,each,eof,new,write_proc=,read_proc='); 18015 18016 (function($base, $super) { 18017 var self = $klass($base, $super, 'IO'); 18018 18019 var $proto = self.$$prototype; 18020 18021 $proto.read_buffer = $proto.closed = nil; 18022 18023 $const_set(self, 'SEEK_SET', 0); 18024 $const_set(self, 'SEEK_CUR', 1); 18025 $const_set(self, 'SEEK_END', 2); 18026 $const_set(self, 'SEEK_DATA', 3); 18027 $const_set(self, 'SEEK_HOLE', 4); 18028 $const_set(self, 'READABLE', 1); 18029 $const_set(self, 'WRITABLE', 4); 18030 self.$attr_reader("eof"); 18031 self.$attr_accessor("read_proc", "sync", "tty", "write_proc"); 18032 18033 $def(self, '$initialize', function $$initialize(fd, flags) { 18034 var self = this; 18035 18036 18037 if (flags == null) flags = "r"; 18038 self.fd = fd; 18039 self.flags = flags; 18040 self.eof = false; 18041 if (($truthy(flags['$include?']("r")) && ($not(flags['$match?'](/[wa+]/))))) { 18042 return (self.closed = "write") 18043 } else if (($truthy(flags['$match?'](/[wa]/)) && ($not(flags['$match?'](/[r+]/))))) { 18044 return (self.closed = "read") 18045 } else { 18046 return nil 18047 } }, -2); 18048 18049 $def(self, '$fileno', $return_ivar("fd")); 18050 18051 $def(self, '$tty?', function $IO_tty$ques$1() { 18052 var self = this; 18053 18054 return self.tty == true; 18055 }); 18056 18057 $def(self, '$write', function $$write(string) { 18058 var self = this; 18059 18060 18061 self.write_proc(string); 18062 return string.$size(); 18063 }); 18064 18065 $def(self, '$flush', $return_val(nil)); 18066 18067 $def(self, '$<<', function $IO_$lt$lt$2(string) { 18068 var self = this; 18069 18070 18071 self.$write(string); 18072 return self; 18073 }); 18074 18075 $def(self, '$print', function $$print($a) { 18076 var $post_args, args, self = this; 18077 if ($gvars[","] == null) $gvars[","] = nil; 18078 18079 18080 $post_args = $slice(arguments); 18081 args = $post_args; 18082 18083 for (var i = 0, ii = args.length; i < ii; i++) { 18084 args[i] = $Kernel.$String(args[i]); 18085 } 18086 self.$write(args.join($gvars[","])); 18087 return nil; 18088 }, -1); 18089 18090 $def(self, '$puts', function $$puts($a) { 18091 var $post_args, args, self = this; 18092 18093 18094 $post_args = $slice(arguments); 18095 args = $post_args; 18096 18097 var line; 18098 if (args.length === 0) { 18099 self.$write("\n"); 18100 return nil; 18101 } else { 18102 for (var i = 0, ii = args.length; i < ii; i++) { 18103 if (args[i].$$is_array){ 18104 var ary = (args[i]).$flatten(); 18105 if (ary.length > 0) $send(self, 'puts', $to_a((ary))); 18106 } else { 18107 if (args[i].$$is_string) { 18108 line = args[i].valueOf(); 18109 } else { 18110 line = $Kernel.$String(args[i]); 18111 } 18112 if (!line.endsWith("\n")) line += "\n"; 18113 self.$write(line); 18114 } 18115 } 18116 } 18117 return nil; 18118 }, -1); 18119 18120 $def(self, '$getc', function $$getc() { 18121 var self = this, $ret_or_1 = nil, parts = nil, ret = nil; 18122 18123 18124 self.read_buffer = ($truthy(($ret_or_1 = self.read_buffer)) ? ($ret_or_1) : ("")); 18125 parts = ""; 18126 do { 18127 18128 self.read_buffer = $rb_plus(self.read_buffer, parts); 18129 if ($neqeq(self.read_buffer, "")) { 18130 18131 ret = self.read_buffer['$[]'](0); 18132 self.read_buffer = self.read_buffer['$[]']($range(1, -1, false)); 18133 return ret; 18134 } } while ($truthy((parts = self.$sysread_noraise(1)))); return nil; 18135 }); 18136 18137 $def(self, '$getbyte', function $$getbyte() { 18138 var $a, self = this; 18139 18140 return ($a = self.$getc(), ($a === nil || $a == null) ? nil : $a.$ord()) 18141 }); 18142 18143 $def(self, '$readbyte', function $$readbyte() { 18144 var self = this; 18145 18146 return self.$readchar().$ord() 18147 }); 18148 18149 $def(self, '$readchar', function $$readchar() { 18150 var self = this, $ret_or_1 = nil; 18151 18152 if ($truthy(($ret_or_1 = self.$getc()))) { 18153 return $ret_or_1 18154 } else { 18155 return $Kernel.$raise($$$('EOFError'), "end of file reached") 18156 } 18157 }); 18158 18159 $def(self, '$readline', function $$readline($a) { 18160 var $post_args, args, self = this, $ret_or_1 = nil; 18161 18162 18163 $post_args = $slice(arguments); 18164 args = $post_args; 18165 if ($truthy(($ret_or_1 = $send(self, 'gets', $to_a(args))))) { 18166 return $ret_or_1 18167 } else { 18168 return $Kernel.$raise($$$('EOFError'), "end of file reached") 18169 } }, -1); 18170 18171 $def(self, '$gets', function $$gets(sep, limit, opts) { 18172 var $a, $b, self = this, orig_sep = nil, $ret_or_1 = nil, seplen = nil, data = nil, ret = nil, orig_buffer = nil; 18173 if ($gvars["/"] == null) $gvars["/"] = nil; 18174 18175 18176 if (sep == null) sep = false; 18177 if (limit == null) limit = nil; 18178 if (opts == null) opts = $hash2([], {}); 18179 if (($truthy(sep.$$is_number) && ($not(limit)))) { 18180 $a = [false, sep, limit], (sep = $a[0]), (limit = $a[1]), (opts = $a[2]); 18181 } if ((($truthy(sep.$$is_hash) && ($not(limit))) && ($eqeq(opts, $hash2([], {}))))) { 18182 $a = [false, nil, sep], (sep = $a[0]), (limit = $a[1]), (opts = $a[2]); 18183 } else if (($truthy(limit.$$is_hash) && ($eqeq(opts, $hash2([], {}))))) { 18184 $a = [sep, nil, limit], (sep = $a[0]), (limit = $a[1]), (opts = $a[2]); 18185 } orig_sep = sep; 18186 if ($eqeq(sep, false)) { 18187 sep = $gvars["/"]; 18188 } if ($eqeq(sep, "")) { 18189 sep = /\r?\n\r?\n/; 18190 } sep = ($truthy(($ret_or_1 = sep)) ? ($ret_or_1) : ("")); 18191 if (!$eqeq(orig_sep, "")) { 18192 sep = sep.$to_str(); 18193 } seplen = ($eqeq(orig_sep, "") ? (2) : (sep.$length())); 18194 if ($eqeq(sep, " ")) { 18195 sep = / /; 18196 } self.read_buffer = ($truthy(($ret_or_1 = self.read_buffer)) ? ($ret_or_1) : ("")); 18197 data = ""; 18198 ret = nil; 18199 do { 18200 18201 self.read_buffer = $rb_plus(self.read_buffer, data); 18202 if (($neqeq(sep, "") && ($truthy(($truthy(sep.$$is_regexp) ? (self.read_buffer['$match?'](sep)) : (self.read_buffer['$include?'](sep))))))) { 18203 18204 orig_buffer = self.read_buffer; 18205 $b = self.read_buffer.$split(sep, 2), $a = $to_ary($b), (ret = ($a[0] == null ? nil : $a[0])), (self.read_buffer = ($a[1] == null ? nil : $a[1])); 18206 if ($neqeq(ret, orig_buffer)) { 18207 ret = $rb_plus(ret, orig_buffer['$[]'](ret.$length(), seplen)); 18208 } break; 18209 } } while ($truthy((data = self.$sysread_noraise(($eqeq(sep, "") ? (65536) : (1)))))); if (!$truthy(ret)) { 18210 18211 $a = [($truthy(($ret_or_1 = self.read_buffer)) ? ($ret_or_1) : ("")), ""], (ret = $a[0]), (self.read_buffer = $a[1]); 18212 if ($eqeq(ret, "")) { 18213 ret = nil; 18214 } } if ($truthy(ret)) { 18215 18216 if ($truthy(limit)) { 18217 18218 ret = ret['$[]'](Opal.Range.$new(0,limit, true)); 18219 self.read_buffer = $rb_plus(ret['$[]'](Opal.Range.$new(limit, -1, false)), self.read_buffer); 18220 } if ($truthy(opts['$[]']("chomp"))) { 18221 ret = ret.$sub(/\r?\n$/, ""); 18222 } if ($eqeq(orig_sep, "")) { 18223 ret = ret.$sub(/^[\r\n]+/, ""); 18224 } } if ($eqeq(orig_sep, false)) { 18225 $gvars._ = ret; 18226 } return ret; 18227 }, -1); 18228 18229 $def(self, '$sysread', function $$sysread(integer) { 18230 var self = this, $ret_or_1 = nil; 18231 18232 if ($truthy(($ret_or_1 = self.read_proc(integer)))) { 18233 return $ret_or_1 18234 } else { 18235 18236 self.eof = true; 18237 return $Kernel.$raise($$$('EOFError'), "end of file reached"); 18238 } 18239 }); 18240 18241 $def(self, '$sysread_noraise', function $$sysread_noraise(integer) { 18242 var self = this; 18243 18244 try { 18245 return self.$sysread(integer) 18246 } catch ($err) { 18247 if (Opal.rescue($err, [$$$('EOFError')])) { 18248 try { 18249 return nil 18250 } finally { Opal.pop_exception(); } 18251 } else { throw $err; } 18252 } 18253 }); 18254 18255 $def(self, '$readpartial', function $$readpartial(integer) { 18256 var $a, self = this, $ret_or_1 = nil, part = nil, ret = nil; 18257 18258 18259 self.read_buffer = ($truthy(($ret_or_1 = self.read_buffer)) ? ($ret_or_1) : ("")); 18260 part = self.$sysread(integer); 18261 $a = [$rb_plus(self.read_buffer, ($truthy(($ret_or_1 = part)) ? ($ret_or_1) : (""))), ""], (ret = $a[0]), (self.read_buffer = $a[1]); 18262 if ($eqeq(ret, "")) { 18263 ret = nil; 18264 } return ret; 18265 }); 18266 18267 $def(self, '$read', function $$read(integer) { 18268 var $a, self = this, $ret_or_1 = nil, parts = nil, ret = nil; 18269 18270 18271 if (integer == null) integer = nil; 18272 self.read_buffer = ($truthy(($ret_or_1 = self.read_buffer)) ? ($ret_or_1) : ("")); 18273 parts = ""; 18274 ret = nil; 18275 do { 18276 18277 self.read_buffer = $rb_plus(self.read_buffer, parts); 18278 if (($truthy(integer) && ($truthy($rb_gt(self.read_buffer.$length(), integer))))) { 18279 18280 $a = [self.read_buffer['$[]'](Opal.Range.$new(0,integer, true)), self.read_buffer['$[]'](Opal.Range.$new(integer, -1, false))], (ret = $a[0]), (self.read_buffer = $a[1]); 18281 return ret; 18282 } } while ($truthy((parts = self.$sysread_noraise(($truthy(($ret_or_1 = integer)) ? ($ret_or_1) : (65536)))))); $a = [self.read_buffer, ""], (ret = $a[0]), (self.read_buffer = $a[1]); 18283 return ret; 18284 }, -1); 18285 18286 $def(self, '$readlines', function $$readlines(separator) { 18287 var self = this; 18288 if ($gvars["/"] == null) $gvars["/"] = nil; 18289 18290 18291 if (separator == null) separator = $gvars["/"]; 18292 return self.$each_line(separator).$to_a(); 18293 }, -1); 18294 18295 $def(self, '$each', function $$each($a, $b) { 18296 var block = $$each.$$p || nil, $post_args, sep, args, self = this, s = nil; 18297 if ($gvars["/"] == null) $gvars["/"] = nil; 18298 18299 $$each.$$p = null; 18300 $post_args = $slice(arguments); 18301 18302 if ($post_args.length > 0) sep = $post_args.shift();if (sep == null) sep = $gvars["/"]; 18303 args = $post_args; 18304 if (!(block !== nil)) { 18305 return $send(self, 'enum_for', ["each", sep].concat($to_a(args))) 18306 } while ($truthy((s = $send(self, 'gets', [sep].concat($to_a(args)))))) { 18307 Opal.yield1(block, s); 18308 } return self; 18309 }, -1); 18310 18311 $def(self, '$each_byte', function $$each_byte() { 18312 var block = $$each_byte.$$p || nil, self = this, s = nil; 18313 18314 $$each_byte.$$p = null; 18315 if (!(block !== nil)) { 18316 return self.$enum_for("each_byte") 18317 } while ($truthy((s = self.$getbyte()))) { 18318 Opal.yield1(block, s); 18319 } return self; 18320 }); 18321 18322 $def(self, '$each_char', function $$each_char() { 18323 var block = $$each_char.$$p || nil, self = this, s = nil; 18324 18325 $$each_char.$$p = null; 18326 if (!(block !== nil)) { 18327 return self.$enum_for("each_char") 18328 } while ($truthy((s = self.$getc()))) { 18329 Opal.yield1(block, s); 18330 } return self; 18331 }); 18332 18333 $def(self, '$close', $assign_ivar_val("closed", "both")); 18334 18335 $def(self, '$close_read', function $$close_read() { 18336 var self = this; 18337 18338 if ($eqeq(self.closed, "write")) { 18339 return (self.closed = "both") 18340 } else { 18341 return (self.closed = "read") 18342 } 18343 }); 18344 18345 $def(self, '$close_write', function $$close_write() { 18346 var self = this; 18347 18348 if ($eqeq(self.closed, "read")) { 18349 return (self.closed = "both") 18350 } else { 18351 return (self.closed = "write") 18352 } 18353 }); 18354 18355 $def(self, '$closed?', function $IO_closed$ques$3() { 18356 var self = this; 18357 18358 return self.closed['$==']("both") 18359 }); 18360 18361 $def(self, '$closed_read?', function $IO_closed_read$ques$4() { 18362 var self = this, $ret_or_1 = nil; 18363 18364 if ($truthy(($ret_or_1 = self.closed['$==']("read")))) { 18365 return $ret_or_1 18366 } else { 18367 return self.closed['$==']("both") 18368 } 18369 }); 18370 18371 $def(self, '$closed_write?', function $IO_closed_write$ques$5() { 18372 var self = this, $ret_or_1 = nil; 18373 18374 if ($truthy(($ret_or_1 = self.closed['$==']("write")))) { 18375 return $ret_or_1 18376 } else { 18377 return self.closed['$==']("both") 18378 } 18379 }); 18380 18381 $def(self, '$check_writable', function $$check_writable() { 18382 var self = this; 18383 18384 if ($truthy(self['$closed_write?']())) { 18385 return $Kernel.$raise($$$('IOError'), "not opened for writing") 18386 } else { 18387 return nil 18388 } 18389 }); 18390 18391 $def(self, '$check_readable', function $$check_readable() { 18392 var self = this; 18393 18394 if ($truthy(self['$closed_read?']())) { 18395 return $Kernel.$raise($$$('IOError'), "not opened for reading") 18396 } else { 18397 return nil 18398 } 18399 }); 18400 $alias(self, "each_line", "each"); 18401 return $alias(self, "eof?", "eof"); 18402 })('::', null); 18403 $const_set('::', 'STDIN', ($gvars.stdin = $$$('IO').$new(0, "r"))); 18404 $const_set('::', 'STDOUT', ($gvars.stdout = $$$('IO').$new(1, "w"))); 18405 $const_set('::', 'STDERR', ($gvars.stderr = $$$('IO').$new(2, "w"))); 18406 var console = Opal.global.console; 18407 $$$('STDOUT')['$write_proc='](typeof(process) === 'object' && typeof(process.stdout) === 'object' ? function(s){process.stdout.write(s);} : function(s){console.log(s);}); 18408 $$$('STDERR')['$write_proc='](typeof(process) === 'object' && typeof(process.stderr) === 'object' ? function(s){process.stderr.write(s);} : function(s){console.warn(s);}); 18409 return ($a = [function(s) { var p = prompt(); if (p !== null) return p + "\n"; return nil; }], $send($$$('STDIN'), 'read_proc=', $a), $a[$a.length - 1]); 18410}; 18411 18412Opal.modules["opal/regexp_anchors"] = function(Opal) {/* Generated by Opal 1.7.3 */ 18413 var $module = Opal.module, $const_set = Opal.const_set, $nesting = []; Opal.nil; var $$$ = Opal.$$$; 18414 18415 Opal.add_stubs('new'); 18416 return (function($base, $parent_nesting) { 18417 var self = $module($base, 'Opal'); 18418 18419 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 18420 18421 18422 $const_set(self, 'REGEXP_START', "^"); 18423 $const_set(self, 'REGEXP_END', "$"); 18424 $const_set(self, 'FORBIDDEN_STARTING_IDENTIFIER_CHARS', "\\u0001-\\u002F\\u003A-\\u0040\\u005B-\\u005E\\u0060\\u007B-\\u007F"); 18425 $const_set(self, 'FORBIDDEN_ENDING_IDENTIFIER_CHARS', "\\u0001-\\u0020\\u0022-\\u002F\\u003A-\\u003E\\u0040\\u005B-\\u005E\\u0060\\u007B-\\u007F"); 18426 $const_set(self, 'INLINE_IDENTIFIER_REGEXP', $$('Regexp').$new("[^" + ($$$(self, 'FORBIDDEN_STARTING_IDENTIFIER_CHARS')) + "]*[^" + ($$$(self, 'FORBIDDEN_ENDING_IDENTIFIER_CHARS')) + "]")); 18427 $const_set(self, 'FORBIDDEN_CONST_NAME_CHARS', "\\u0001-\\u0020\\u0021-\\u002F\\u003B-\\u003F\\u0040\\u005B-\\u005E\\u0060\\u007B-\\u007F"); 18428 return $const_set(self, 'CONST_NAME_REGEXP', $$('Regexp').$new("" + ($$$(self, 'REGEXP_START')) + "(::)?[A-Z][^" + ($$$(self, 'FORBIDDEN_CONST_NAME_CHARS')) + "]*" + ($$$(self, 'REGEXP_END')))); 18429 })($nesting[0], $nesting) 18430}; 18431 18432Opal.modules["opal/mini"] = function(Opal) {/* Generated by Opal 1.7.3 */ 18433 var $Object = Opal.Object; Opal.nil; 18434 18435 Opal.add_stubs('require'); 18436 18437 $Object.$require("opal/base"); 18438 $Object.$require("corelib/nil"); 18439 $Object.$require("corelib/boolean"); 18440 $Object.$require("corelib/string"); 18441 $Object.$require("corelib/comparable"); 18442 $Object.$require("corelib/enumerable"); 18443 $Object.$require("corelib/enumerator"); 18444 $Object.$require("corelib/array"); 18445 $Object.$require("corelib/hash"); 18446 $Object.$require("corelib/number"); 18447 $Object.$require("corelib/range"); 18448 $Object.$require("corelib/proc"); 18449 $Object.$require("corelib/method"); 18450 $Object.$require("corelib/regexp"); 18451 $Object.$require("corelib/variables"); 18452 $Object.$require("corelib/io"); 18453 return $Object.$require("opal/regexp_anchors"); 18454}; 18455 18456Opal.modules["corelib/kernel/format"] = function(Opal) {/* Generated by Opal 1.7.3 */ 18457 var $coerce_to = Opal.coerce_to, $module = Opal.module, $slice = Opal.slice, $truthy = Opal.truthy, $eqeq = Opal.eqeq, $Opal = Opal.Opal, $Kernel = Opal.Kernel, $gvars = Opal.gvars, $def = Opal.def, $alias = Opal.alias, nil = Opal.nil, $$$ = Opal.$$$; 18458 18459 Opal.add_stubs('respond_to?,[],==,length,coerce_to?,nil?,to_a,raise,to_int,fetch,Integer,Float,to_ary,to_str,inspect,to_s,format'); 18460 return (function($base) { 18461 var self = $module($base, 'Kernel'); 18462 18463 18464 18465 18466 $def(self, '$format', function $$format(format_string, $a) { 18467 var $post_args, args, ary = nil; 18468 if ($gvars.DEBUG == null) $gvars.DEBUG = nil; 18469 18470 18471 $post_args = $slice(arguments, 1); 18472 args = $post_args; 18473 if (($eqeq(args.$length(), 1) && ($truthy(args['$[]'](0)['$respond_to?']("to_ary"))))) { 18474 18475 ary = $Opal['$coerce_to?'](args['$[]'](0), $$$('Array'), "to_ary"); 18476 if (!$truthy(ary['$nil?']())) { 18477 args = ary.$to_a(); 18478 } } 18479 var result = '', 18480 //used for slicing: 18481 begin_slice = 0, 18482 end_slice, 18483 //used for iterating over the format string: 18484 i, 18485 len = format_string.length, 18486 //used for processing field values: 18487 arg, 18488 str, 18489 //used for processing %g and %G fields: 18490 exponent, 18491 //used for keeping track of width and precision: 18492 width, 18493 precision, 18494 //used for holding temporary values: 18495 tmp_num, 18496 //used for processing %{} and %<> fileds: 18497 hash_parameter_key, 18498 closing_brace_char, 18499 //used for processing %b, %B, %o, %x, and %X fields: 18500 base_number, 18501 base_prefix, 18502 base_neg_zero_regex, 18503 base_neg_zero_digit, 18504 //used for processing arguments: 18505 next_arg, 18506 seq_arg_num = 1, 18507 pos_arg_num = 0, 18508 //used for keeping track of flags: 18509 flags, 18510 FNONE = 0, 18511 FSHARP = 1, 18512 FMINUS = 2, 18513 FPLUS = 4, 18514 FZERO = 8, 18515 FSPACE = 16, 18516 FWIDTH = 32, 18517 FPREC = 64, 18518 FPREC0 = 128; 18519 18520 function CHECK_FOR_FLAGS() { 18521 if (flags&FWIDTH) { $Kernel.$raise($$$('ArgumentError'), "flag after width"); } 18522 if (flags&FPREC0) { $Kernel.$raise($$$('ArgumentError'), "flag after precision"); } 18523 } 18524 18525 function CHECK_FOR_WIDTH() { 18526 if (flags&FWIDTH) { $Kernel.$raise($$$('ArgumentError'), "width given twice"); } 18527 if (flags&FPREC0) { $Kernel.$raise($$$('ArgumentError'), "width after precision"); } 18528 } 18529 18530 function GET_NTH_ARG(num) { 18531 if (num >= args.length) { $Kernel.$raise($$$('ArgumentError'), "too few arguments"); } 18532 return args[num]; 18533 } 18534 18535 function GET_NEXT_ARG() { 18536 switch (pos_arg_num) { 18537 case -1: $Kernel.$raise($$$('ArgumentError'), "unnumbered(" + (seq_arg_num) + ") mixed with numbered"); // raise 18538 case -2: $Kernel.$raise($$$('ArgumentError'), "unnumbered(" + (seq_arg_num) + ") mixed with named"); // raise 18539 } 18540 pos_arg_num = seq_arg_num++; 18541 return GET_NTH_ARG(pos_arg_num - 1); 18542 } 18543 18544 function GET_POS_ARG(num) { 18545 if (pos_arg_num > 0) { 18546 $Kernel.$raise($$$('ArgumentError'), "numbered(" + (num) + ") after unnumbered(" + (pos_arg_num) + ")"); 18547 } 18548 if (pos_arg_num === -2) { 18549 $Kernel.$raise($$$('ArgumentError'), "numbered(" + (num) + ") after named"); 18550 } 18551 if (num < 1) { 18552 $Kernel.$raise($$$('ArgumentError'), "invalid index - " + (num) + "$"); 18553 } 18554 pos_arg_num = -1; 18555 return GET_NTH_ARG(num - 1); 18556 } 18557 18558 function GET_ARG() { 18559 return (next_arg === undefined ? GET_NEXT_ARG() : next_arg); 18560 } 18561 18562 function READ_NUM(label) { 18563 var num, str = ''; 18564 for (;; i++) { 18565 if (i === len) { 18566 $Kernel.$raise($$$('ArgumentError'), "malformed format string - %*[0-9]"); 18567 } 18568 if (format_string.charCodeAt(i) < 48 || format_string.charCodeAt(i) > 57) { 18569 i--; 18570 num = parseInt(str, 10) || 0; 18571 if (num > 2147483647) { 18572 $Kernel.$raise($$$('ArgumentError'), "" + (label) + " too big"); 18573 } 18574 return num; 18575 } 18576 str += format_string.charAt(i); 18577 } 18578 } 18579 18580 function READ_NUM_AFTER_ASTER(label) { 18581 var arg, num = READ_NUM(label); 18582 if (format_string.charAt(i + 1) === '$') { 18583 i++; 18584 arg = GET_POS_ARG(num); 18585 } else { 18586 arg = GET_NEXT_ARG(); 18587 } 18588 return (arg).$to_int(); 18589 } 18590 18591 for (i = format_string.indexOf('%'); i !== -1; i = format_string.indexOf('%', i)) { 18592 str = undefined; 18593 18594 flags = FNONE; 18595 width = -1; 18596 precision = -1; 18597 next_arg = undefined; 18598 18599 end_slice = i; 18600 18601 i++; 18602 18603 switch (format_string.charAt(i)) { 18604 case '%': 18605 begin_slice = i; 18606 // no-break 18607 case '': 18608 case '\n': 18609 case '\0': 18610 i++; 18611 continue; 18612 } 18613 18614 format_sequence: for (; i < len; i++) { 18615 switch (format_string.charAt(i)) { 18616 18617 case ' ': 18618 CHECK_FOR_FLAGS(); 18619 flags |= FSPACE; 18620 continue format_sequence; 18621 18622 case '#': 18623 CHECK_FOR_FLAGS(); 18624 flags |= FSHARP; 18625 continue format_sequence; 18626 18627 case '+': 18628 CHECK_FOR_FLAGS(); 18629 flags |= FPLUS; 18630 continue format_sequence; 18631 18632 case '-': 18633 CHECK_FOR_FLAGS(); 18634 flags |= FMINUS; 18635 continue format_sequence; 18636 18637 case '0': 18638 CHECK_FOR_FLAGS(); 18639 flags |= FZERO; 18640 continue format_sequence; 18641 18642 case '1': 18643 case '2': 18644 case '3': 18645 case '4': 18646 case '5': 18647 case '6': 18648 case '7': 18649 case '8': 18650 case '9': 18651 tmp_num = READ_NUM('width'); 18652 if (format_string.charAt(i + 1) === '$') { 18653 if (i + 2 === len) { 18654 str = '%'; 18655 i++; 18656 break format_sequence; 18657 } 18658 if (next_arg !== undefined) { 18659 $Kernel.$raise($$$('ArgumentError'), "value given twice - %" + (tmp_num) + "$"); 18660 } 18661 next_arg = GET_POS_ARG(tmp_num); 18662 i++; 18663 } else { 18664 CHECK_FOR_WIDTH(); 18665 flags |= FWIDTH; 18666 width = tmp_num; 18667 } 18668 continue format_sequence; 18669 18670 case '<': 18671 case '\{': 18672 closing_brace_char = (format_string.charAt(i) === '<' ? '>' : '\}'); 18673 hash_parameter_key = ''; 18674 18675 i++; 18676 18677 for (;; i++) { 18678 if (i === len) { 18679 $Kernel.$raise($$$('ArgumentError'), "malformed name - unmatched parenthesis"); 18680 } 18681 if (format_string.charAt(i) === closing_brace_char) { 18682 18683 if (pos_arg_num > 0) { 18684 $Kernel.$raise($$$('ArgumentError'), "named " + (hash_parameter_key) + " after unnumbered(" + (pos_arg_num) + ")"); 18685 } 18686 if (pos_arg_num === -1) { 18687 $Kernel.$raise($$$('ArgumentError'), "named " + (hash_parameter_key) + " after numbered"); 18688 } 18689 pos_arg_num = -2; 18690 18691 if (args[0] === undefined || !args[0].$$is_hash) { 18692 $Kernel.$raise($$$('ArgumentError'), "one hash required"); 18693 } 18694 18695 next_arg = (args[0]).$fetch(hash_parameter_key); 18696 18697 if (closing_brace_char === '>') { 18698 continue format_sequence; 18699 } else { 18700 str = next_arg.toString(); 18701 if (precision !== -1) { str = str.slice(0, precision); } 18702 if (flags&FMINUS) { 18703 while (str.length < width) { str = str + ' '; } 18704 } else { 18705 while (str.length < width) { str = ' ' + str; } 18706 } 18707 break format_sequence; 18708 } 18709 } 18710 hash_parameter_key += format_string.charAt(i); 18711 } 18712 // raise 18713 18714 case '*': 18715 i++; 18716 CHECK_FOR_WIDTH(); 18717 flags |= FWIDTH; 18718 width = READ_NUM_AFTER_ASTER('width'); 18719 if (width < 0) { 18720 flags |= FMINUS; 18721 width = -width; 18722 } 18723 continue format_sequence; 18724 18725 case '.': 18726 if (flags&FPREC0) { 18727 $Kernel.$raise($$$('ArgumentError'), "precision given twice"); 18728 } 18729 flags |= FPREC|FPREC0; 18730 precision = 0; 18731 i++; 18732 if (format_string.charAt(i) === '*') { 18733 i++; 18734 precision = READ_NUM_AFTER_ASTER('precision'); 18735 if (precision < 0) { 18736 flags &= ~FPREC; 18737 } 18738 continue format_sequence; 18739 } 18740 precision = READ_NUM('precision'); 18741 continue format_sequence; 18742 18743 case 'd': 18744 case 'i': 18745 case 'u': 18746 arg = $Kernel.$Integer(GET_ARG()); 18747 if (arg >= 0) { 18748 str = arg.toString(); 18749 while (str.length < precision) { str = '0' + str; } 18750 if (flags&FMINUS) { 18751 if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; } 18752 while (str.length < width) { str = str + ' '; } 18753 } else { 18754 if (flags&FZERO && precision === -1) { 18755 while (str.length < width - ((flags&FPLUS || flags&FSPACE) ? 1 : 0)) { str = '0' + str; } 18756 if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; } 18757 } else { 18758 if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; } 18759 while (str.length < width) { str = ' ' + str; } 18760 } 18761 } 18762 } else { 18763 str = (-arg).toString(); 18764 while (str.length < precision) { str = '0' + str; } 18765 if (flags&FMINUS) { 18766 str = '-' + str; 18767 while (str.length < width) { str = str + ' '; } 18768 } else { 18769 if (flags&FZERO && precision === -1) { 18770 while (str.length < width - 1) { str = '0' + str; } 18771 str = '-' + str; 18772 } else { 18773 str = '-' + str; 18774 while (str.length < width) { str = ' ' + str; } 18775 } 18776 } 18777 } 18778 break format_sequence; 18779 18780 case 'b': 18781 case 'B': 18782 case 'o': 18783 case 'x': 18784 case 'X': 18785 switch (format_string.charAt(i)) { 18786 case 'b': 18787 case 'B': 18788 base_number = 2; 18789 base_prefix = '0b'; 18790 base_neg_zero_regex = /^1+/; 18791 base_neg_zero_digit = '1'; 18792 break; 18793 case 'o': 18794 base_number = 8; 18795 base_prefix = '0'; 18796 base_neg_zero_regex = /^3?7+/; 18797 base_neg_zero_digit = '7'; 18798 break; 18799 case 'x': 18800 case 'X': 18801 base_number = 16; 18802 base_prefix = '0x'; 18803 base_neg_zero_regex = /^f+/; 18804 base_neg_zero_digit = 'f'; 18805 break; 18806 } 18807 arg = $Kernel.$Integer(GET_ARG()); 18808 if (arg >= 0) { 18809 str = arg.toString(base_number); 18810 while (str.length < precision) { str = '0' + str; } 18811 if (flags&FMINUS) { 18812 if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; } 18813 if (flags&FSHARP && arg !== 0) { str = base_prefix + str; } 18814 while (str.length < width) { str = str + ' '; } 18815 } else { 18816 if (flags&FZERO && precision === -1) { 18817 while (str.length < width - ((flags&FPLUS || flags&FSPACE) ? 1 : 0) - ((flags&FSHARP && arg !== 0) ? base_prefix.length : 0)) { str = '0' + str; } 18818 if (flags&FSHARP && arg !== 0) { str = base_prefix + str; } 18819 if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; } 18820 } else { 18821 if (flags&FSHARP && arg !== 0) { str = base_prefix + str; } 18822 if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; } 18823 while (str.length < width) { str = ' ' + str; } 18824 } 18825 } 18826 } else { 18827 if (flags&FPLUS || flags&FSPACE) { 18828 str = (-arg).toString(base_number); 18829 while (str.length < precision) { str = '0' + str; } 18830 if (flags&FMINUS) { 18831 if (flags&FSHARP) { str = base_prefix + str; } 18832 str = '-' + str; 18833 while (str.length < width) { str = str + ' '; } 18834 } else { 18835 if (flags&FZERO && precision === -1) { 18836 while (str.length < width - 1 - (flags&FSHARP ? 2 : 0)) { str = '0' + str; } 18837 if (flags&FSHARP) { str = base_prefix + str; } 18838 str = '-' + str; 18839 } else { 18840 if (flags&FSHARP) { str = base_prefix + str; } 18841 str = '-' + str; 18842 while (str.length < width) { str = ' ' + str; } 18843 } 18844 } 18845 } else { 18846 str = (arg >>> 0).toString(base_number).replace(base_neg_zero_regex, base_neg_zero_digit); 18847 while (str.length < precision - 2) { str = base_neg_zero_digit + str; } 18848 if (flags&FMINUS) { 18849 str = '..' + str; 18850 if (flags&FSHARP) { str = base_prefix + str; } 18851 while (str.length < width) { str = str + ' '; } 18852 } else { 18853 if (flags&FZERO && precision === -1) { 18854 while (str.length < width - 2 - (flags&FSHARP ? base_prefix.length : 0)) { str = base_neg_zero_digit + str; } 18855 str = '..' + str; 18856 if (flags&FSHARP) { str = base_prefix + str; } 18857 } else { 18858 str = '..' + str; 18859 if (flags&FSHARP) { str = base_prefix + str; } 18860 while (str.length < width) { str = ' ' + str; } 18861 } 18862 } 18863 } 18864 } 18865 if (format_string.charAt(i) === format_string.charAt(i).toUpperCase()) { 18866 str = str.toUpperCase(); 18867 } 18868 break format_sequence; 18869 18870 case 'f': 18871 case 'e': 18872 case 'E': 18873 case 'g': 18874 case 'G': 18875 arg = $Kernel.$Float(GET_ARG()); 18876 if (arg >= 0 || isNaN(arg)) { 18877 if (arg === Infinity) { 18878 str = 'Inf'; 18879 } else { 18880 switch (format_string.charAt(i)) { 18881 case 'f': 18882 str = arg.toFixed(precision === -1 ? 6 : precision); 18883 break; 18884 case 'e': 18885 case 'E': 18886 str = arg.toExponential(precision === -1 ? 6 : precision); 18887 break; 18888 case 'g': 18889 case 'G': 18890 str = arg.toExponential(); 18891 exponent = parseInt(str.split('e')[1], 10); 18892 if (!(exponent < -4 || exponent >= (precision === -1 ? 6 : precision))) { 18893 str = arg.toPrecision(precision === -1 ? (flags&FSHARP ? 6 : undefined) : precision); 18894 } 18895 break; 18896 } 18897 } 18898 if (flags&FMINUS) { 18899 if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; } 18900 while (str.length < width) { str = str + ' '; } 18901 } else { 18902 if (flags&FZERO && arg !== Infinity && !isNaN(arg)) { 18903 while (str.length < width - ((flags&FPLUS || flags&FSPACE) ? 1 : 0)) { str = '0' + str; } 18904 if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; } 18905 } else { 18906 if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; } 18907 while (str.length < width) { str = ' ' + str; } 18908 } 18909 } 18910 } else { 18911 if (arg === -Infinity) { 18912 str = 'Inf'; 18913 } else { 18914 switch (format_string.charAt(i)) { 18915 case 'f': 18916 str = (-arg).toFixed(precision === -1 ? 6 : precision); 18917 break; 18918 case 'e': 18919 case 'E': 18920 str = (-arg).toExponential(precision === -1 ? 6 : precision); 18921 break; 18922 case 'g': 18923 case 'G': 18924 str = (-arg).toExponential(); 18925 exponent = parseInt(str.split('e')[1], 10); 18926 if (!(exponent < -4 || exponent >= (precision === -1 ? 6 : precision))) { 18927 str = (-arg).toPrecision(precision === -1 ? (flags&FSHARP ? 6 : undefined) : precision); 18928 } 18929 break; 18930 } 18931 } 18932 if (flags&FMINUS) { 18933 str = '-' + str; 18934 while (str.length < width) { str = str + ' '; } 18935 } else { 18936 if (flags&FZERO && arg !== -Infinity) { 18937 while (str.length < width - 1) { str = '0' + str; } 18938 str = '-' + str; 18939 } else { 18940 str = '-' + str; 18941 while (str.length < width) { str = ' ' + str; } 18942 } 18943 } 18944 } 18945 if (format_string.charAt(i) === format_string.charAt(i).toUpperCase() && arg !== Infinity && arg !== -Infinity && !isNaN(arg)) { 18946 str = str.toUpperCase(); 18947 } 18948 str = str.replace(/([eE][-+]?)([0-9])$/, '$10$2'); 18949 break format_sequence; 18950 18951 case 'a': 18952 case 'A': 18953 // Not implemented because there are no specs for this field type. 18954 $Kernel.$raise($$$('NotImplementedError'), "`A` and `a` format field types are not implemented in Opal yet"); 18955 // raise 18956 18957 case 'c': 18958 arg = GET_ARG(); 18959 if ((arg)['$respond_to?']("to_ary")) { arg = (arg).$to_ary()[0]; } 18960 if ((arg)['$respond_to?']("to_str")) { 18961 str = (arg).$to_str(); 18962 } else { 18963 str = String.fromCharCode($coerce_to(arg, $$$('Integer'), 'to_int')); 18964 } 18965 if (str.length !== 1) { 18966 $Kernel.$raise($$$('ArgumentError'), "%c requires a character"); 18967 } 18968 if (flags&FMINUS) { 18969 while (str.length < width) { str = str + ' '; } 18970 } else { 18971 while (str.length < width) { str = ' ' + str; } 18972 } 18973 break format_sequence; 18974 18975 case 'p': 18976 str = (GET_ARG()).$inspect(); 18977 if (precision !== -1) { str = str.slice(0, precision); } 18978 if (flags&FMINUS) { 18979 while (str.length < width) { str = str + ' '; } 18980 } else { 18981 while (str.length < width) { str = ' ' + str; } 18982 } 18983 break format_sequence; 18984 18985 case 's': 18986 str = (GET_ARG()).$to_s(); 18987 if (precision !== -1) { str = str.slice(0, precision); } 18988 if (flags&FMINUS) { 18989 while (str.length < width) { str = str + ' '; } 18990 } else { 18991 while (str.length < width) { str = ' ' + str; } 18992 } 18993 break format_sequence; 18994 18995 default: 18996 $Kernel.$raise($$$('ArgumentError'), "malformed format string - %" + (format_string.charAt(i))); 18997 } 18998 } 18999 19000 if (str === undefined) { 19001 $Kernel.$raise($$$('ArgumentError'), "malformed format string - %"); 19002 } 19003 19004 result += format_string.slice(begin_slice, end_slice) + str; 19005 begin_slice = i + 1; 19006 } 19007 19008 if ($gvars.DEBUG && pos_arg_num >= 0 && seq_arg_num < args.length) { 19009 $Kernel.$raise($$$('ArgumentError'), "too many arguments for format string"); 19010 } 19011 19012 return result + format_string.slice(begin_slice); 19013 }, -2); 19014 return $alias(self, "sprintf", "format"); 19015 })('::') 19016}; 19017 19018Opal.modules["corelib/string/encoding"] = function(Opal) {/* Generated by Opal 1.7.3 */ 19019 var $klass = Opal.klass, $hash2 = Opal.hash2, $rb_plus = Opal.rb_plus, $truthy = Opal.truthy, $send = Opal.send, $defs = Opal.defs, $eqeq = Opal.eqeq, $def = Opal.def, $return_ivar = Opal.return_ivar, $return_val = Opal.return_val, $slice = Opal.slice, $Kernel = Opal.Kernel, $Opal = Opal.Opal, $rb_lt = Opal.rb_lt, $a, self = Opal.top, $nesting = [], $$ = Opal.$r($nesting), nil = Opal.nil, $$$ = Opal.$$$; 19020 19021 Opal.add_stubs('require,+,[],clone,initialize,new,instance_eval,to_proc,each,const_set,tr,==,default_external,attr_accessor,singleton_class,attr_reader,raise,register,length,bytes,force_encoding,dup,bytesize,enum_for,each_byte,to_a,each_char,each_codepoint,coerce_to!,find,<,default_external='); 19022 19023 self.$require("corelib/string"); 19024 (function($base, $super) { 19025 var self = $klass($base, $super, 'Encoding'); 19026 19027 var $proto = self.$$prototype; 19028 19029 $proto.name = $proto.dummy = nil; 19030 19031 $defs(self, '$register', function $$register(name, options) { 19032 var block = $$register.$$p || nil, self = this, names = nil, $ret_or_1 = nil, ascii = nil, dummy = nil, encoding = nil, register = nil; 19033 19034 $$register.$$p = null; 19035 if (options == null) options = $hash2([], {}); 19036 names = $rb_plus([name], ($truthy(($ret_or_1 = options['$[]']("aliases"))) ? ($ret_or_1) : ([]))); 19037 ascii = ($truthy(($ret_or_1 = options['$[]']("ascii"))) && ($ret_or_1)); 19038 dummy = ($truthy(($ret_or_1 = options['$[]']("dummy"))) && ($ret_or_1)); 19039 if ($truthy(options['$[]']("inherits"))) { 19040 19041 encoding = options['$[]']("inherits").$clone(); 19042 encoding.$initialize(name, names, ascii, dummy); 19043 } else { 19044 encoding = self.$new(name, names, ascii, dummy); 19045 } if ((block !== nil)) { 19046 $send(encoding, 'instance_eval', [], block.$to_proc()); 19047 } register = Opal.encodings; 19048 return $send(names, 'each', [], function $$1(encoding_name){var self = $$1.$$s == null ? this : $$1.$$s; 19049 19050 19051 if (encoding_name == null) encoding_name = nil; 19052 self.$const_set(encoding_name.$tr("-", "_"), encoding); 19053 return register[encoding_name] = encoding;}, {$$s: self}); 19054 }, -2); 19055 $defs(self, '$find', function $$find(name) { 19056 var self = this; 19057 19058 19059 if ($eqeq(name, "default_external")) { 19060 return self.$default_external() 19061 } return Opal.find_encoding(name); }); 19062 self.$singleton_class().$attr_accessor("default_external"); 19063 self.$attr_reader("name", "names"); 19064 19065 $def(self, '$initialize', function $$initialize(name, names, ascii, dummy) { 19066 var self = this; 19067 19068 19069 self.name = name; 19070 self.names = names; 19071 self.ascii = ascii; 19072 return (self.dummy = dummy); 19073 }); 19074 19075 $def(self, '$ascii_compatible?', $return_ivar("ascii")); 19076 19077 $def(self, '$dummy?', $return_ivar("dummy")); 19078 19079 $def(self, '$binary?', $return_val(false)); 19080 19081 $def(self, '$to_s', $return_ivar("name")); 19082 19083 $def(self, '$inspect', function $$inspect() { 19084 var self = this; 19085 19086 return "#<Encoding:" + (self.name) + (($truthy(self.dummy) ? (" (dummy)") : nil)) + ">" 19087 }); 19088 19089 $def(self, '$charsize', function $$charsize(string) { 19090 19091 19092 var len = 0; 19093 for (var i = 0, length = string.length; i < length; i++) { 19094 var charcode = string.charCodeAt(i); 19095 if (!(charcode >= 0xD800 && charcode <= 0xDBFF)) { 19096 len++; 19097 } 19098 } 19099 return len; 19100 19101 }); 19102 19103 $def(self, '$each_char', function $$each_char(string) { 19104 var block = $$each_char.$$p || nil; 19105 19106 $$each_char.$$p = null; 19107 19108 var low_surrogate = ""; 19109 for (var i = 0, length = string.length; i < length; i++) { 19110 var charcode = string.charCodeAt(i); 19111 var chr = string.charAt(i); 19112 if (charcode >= 0xDC00 && charcode <= 0xDFFF) { 19113 low_surrogate = chr; 19114 continue; 19115 } 19116 else if (charcode >= 0xD800 && charcode <= 0xDBFF) { 19117 chr = low_surrogate + chr; 19118 } 19119 if (string.encoding.name != "UTF-8") { 19120 chr = new String(chr); 19121 chr.encoding = string.encoding; 19122 } 19123 Opal.yield1(block, chr); 19124 } 19125 }); 19126 19127 $def(self, '$each_byte', function $$each_byte($a) { 19128 19129 19130 $slice(arguments); 19131 return $Kernel.$raise($$$('NotImplementedError')); 19132 }, -1); 19133 19134 $def(self, '$bytesize', function $$bytesize($a) { 19135 19136 19137 $slice(arguments); 19138 return $Kernel.$raise($$$('NotImplementedError')); 19139 }, -1); 19140 $klass('::', $$$('StandardError'), 'EncodingError'); 19141 return ($klass('::', $$$('EncodingError'), 'CompatibilityError'), nil); 19142 })('::', null); 19143 $send($$$('Encoding'), 'register', ["UTF-8", $hash2(["aliases", "ascii"], {"aliases": ["CP65001"], "ascii": true})], function $$2(){var self = $$2.$$s == null ? this : $$2.$$s; 19144 19145 19146 19147 $def(self, '$each_byte', function $$each_byte(string) { 19148 var block = $$each_byte.$$p || nil; 19149 19150 $$each_byte.$$p = null; 19151 19152 // Taken from: https://github.com/feross/buffer/blob/f52dffd9df0445b93c0c9065c2f8f0f46b2c729a/index.js#L1954-L2032 19153 var units = Infinity; 19154 var codePoint; 19155 var length = string.length; 19156 var leadSurrogate = null; 19157 19158 for (var i = 0; i < length; ++i) { 19159 codePoint = string.charCodeAt(i); 19160 19161 // is surrogate component 19162 if (codePoint > 0xD7FF && codePoint < 0xE000) { 19163 // last char was a lead 19164 if (!leadSurrogate) { 19165 // no lead yet 19166 if (codePoint > 0xDBFF) { 19167 // unexpected trail 19168 if ((units -= 3) > -1) { 19169 Opal.yield1(block, 0xEF); 19170 Opal.yield1(block, 0xBF); 19171 Opal.yield1(block, 0xBD); 19172 } 19173 continue; 19174 } else if (i + 1 === length) { 19175 // unpaired lead 19176 if ((units -= 3) > -1) { 19177 Opal.yield1(block, 0xEF); 19178 Opal.yield1(block, 0xBF); 19179 Opal.yield1(block, 0xBD); 19180 } 19181 continue; 19182 } 19183 19184 // valid lead 19185 leadSurrogate = codePoint; 19186 19187 continue; 19188 } 19189 19190 // 2 leads in a row 19191 if (codePoint < 0xDC00) { 19192 if ((units -= 3) > -1) { 19193 Opal.yield1(block, 0xEF); 19194 Opal.yield1(block, 0xBF); 19195 Opal.yield1(block, 0xBD); 19196 } 19197 leadSurrogate = codePoint; 19198 continue; 19199 } 19200 19201 // valid surrogate pair 19202 codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000; 19203 } else if (leadSurrogate) { 19204 // valid bmp char, but last char was a lead 19205 if ((units -= 3) > -1) { 19206 Opal.yield1(block, 0xEF); 19207 Opal.yield1(block, 0xBF); 19208 Opal.yield1(block, 0xBD); 19209 } 19210 } 19211 19212 leadSurrogate = null; 19213 19214 // encode utf8 19215 if (codePoint < 0x80) { 19216 if ((units -= 1) < 0) break; 19217 Opal.yield1(block, codePoint); 19218 } else if (codePoint < 0x800) { 19219 if ((units -= 2) < 0) break; 19220 Opal.yield1(block, codePoint >> 0x6 | 0xC0); 19221 Opal.yield1(block, codePoint & 0x3F | 0x80); 19222 } else if (codePoint < 0x10000) { 19223 if ((units -= 3) < 0) break; 19224 Opal.yield1(block, codePoint >> 0xC | 0xE0); 19225 Opal.yield1(block, codePoint >> 0x6 & 0x3F | 0x80); 19226 Opal.yield1(block, codePoint & 0x3F | 0x80); 19227 } else if (codePoint < 0x110000) { 19228 if ((units -= 4) < 0) break; 19229 Opal.yield1(block, codePoint >> 0x12 | 0xF0); 19230 Opal.yield1(block, codePoint >> 0xC & 0x3F | 0x80); 19231 Opal.yield1(block, codePoint >> 0x6 & 0x3F | 0x80); 19232 Opal.yield1(block, codePoint & 0x3F | 0x80); 19233 } else ; 19234 } 19235 }); 19236 return $def(self, '$bytesize', function $$bytesize(string) { 19237 19238 return string.$bytes().$length() 19239 });}, {$$s: self}); 19240 $send($$$('Encoding'), 'register', ["UTF-16LE"], function $$3(){var self = $$3.$$s == null ? this : $$3.$$s; 19241 19242 19243 19244 $def(self, '$each_byte', function $$each_byte(string) { 19245 var block = $$each_byte.$$p || nil; 19246 19247 $$each_byte.$$p = null; 19248 19249 for (var i = 0, length = string.length; i < length; i++) { 19250 var code = string.charCodeAt(i); 19251 19252 Opal.yield1(block, code & 0xff); 19253 Opal.yield1(block, code >> 8); 19254 } 19255 }); 19256 return $def(self, '$bytesize', function $$bytesize(string) { 19257 19258 return string.length * 2; 19259 });}, {$$s: self}); 19260 $send($$$('Encoding'), 'register', ["UTF-16BE", $hash2(["inherits"], {"inherits": $$$($$$('Encoding'), 'UTF_16LE')})], function $$4(){var self = $$4.$$s == null ? this : $$4.$$s; 19261 19262 return $def(self, '$each_byte', function $$each_byte(string) { 19263 var block = $$each_byte.$$p || nil; 19264 19265 $$each_byte.$$p = null; 19266 19267 for (var i = 0, length = string.length; i < length; i++) { 19268 var code = string.charCodeAt(i); 19269 19270 Opal.yield1(block, code >> 8); 19271 Opal.yield1(block, code & 0xff); 19272 } 19273 })}, {$$s: self}); 19274 $send($$$('Encoding'), 'register', ["UTF-32LE"], function $$5(){var self = $$5.$$s == null ? this : $$5.$$s; 19275 19276 19277 19278 $def(self, '$each_byte', function $$each_byte(string) { 19279 var block = $$each_byte.$$p || nil; 19280 19281 $$each_byte.$$p = null; 19282 19283 for (var i = 0, length = string.length; i < length; i++) { 19284 var code = string.charCodeAt(i); 19285 19286 Opal.yield1(block, code & 0xff); 19287 Opal.yield1(block, code >> 8); 19288 Opal.yield1(block, 0); 19289 Opal.yield1(block, 0); 19290 } 19291 }); 19292 return $def(self, '$bytesize', function $$bytesize(string) { 19293 19294 return string.length * 4; 19295 });}, {$$s: self}); 19296 $send($$$('Encoding'), 'register', ["UTF-32BE", $hash2(["inherits"], {"inherits": $$$($$$('Encoding'), 'UTF_32LE')})], function $$6(){var self = $$6.$$s == null ? this : $$6.$$s; 19297 19298 return $def(self, '$each_byte', function $$each_byte(string) { 19299 var block = $$each_byte.$$p || nil; 19300 19301 $$each_byte.$$p = null; 19302 19303 for (var i = 0, length = string.length; i < length; i++) { 19304 var code = string.charCodeAt(i); 19305 19306 Opal.yield1(block, 0); 19307 Opal.yield1(block, 0); 19308 Opal.yield1(block, code >> 8); 19309 Opal.yield1(block, code & 0xff); 19310 } 19311 })}, {$$s: self}); 19312 $send($$$('Encoding'), 'register', ["ASCII-8BIT", $hash2(["aliases", "ascii"], {"aliases": ["BINARY"], "ascii": true})], function $$7(){var self = $$7.$$s == null ? this : $$7.$$s; 19313 19314 19315 19316 $def(self, '$each_char', function $$each_char(string) { 19317 var block = $$each_char.$$p || nil; 19318 19319 $$each_char.$$p = null; 19320 19321 for (var i = 0, length = string.length; i < length; i++) { 19322 var chr = new String(string.charAt(i)); 19323 chr.encoding = string.encoding; 19324 Opal.yield1(block, chr); 19325 } 19326 }); 19327 19328 $def(self, '$charsize', function $$charsize(string) { 19329 19330 return string.length; 19331 }); 19332 19333 $def(self, '$each_byte', function $$each_byte(string) { 19334 var block = $$each_byte.$$p || nil; 19335 19336 $$each_byte.$$p = null; 19337 19338 for (var i = 0, length = string.length; i < length; i++) { 19339 var code = string.charCodeAt(i); 19340 Opal.yield1(block, code & 0xff); 19341 } 19342 }); 19343 19344 $def(self, '$bytesize', function $$bytesize(string) { 19345 19346 return string.length; 19347 }); 19348 return $def(self, '$binary?', $return_val(true));}, {$$s: self}); 19349 $$$('Encoding').$register("ISO-8859-1", $hash2(["aliases", "ascii", "inherits"], {"aliases": ["ISO8859-1"], "ascii": true, "inherits": $$$($$$('Encoding'), 'ASCII_8BIT')})); 19350 $$$('Encoding').$register("US-ASCII", $hash2(["aliases", "ascii", "inherits"], {"aliases": ["ASCII"], "ascii": true, "inherits": $$$($$$('Encoding'), 'ASCII_8BIT')})); 19351 (function($base, $super) { 19352 var self = $klass($base, $super, 'String'); 19353 19354 var $proto = self.$$prototype; 19355 19356 $proto.internal_encoding = $proto.bytes = $proto.encoding = nil; 19357 19358 self.$attr_reader("encoding"); 19359 self.$attr_reader("internal_encoding"); 19360 Opal.prop(String.prototype, 'bytes', nil); 19361 Opal.prop(String.prototype, 'encoding', $$$($$$('Encoding'), 'UTF_8')); 19362 Opal.prop(String.prototype, 'internal_encoding', $$$($$$('Encoding'), 'UTF_8')); 19363 19364 $def(self, '$b', function $$b() { 19365 var self = this; 19366 19367 return self.$dup().$force_encoding("binary") 19368 }); 19369 19370 $def(self, '$bytesize', function $$bytesize() { 19371 var self = this; 19372 19373 return self.internal_encoding.$bytesize(self) 19374 }); 19375 19376 $def(self, '$each_byte', function $$each_byte() { 19377 var block = $$each_byte.$$p || nil, self = this; 19378 19379 $$each_byte.$$p = null; 19380 if (!(block !== nil)) { 19381 return $send(self, 'enum_for', ["each_byte"], function $$8(){var self = $$8.$$s == null ? this : $$8.$$s; 19382 19383 return self.$bytesize()}, {$$s: self}) 19384 } $send(self.internal_encoding, 'each_byte', [self], block.$to_proc()); 19385 return self; 19386 }); 19387 19388 $def(self, '$bytes', function $$bytes() { 19389 var self = this, $ret_or_1 = nil; 19390 19391 19392 19393 if (typeof self === 'string') { 19394 return (new String(self)).$each_byte().$to_a(); 19395 } 19396 self.bytes = ($truthy(($ret_or_1 = self.bytes)) ? ($ret_or_1) : (self.$each_byte().$to_a())); 19397 return self.bytes.$dup(); 19398 }); 19399 19400 $def(self, '$each_char', function $$each_char() { 19401 var block = $$each_char.$$p || nil, self = this; 19402 19403 $$each_char.$$p = null; 19404 if (!(block !== nil)) { 19405 return $send(self, 'enum_for', ["each_char"], function $$9(){var self = $$9.$$s == null ? this : $$9.$$s; 19406 19407 return self.$length()}, {$$s: self}) 19408 } $send(self.encoding, 'each_char', [self], block.$to_proc()); 19409 return self; 19410 }); 19411 19412 $def(self, '$chars', function $$chars() { 19413 var block = $$chars.$$p || nil, self = this; 19414 19415 $$chars.$$p = null; 19416 if (!$truthy(block)) { 19417 return self.$each_char().$to_a() 19418 } return $send(self, 'each_char', [], block.$to_proc()); 19419 }); 19420 19421 $def(self, '$each_codepoint', function $$each_codepoint() { 19422 var block = $$each_codepoint.$$p || nil, self = this; 19423 19424 $$each_codepoint.$$p = null; 19425 if (!(block !== nil)) { 19426 return self.$enum_for("each_codepoint") 19427 } 19428 for (var i = 0, length = self.length; i < length; i++) { 19429 Opal.yield1(block, self.codePointAt(i)); 19430 } 19431 return self; 19432 }); 19433 19434 $def(self, '$codepoints', function $$codepoints() { 19435 var block = $$codepoints.$$p || nil, self = this; 19436 19437 $$codepoints.$$p = null; 19438 if ((block !== nil)) { 19439 return $send(self, 'each_codepoint', [], block.$to_proc()) 19440 } return self.$each_codepoint().$to_a(); 19441 }); 19442 19443 $def(self, '$encode', function $$encode(encoding) { 19444 var self = this; 19445 19446 return Opal.enc(self, encoding); 19447 }); 19448 19449 $def(self, '$force_encoding', function $$force_encoding(encoding) { 19450 var self = this; 19451 19452 19453 var str = self; 19454 19455 if (encoding === str.encoding) { return str; } 19456 19457 encoding = $Opal['$coerce_to!'](encoding, $$$('String'), "to_s"); 19458 encoding = $$$('Encoding').$find(encoding); 19459 19460 if (encoding === str.encoding) { return str; } 19461 19462 str = Opal.set_encoding(str, encoding); 19463 19464 return str; 19465 19466 }); 19467 19468 $def(self, '$getbyte', function $$getbyte(idx) { 19469 var self = this, string_bytes = nil; 19470 19471 19472 string_bytes = self.$bytes(); 19473 idx = $Opal['$coerce_to!'](idx, $$$('Integer'), "to_int"); 19474 if ($truthy($rb_lt(string_bytes.$length(), idx))) { 19475 return nil 19476 } return string_bytes['$[]'](idx); 19477 }); 19478 19479 $def(self, '$initialize_copy', function $$initialize_copy(other) { 19480 19481 return "\n" + " self.encoding = other.encoding;\n" + " self.internal_encoding = other.internal_encoding;\n" + " " 19482 }); 19483 return $def(self, '$valid_encoding?', $return_val(true)); 19484 })('::', null); 19485 return ($a = [$$$($$('Encoding'), 'UTF_8')], $send($$$('Encoding'), 'default_external=', $a), $a[$a.length - 1]); 19486}; 19487 19488Opal.modules["corelib/math"] = function(Opal) {/* Generated by Opal 1.7.3 */ 19489 var $type_error = Opal.type_error, $module = Opal.module, $const_set = Opal.const_set, $Class = Opal.Class, $slice = Opal.slice, $Kernel = Opal.Kernel, $defs = Opal.defs, $truthy = Opal.truthy, $send = Opal.send, $def = Opal.def, $rb_minus = Opal.rb_minus, $eqeqeq = Opal.eqeqeq, $rb_divide = Opal.rb_divide, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 19490 19491 Opal.add_stubs('new,raise,Float,Integer,module_function,each,define_method,checked,float!,===,gamma,-,integer!,/,infinite?'); 19492 return (function($base, $parent_nesting) { 19493 var self = $module($base, 'Math'); 19494 19495 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 19496 19497 19498 $const_set(self, 'E', Math.E); 19499 $const_set(self, 'PI', Math.PI); 19500 $const_set(self, 'DomainError', $Class.$new($$$('StandardError'))); 19501 $defs(self, '$checked', function $$checked(method, $a) { 19502 var $post_args, args; 19503 19504 19505 $post_args = $slice(arguments, 1); 19506 args = $post_args; 19507 19508 if (isNaN(args[0]) || (args.length == 2 && isNaN(args[1]))) { 19509 return NaN; 19510 } 19511 19512 var result = Math[method].apply(null, args); 19513 19514 if (isNaN(result)) { 19515 $Kernel.$raise($$('DomainError'), "Numerical argument is out of domain - \"" + (method) + "\""); 19516 } 19517 19518 return result; 19519 }, -2); 19520 $defs(self, '$float!', function $Math_float$excl$1(value) { 19521 19522 try { 19523 return $Kernel.$Float(value) 19524 } catch ($err) { 19525 if (Opal.rescue($err, [$$$('ArgumentError')])) { 19526 try { 19527 return $Kernel.$raise($type_error(value, $$$('Float'))) 19528 } finally { Opal.pop_exception(); } 19529 } else { throw $err; } 19530 } 19531 }); 19532 $defs(self, '$integer!', function $Math_integer$excl$2(value) { 19533 19534 try { 19535 return $Kernel.$Integer(value) 19536 } catch ($err) { 19537 if (Opal.rescue($err, [$$$('ArgumentError')])) { 19538 try { 19539 return $Kernel.$raise($type_error(value, $$$('Integer'))) 19540 } finally { Opal.pop_exception(); } 19541 } else { throw $err; } 19542 } 19543 }); 19544 self.$module_function(); 19545 if (!$truthy((typeof(Math.erf) !== "undefined"))) { 19546 19547 Opal.prop(Math, 'erf', function(x) { 19548 var A1 = 0.254829592, 19549 A2 = -0.284496736, 19550 A3 = 1.421413741, 19551 A4 = -1.453152027, 19552 A5 = 1.061405429, 19553 P = 0.3275911; 19554 19555 var sign = 1; 19556 19557 if (x < 0) { 19558 sign = -1; 19559 } 19560 19561 x = Math.abs(x); 19562 19563 var t = 1.0 / (1.0 + P * x); 19564 var y = 1.0 - (((((A5 * t + A4) * t) + A3) * t + A2) * t + A1) * t * Math.exp(-x * x); 19565 19566 return sign * y; 19567 }); 19568 19569 } if (!$truthy((typeof(Math.erfc) !== "undefined"))) { 19570 19571 Opal.prop(Math, 'erfc', function(x) { 19572 var z = Math.abs(x), 19573 t = 1.0 / (0.5 * z + 1.0); 19574 19575 var A1 = t * 0.17087277 + -0.82215223, 19576 A2 = t * A1 + 1.48851587, 19577 A3 = t * A2 + -1.13520398, 19578 A4 = t * A3 + 0.27886807, 19579 A5 = t * A4 + -0.18628806, 19580 A6 = t * A5 + 0.09678418, 19581 A7 = t * A6 + 0.37409196, 19582 A8 = t * A7 + 1.00002368, 19583 A9 = t * A8, 19584 A10 = -z * z - 1.26551223 + A9; 19585 19586 var a = t * Math.exp(A10); 19587 19588 if (x < 0.0) { 19589 return 2.0 - a; 19590 } 19591 else { 19592 return a; 19593 } 19594 }); 19595 19596 } $send(["acos", "acosh", "asin", "asinh", "atan", "atanh", "cbrt", "cos", "cosh", "erf", "erfc", "exp", "sin", "sinh", "sqrt", "tanh"], 'each', [], function $Math$3(method){var self = $Math$3.$$s == null ? this : $Math$3.$$s; 19597 19598 19599 if (method == null) method = nil; 19600 return $send(self, 'define_method', [method], function $$4(x){ 19601 19602 if (x == null) x = nil; 19603 return $$$('Math').$checked(method, $$$('Math')['$float!'](x));});}, {$$s: self}); 19604 19605 $def(self, '$atan2', function $$atan2(y, x) { 19606 19607 return $$$('Math').$checked("atan2", $$$('Math')['$float!'](y), $$$('Math')['$float!'](x)) 19608 }); 19609 19610 $def(self, '$hypot', function $$hypot(x, y) { 19611 19612 return $$$('Math').$checked("hypot", $$$('Math')['$float!'](x), $$$('Math')['$float!'](y)) 19613 }); 19614 19615 $def(self, '$frexp', function $$frexp(x) { 19616 19617 19618 x = $$('Math')['$float!'](x); 19619 19620 if (isNaN(x)) { 19621 return [NaN, 0]; 19622 } 19623 19624 var ex = Math.floor(Math.log(Math.abs(x)) / Math.log(2)) + 1, 19625 frac = x / Math.pow(2, ex); 19626 19627 return [frac, ex]; 19628 }); 19629 19630 $def(self, '$gamma', function $$gamma(n) { 19631 19632 19633 n = $$('Math')['$float!'](n); 19634 19635 var i, t, x, value, result, twoN, threeN, fourN, fiveN; 19636 19637 var G = 4.7421875; 19638 19639 var P = [ 19640 0.99999999999999709182, 19641 57.156235665862923517, 19642 -59.597960355475491248, 19643 14.136097974741747174, 19644 -0.49191381609762019978, 19645 0.33994649984811888699e-4, 19646 0.46523628927048575665e-4, 19647 -0.98374475304879564677e-4, 19648 0.15808870322491248884e-3, 19649 -0.21026444172410488319e-3, 19650 0.21743961811521264320e-3, 19651 -0.16431810653676389022e-3, 19652 0.84418223983852743293e-4, 19653 -0.26190838401581408670e-4, 19654 0.36899182659531622704e-5 19655 ]; 19656 19657 19658 if (isNaN(n)) { 19659 return NaN; 19660 } 19661 19662 if (n === 0 && 1 / n < 0) { 19663 return -Infinity; 19664 } 19665 19666 if (n === -1 || n === -Infinity) { 19667 $Kernel.$raise($$('DomainError'), "Numerical argument is out of domain - \"gamma\""); 19668 } 19669 19670 if ($$('Integer')['$==='](n)) { 19671 if (n <= 0) { 19672 return isFinite(n) ? Infinity : NaN; 19673 } 19674 19675 if (n > 171) { 19676 return Infinity; 19677 } 19678 19679 value = n - 2; 19680 result = n - 1; 19681 19682 while (value > 1) { 19683 result *= value; 19684 value--; 19685 } 19686 19687 if (result == 0) { 19688 result = 1; 19689 } 19690 19691 return result; 19692 } 19693 19694 if (n < 0.5) { 19695 return Math.PI / (Math.sin(Math.PI * n) * $$$('Math').$gamma($rb_minus(1, n))); 19696 } 19697 19698 if (n >= 171.35) { 19699 return Infinity; 19700 } 19701 19702 if (n > 85.0) { 19703 twoN = n * n; 19704 threeN = twoN * n; 19705 fourN = threeN * n; 19706 fiveN = fourN * n; 19707 19708 return Math.sqrt(2 * Math.PI / n) * Math.pow((n / Math.E), n) * 19709 (1 + 1 / (12 * n) + 1 / (288 * twoN) - 139 / (51840 * threeN) - 19710 571 / (2488320 * fourN) + 163879 / (209018880 * fiveN) + 19711 5246819 / (75246796800 * fiveN * n)); 19712 } 19713 19714 n -= 1; 19715 x = P[0]; 19716 19717 for (i = 1; i < P.length; ++i) { 19718 x += P[i] / (n + i); 19719 } 19720 19721 t = n + G + 0.5; 19722 19723 return Math.sqrt(2 * Math.PI) * Math.pow(t, n + 0.5) * Math.exp(-t) * x; 19724 }); 19725 19726 $def(self, '$ldexp', function $$ldexp(mantissa, exponent) { 19727 19728 19729 mantissa = $$('Math')['$float!'](mantissa); 19730 exponent = $$('Math')['$integer!'](exponent); 19731 19732 if (isNaN(exponent)) { 19733 $Kernel.$raise($$$('RangeError'), "float NaN out of range of integer"); 19734 } 19735 19736 return mantissa * Math.pow(2, exponent); 19737 }); 19738 19739 $def(self, '$lgamma', function $$lgamma(n) { 19740 19741 19742 if (n == -1) { 19743 return [Infinity, 1]; 19744 } 19745 else { 19746 return [Math.log(Math.abs($$$('Math').$gamma(n))), $$$('Math').$gamma(n) < 0 ? -1 : 1]; 19747 } 19748 19749 }); 19750 19751 $def(self, '$log', function $$log(x, base) { 19752 if ($eqeqeq($$$('String'), x)) { 19753 $Kernel.$raise($type_error(x, $$$('Float'))); 19754 } if ($truthy(base == null)) { 19755 return $$$('Math').$checked("log", $$$('Math')['$float!'](x)) 19756 } else { 19757 19758 if ($eqeqeq($$$('String'), base)) { 19759 $Kernel.$raise($type_error(base, $$$('Float'))); 19760 } return $rb_divide($$$('Math').$checked("log", $$$('Math')['$float!'](x)), $$$('Math').$checked("log", $$$('Math')['$float!'](base))); 19761 } }, -2); 19762 19763 $def(self, '$log10', function $$log10(x) { 19764 19765 19766 if ($eqeqeq($$$('String'), x)) { 19767 $Kernel.$raise($type_error(x, $$$('Float'))); 19768 } return $$$('Math').$checked("log10", $$$('Math')['$float!'](x)); 19769 }); 19770 19771 $def(self, '$log2', function $$log2(x) { 19772 19773 19774 if ($eqeqeq($$$('String'), x)) { 19775 $Kernel.$raise($type_error(x, $$$('Float'))); 19776 } return $$$('Math').$checked("log2", $$$('Math')['$float!'](x)); 19777 }); 19778 return $def(self, '$tan', function $$tan(x) { 19779 19780 19781 x = $$$('Math')['$float!'](x); 19782 if ($truthy(x['$infinite?']())) { 19783 return $$$($$$('Float'), 'NAN') 19784 } return $$$('Math').$checked("tan", $$$('Math')['$float!'](x)); 19785 }); 19786 })('::', $nesting) 19787}; 19788 19789Opal.modules["corelib/complex/base"] = function(Opal) {/* Generated by Opal 1.7.3 */ 19790 var $module = Opal.module, $truthy = Opal.truthy, $def = Opal.def, $klass = Opal.klass, $nesting = [], nil = Opal.nil; 19791 19792 Opal.add_stubs('new,from_string'); 19793 19794 (function($base, $parent_nesting) { 19795 var self = $module($base, 'Kernel'); 19796 19797 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 19798 19799 return $def(self, '$Complex', function $$Complex(real, imag) { 19800 19801 19802 if (imag == null) imag = nil; 19803 if ($truthy(imag)) { 19804 return $$('Complex').$new(real, imag) 19805 } else { 19806 return $$('Complex').$new(real, 0) 19807 } }, -2) 19808 })('::', $nesting); 19809 return (function($base, $super, $parent_nesting) { 19810 var self = $klass($base, $super, 'String'); 19811 19812 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 19813 19814 return $def(self, '$to_c', function $$to_c() { 19815 var self = this; 19816 19817 return $$('Complex').$from_string(self) 19818 }) 19819 })('::', null, $nesting); 19820}; 19821 19822Opal.modules["corelib/complex"] = function(Opal) {/* Generated by Opal 1.7.3 */ 19823 var $klass = Opal.klass, $truthy = Opal.truthy, $eqeqeq = Opal.eqeqeq, $Kernel = Opal.Kernel, $defs = Opal.defs, $rb_times = Opal.rb_times, $def = Opal.def, $rb_plus = Opal.rb_plus, $rb_minus = Opal.rb_minus, $rb_divide = Opal.rb_divide, $eqeq = Opal.eqeq, $to_ary = Opal.to_ary, $rb_gt = Opal.rb_gt, $neqeq = Opal.neqeq, $return_val = Opal.return_val, $const_set = Opal.const_set, $alias = Opal.alias, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 19824 19825 Opal.add_stubs('require,real?,===,raise,new,*,cos,sin,attr_reader,freeze,class,==,real,imag,Complex,-@,+,__coerced__,-,nan?,/,conj,abs2,quo,polar,exp,log,>,!=,divmod,**,hypot,atan2,lcm,denominator,finite?,infinite?,numerator,abs,arg,rationalize,to_f,to_i,to_r,inspect,zero?,positive?,Rational,rect,angle'); 19826 19827 self.$require("corelib/numeric"); 19828 self.$require("corelib/complex/base"); 19829 return (function($base, $super, $parent_nesting) { 19830 var self = $klass($base, $super, 'Complex'); 19831 19832 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype; 19833 19834 $proto.real = $proto.imag = nil; 19835 19836 $defs(self, '$rect', function $$rect(real, imag) { 19837 var self = this; 19838 19839 19840 if (imag == null) imag = 0; 19841 if (!((($eqeqeq($$$('Numeric'), real) && ($truthy(real['$real?']()))) && ($eqeqeq($$$('Numeric'), imag))) && ($truthy(imag['$real?']())))) { 19842 $Kernel.$raise($$$('TypeError'), "not a real"); 19843 } return self.$new(real, imag); 19844 }, -2); 19845 $defs(self, '$polar', function $$polar(r, theta) { 19846 var self = this; 19847 19848 19849 if (theta == null) theta = 0; 19850 if (!((($eqeqeq($$$('Numeric'), r) && ($truthy(r['$real?']()))) && ($eqeqeq($$$('Numeric'), theta))) && ($truthy(theta['$real?']())))) { 19851 $Kernel.$raise($$$('TypeError'), "not a real"); 19852 } return self.$new($rb_times(r, $$$('Math').$cos(theta)), $rb_times(r, $$$('Math').$sin(theta))); 19853 }, -2); 19854 self.$attr_reader("real", "imag"); 19855 19856 $def(self, '$initialize', function $$initialize(real, imag) { 19857 var self = this; 19858 19859 19860 if (imag == null) imag = 0; 19861 self.real = real; 19862 self.imag = imag; 19863 return self.$freeze(); 19864 }, -2); 19865 19866 $def(self, '$coerce', function $$coerce(other) { 19867 var self = this; 19868 19869 if ($eqeqeq($$$('Complex'), other)) { 19870 return [other, self] 19871 } else if (($eqeqeq($$$('Numeric'), other) && ($truthy(other['$real?']())))) { 19872 return [$$$('Complex').$new(other, 0), self] 19873 } else { 19874 return $Kernel.$raise($$$('TypeError'), "" + (other.$class()) + " can't be coerced into Complex") 19875 } 19876 }); 19877 19878 $def(self, '$==', function $Complex_$eq_eq$1(other) { 19879 var self = this, $ret_or_1 = nil; 19880 19881 if ($eqeqeq($$$('Complex'), other)) { 19882 if ($truthy(($ret_or_1 = self.real['$=='](other.$real())))) { 19883 return self.imag['$=='](other.$imag()) 19884 } else { 19885 return $ret_or_1 19886 } 19887 } else if (($eqeqeq($$$('Numeric'), other) && ($truthy(other['$real?']())))) { 19888 if ($truthy(($ret_or_1 = self.real['$=='](other)))) { 19889 return self.imag['$=='](0) 19890 } else { 19891 return $ret_or_1 19892 } 19893 } else { 19894 return other['$=='](self) 19895 } 19896 }); 19897 19898 $def(self, '$-@', function $Complex_$minus$$2() { 19899 var self = this; 19900 19901 return $Kernel.$Complex(self.real['$-@'](), self.imag['$-@']()) 19902 }); 19903 19904 $def(self, '$+', function $Complex_$plus$3(other) { 19905 var self = this; 19906 19907 if ($eqeqeq($$$('Complex'), other)) { 19908 return $Kernel.$Complex($rb_plus(self.real, other.$real()), $rb_plus(self.imag, other.$imag())) 19909 } else if (($eqeqeq($$$('Numeric'), other) && ($truthy(other['$real?']())))) { 19910 return $Kernel.$Complex($rb_plus(self.real, other), self.imag) 19911 } else { 19912 return self.$__coerced__("+", other) 19913 } 19914 }); 19915 19916 $def(self, '$-', function $Complex_$minus$4(other) { 19917 var self = this; 19918 19919 if ($eqeqeq($$$('Complex'), other)) { 19920 return $Kernel.$Complex($rb_minus(self.real, other.$real()), $rb_minus(self.imag, other.$imag())) 19921 } else if (($eqeqeq($$$('Numeric'), other) && ($truthy(other['$real?']())))) { 19922 return $Kernel.$Complex($rb_minus(self.real, other), self.imag) 19923 } else { 19924 return self.$__coerced__("-", other) 19925 } 19926 }); 19927 19928 $def(self, '$*', function $Complex_$$5(other) { 19929 var self = this; 19930 19931 if ($eqeqeq($$$('Complex'), other)) { 19932 return $Kernel.$Complex($rb_minus($rb_times(self.real, other.$real()), $rb_times(self.imag, other.$imag())), $rb_plus($rb_times(self.real, other.$imag()), $rb_times(self.imag, other.$real()))) 19933 } else if (($eqeqeq($$$('Numeric'), other) && ($truthy(other['$real?']())))) { 19934 return $Kernel.$Complex($rb_times(self.real, other), $rb_times(self.imag, other)) 19935 } else { 19936 return self.$__coerced__("*", other) 19937 } 19938 }); 19939 19940 $def(self, '$/', function $Complex_$slash$6(other) { 19941 var self = this; 19942 19943 if ($eqeqeq($$$('Complex'), other)) { 19944 if ((((($eqeqeq($$$('Number'), self.real) && ($truthy(self.real['$nan?']()))) || (($eqeqeq($$$('Number'), self.imag) && ($truthy(self.imag['$nan?']()))))) || (($eqeqeq($$$('Number'), other.$real()) && ($truthy(other.$real()['$nan?']()))))) || (($eqeqeq($$$('Number'), other.$imag()) && ($truthy(other.$imag()['$nan?']())))))) { 19945 return $$$('Complex').$new($$$($$$('Float'), 'NAN'), $$$($$$('Float'), 'NAN')) 19946 } else { 19947 return $rb_divide($rb_times(self, other.$conj()), other.$abs2()) 19948 } 19949 } else if (($eqeqeq($$$('Numeric'), other) && ($truthy(other['$real?']())))) { 19950 return $Kernel.$Complex(self.real.$quo(other), self.imag.$quo(other)) 19951 } else { 19952 return self.$__coerced__("/", other) 19953 } 19954 }); 19955 19956 $def(self, '$**', function $Complex_$$$7(other) { 19957 var $a, $b, self = this, r = nil, theta = nil, ore = nil, oim = nil, nr = nil, ntheta = nil, x = nil, z = nil, n = nil, div = nil, mod = nil; 19958 19959 19960 if ($eqeq(other, 0)) { 19961 return $$$('Complex').$new(1, 0) 19962 } if ($eqeqeq($$$('Complex'), other)) { 19963 19964 $b = self.$polar(), $a = $to_ary($b), (r = ($a[0] == null ? nil : $a[0])), (theta = ($a[1] == null ? nil : $a[1])); 19965 ore = other.$real(); 19966 oim = other.$imag(); 19967 nr = $$$('Math').$exp($rb_minus($rb_times(ore, $$$('Math').$log(r)), $rb_times(oim, theta))); 19968 ntheta = $rb_plus($rb_times(theta, ore), $rb_times(oim, $$$('Math').$log(r))); 19969 return $$$('Complex').$polar(nr, ntheta); 19970 } else if ($eqeqeq($$$('Integer'), other)) { 19971 if ($truthy($rb_gt(other, 0))) { 19972 19973 x = self; 19974 z = x; 19975 n = $rb_minus(other, 1); 19976 while ($neqeq(n, 0)) { 19977 19978 $b = n.$divmod(2), $a = $to_ary($b), (div = ($a[0] == null ? nil : $a[0])), (mod = ($a[1] == null ? nil : $a[1])); 19979 while ($eqeq(mod, 0)) { 19980 19981 x = $Kernel.$Complex($rb_minus($rb_times(x.$real(), x.$real()), $rb_times(x.$imag(), x.$imag())), $rb_times($rb_times(2, x.$real()), x.$imag())); 19982 n = div; 19983 $b = n.$divmod(2), $a = $to_ary($b), (div = ($a[0] == null ? nil : $a[0])), (mod = ($a[1] == null ? nil : $a[1])); 19984 } z = $rb_times(z, x); 19985 n = $rb_minus(n, 1); 19986 } return z; 19987 } else { 19988 return $rb_divide($$$('Rational').$new(1, 1), self)['$**'](other['$-@']()) 19989 } 19990 } else if (($eqeqeq($$$('Float'), other) || ($eqeqeq($$$('Rational'), other)))) { 19991 19992 $b = self.$polar(), $a = $to_ary($b), (r = ($a[0] == null ? nil : $a[0])), (theta = ($a[1] == null ? nil : $a[1])); 19993 return $$$('Complex').$polar(r['$**'](other), $rb_times(theta, other)); 19994 } else { 19995 return self.$__coerced__("**", other) 19996 } }); 19997 19998 $def(self, '$abs', function $$abs() { 19999 var self = this; 20000 20001 return $$$('Math').$hypot(self.real, self.imag) 20002 }); 20003 20004 $def(self, '$abs2', function $$abs2() { 20005 var self = this; 20006 20007 return $rb_plus($rb_times(self.real, self.real), $rb_times(self.imag, self.imag)) 20008 }); 20009 20010 $def(self, '$angle', function $$angle() { 20011 var self = this; 20012 20013 return $$$('Math').$atan2(self.imag, self.real) 20014 }); 20015 20016 $def(self, '$conj', function $$conj() { 20017 var self = this; 20018 20019 return $Kernel.$Complex(self.real, self.imag['$-@']()) 20020 }); 20021 20022 $def(self, '$denominator', function $$denominator() { 20023 var self = this; 20024 20025 return self.real.$denominator().$lcm(self.imag.$denominator()) 20026 }); 20027 20028 $def(self, '$eql?', function $Complex_eql$ques$8(other) { 20029 var self = this, $ret_or_1 = nil, $ret_or_2 = nil; 20030 20031 if ($truthy(($ret_or_1 = ($truthy(($ret_or_2 = $$('Complex')['$==='](other))) ? (self.real.$class()['$=='](self.imag.$class())) : ($ret_or_2))))) { 20032 return self['$=='](other) 20033 } else { 20034 return $ret_or_1 20035 } 20036 }); 20037 20038 $def(self, '$fdiv', function $$fdiv(other) { 20039 var self = this; 20040 20041 20042 if (!$eqeqeq($$$('Numeric'), other)) { 20043 $Kernel.$raise($$$('TypeError'), "" + (other.$class()) + " can't be coerced into Complex"); 20044 } return $rb_divide(self, other); 20045 }); 20046 20047 $def(self, '$finite?', function $Complex_finite$ques$9() { 20048 var self = this, $ret_or_1 = nil; 20049 20050 if ($truthy(($ret_or_1 = self.real['$finite?']()))) { 20051 return self.imag['$finite?']() 20052 } else { 20053 return $ret_or_1 20054 } 20055 }); 20056 20057 $def(self, '$hash', function $$hash() { 20058 var self = this; 20059 20060 return "Complex:" + (self.real) + ":" + (self.imag) 20061 }); 20062 20063 $def(self, '$infinite?', function $Complex_infinite$ques$10() { 20064 var self = this, $ret_or_1 = nil; 20065 20066 if ($truthy(($ret_or_1 = self.real['$infinite?']()))) { 20067 return $ret_or_1 20068 } else { 20069 return self.imag['$infinite?']() 20070 } 20071 }); 20072 20073 $def(self, '$inspect', function $$inspect() { 20074 var self = this; 20075 20076 return "(" + (self) + ")" 20077 }); 20078 20079 $def(self, '$numerator', function $$numerator() { 20080 var self = this, d = nil; 20081 20082 20083 d = self.$denominator(); 20084 return $Kernel.$Complex($rb_times(self.real.$numerator(), $rb_divide(d, self.real.$denominator())), $rb_times(self.imag.$numerator(), $rb_divide(d, self.imag.$denominator()))); 20085 }); 20086 20087 $def(self, '$polar', function $$polar() { 20088 var self = this; 20089 20090 return [self.$abs(), self.$arg()] 20091 }); 20092 20093 $def(self, '$rationalize', function $$rationalize(eps) { 20094 var self = this; 20095 20096 if (arguments.length > 1) { 20097 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (arguments.length) + " for 0..1)"); 20098 } 20099 if ($neqeq(self.imag, 0)) { 20100 $Kernel.$raise($$$('RangeError'), "can't convert " + (self) + " into Rational"); 20101 } return self.$real().$rationalize(eps); 20102 }, -1); 20103 20104 $def(self, '$real?', $return_val(false)); 20105 20106 $def(self, '$rect', function $$rect() { 20107 var self = this; 20108 20109 return [self.real, self.imag] 20110 }); 20111 20112 $def(self, '$to_f', function $$to_f() { 20113 var self = this; 20114 20115 20116 if (!$eqeq(self.imag, 0)) { 20117 $Kernel.$raise($$$('RangeError'), "can't convert " + (self) + " into Float"); 20118 } return self.real.$to_f(); 20119 }); 20120 20121 $def(self, '$to_i', function $$to_i() { 20122 var self = this; 20123 20124 20125 if (!$eqeq(self.imag, 0)) { 20126 $Kernel.$raise($$$('RangeError'), "can't convert " + (self) + " into Integer"); 20127 } return self.real.$to_i(); 20128 }); 20129 20130 $def(self, '$to_r', function $$to_r() { 20131 var self = this; 20132 20133 20134 if (!$eqeq(self.imag, 0)) { 20135 $Kernel.$raise($$$('RangeError'), "can't convert " + (self) + " into Rational"); 20136 } return self.real.$to_r(); 20137 }); 20138 20139 $def(self, '$to_s', function $$to_s() { 20140 var self = this, result = nil; 20141 20142 20143 result = self.real.$inspect(); 20144 result = $rb_plus(result, (((($eqeqeq($$$('Number'), self.imag) && ($truthy(self.imag['$nan?']()))) || ($truthy(self.imag['$positive?']()))) || ($truthy(self.imag['$zero?']()))) ? ("+") : ("-"))); 20145 result = $rb_plus(result, self.imag.$abs().$inspect()); 20146 if (($eqeqeq($$$('Number'), self.imag) && (($truthy(self.imag['$nan?']()) || ($truthy(self.imag['$infinite?']())))))) { 20147 result = $rb_plus(result, "*"); 20148 } return $rb_plus(result, "i"); 20149 }); 20150 $const_set($nesting[0], 'I', self.$new(0, 1)); 20151 $defs(self, '$from_string', function $$from_string(str) { 20152 20153 20154 var re = /[+-]?[\d_]+(\.[\d_]+)?(e\d+)?/; 20155 str.match(re); 20156 var real, imag; 20157 20158 function isFloat() { 20159 return re.test(str); 20160 } 20161 20162 function cutFloat() { 20163 var match = str.match(re); 20164 var number = match[0]; 20165 str = str.slice(number.length); 20166 return number.replace(/_/g, ''); 20167 } 20168 20169 // handles both floats and rationals 20170 function cutNumber() { 20171 if (isFloat()) { 20172 var numerator = parseFloat(cutFloat()); 20173 20174 if (str[0] === '/') { 20175 // rational real part 20176 str = str.slice(1); 20177 20178 if (isFloat()) { 20179 var denominator = parseFloat(cutFloat()); 20180 return $Kernel.$Rational(numerator, denominator); 20181 } else { 20182 // reverting '/' 20183 str = '/' + str; 20184 return numerator; 20185 } 20186 } else { 20187 // float real part, no denominator 20188 return numerator; 20189 } 20190 } else { 20191 return null; 20192 } 20193 } 20194 20195 real = cutNumber(); 20196 20197 if (!real) { 20198 if (str[0] === 'i') { 20199 // i => Complex(0, 1) 20200 return $Kernel.$Complex(0, 1); 20201 } 20202 if (str[0] === '-' && str[1] === 'i') { 20203 // -i => Complex(0, -1) 20204 return $Kernel.$Complex(0, -1); 20205 } 20206 if (str[0] === '+' && str[1] === 'i') { 20207 // +i => Complex(0, 1) 20208 return $Kernel.$Complex(0, 1); 20209 } 20210 // anything => Complex(0, 0) 20211 return $Kernel.$Complex(0, 0); 20212 } 20213 20214 imag = cutNumber(); 20215 if (!imag) { 20216 if (str[0] === 'i') { 20217 // 3i => Complex(0, 3) 20218 return $Kernel.$Complex(0, real); 20219 } else { 20220 // 3 => Complex(3, 0) 20221 return $Kernel.$Complex(real, 0); 20222 } 20223 } else { 20224 // 3+2i => Complex(3, 2) 20225 return $Kernel.$Complex(real, imag); 20226 } 20227 20228 }); 20229 (function(self, $parent_nesting) { 20230 20231 return $alias(self, "rectangular", "rect") 20232 })(Opal.get_singleton_class(self)); 20233 $alias(self, "arg", "angle"); 20234 $alias(self, "conjugate", "conj"); 20235 $alias(self, "divide", "/"); 20236 $alias(self, "imaginary", "imag"); 20237 $alias(self, "magnitude", "abs"); 20238 $alias(self, "phase", "arg"); 20239 $alias(self, "quo", "/"); 20240 $alias(self, "rectangular", "rect"); 20241 20242 Opal.udef(self, '$' + "negative?"); 20243 Opal.udef(self, '$' + "positive?"); 20244 20245 Opal.udef(self, '$' + "step"); return nil; })('::', $$$('Numeric'), $nesting); 20246}; 20247 20248Opal.modules["corelib/rational/base"] = function(Opal) {/* Generated by Opal 1.7.3 */ 20249 var $module = Opal.module, $def = Opal.def, $klass = Opal.klass; Opal.nil; var $$$ = Opal.$$$; 20250 20251 Opal.add_stubs('convert,from_string'); 20252 20253 (function($base) { 20254 var self = $module($base, 'Kernel'); 20255 20256 20257 return $def(self, '$Rational', function $$Rational(numerator, denominator) { 20258 20259 20260 if (denominator == null) denominator = 1; 20261 return $$$('Rational').$convert(numerator, denominator); 20262 }, -2) 20263 })('::'); 20264 return (function($base, $super) { 20265 var self = $klass($base, $super, 'String'); 20266 20267 20268 return $def(self, '$to_r', function $$to_r() { 20269 var self = this; 20270 20271 return $$$('Rational').$from_string(self) 20272 }) 20273 })('::', null); 20274}; 20275 20276Opal.modules["corelib/rational"] = function(Opal) {/* Generated by Opal 1.7.3 */ 20277 var $klass = Opal.klass, $eqeq = Opal.eqeq, $Kernel = Opal.Kernel, $truthy = Opal.truthy, $rb_lt = Opal.rb_lt, $rb_divide = Opal.rb_divide, $defs = Opal.defs, $eqeqeq = Opal.eqeqeq, $not = Opal.not, $Opal = Opal.Opal, $def = Opal.def, $return_ivar = Opal.return_ivar, $rb_minus = Opal.rb_minus, $rb_times = Opal.rb_times, $rb_plus = Opal.rb_plus, $rb_gt = Opal.rb_gt, $rb_le = Opal.rb_le, $return_self = Opal.return_self, $alias = Opal.alias, self = Opal.top, nil = Opal.nil, $$$ = Opal.$$$; 20278 20279 Opal.add_stubs('require,to_i,==,raise,<,-@,new,gcd,/,nil?,===,reduce,to_r,!,equal?,coerce_to!,freeze,to_f,numerator,denominator,<=>,-,*,__coerced__,+,Rational,>,**,abs,ceil,with_precision,floor,<=,truncate,send'); 20280 20281 self.$require("corelib/numeric"); 20282 self.$require("corelib/rational/base"); 20283 return (function($base, $super) { 20284 var self = $klass($base, $super, 'Rational'); 20285 20286 var $proto = self.$$prototype; 20287 20288 $proto.num = $proto.den = nil; 20289 20290 $defs(self, '$reduce', function $$reduce(num, den) { 20291 var self = this, gcd = nil; 20292 20293 20294 num = num.$to_i(); 20295 den = den.$to_i(); 20296 if ($eqeq(den, 0)) { 20297 $Kernel.$raise($$$('ZeroDivisionError'), "divided by 0"); 20298 } else if ($truthy($rb_lt(den, 0))) { 20299 20300 num = num['$-@'](); 20301 den = den['$-@'](); 20302 } else if ($eqeq(den, 1)) { 20303 return self.$new(num, den) 20304 } gcd = num.$gcd(den); 20305 return self.$new($rb_divide(num, gcd), $rb_divide(den, gcd)); 20306 }); 20307 $defs(self, '$convert', function $$convert(num, den) { 20308 var self = this; 20309 20310 20311 if (($truthy(num['$nil?']()) || ($truthy(den['$nil?']())))) { 20312 $Kernel.$raise($$$('TypeError'), "cannot convert nil into Rational"); 20313 } if (($eqeqeq($$$('Integer'), num) && ($eqeqeq($$$('Integer'), den)))) { 20314 return self.$reduce(num, den) 20315 } if ((($eqeqeq($$$('Float'), num) || ($eqeqeq($$$('String'), num))) || ($eqeqeq($$$('Complex'), num)))) { 20316 num = num.$to_r(); 20317 } if ((($eqeqeq($$$('Float'), den) || ($eqeqeq($$$('String'), den))) || ($eqeqeq($$$('Complex'), den)))) { 20318 den = den.$to_r(); 20319 } if (($truthy(den['$equal?'](1)) && ($not($$$('Integer')['$==='](num))))) { 20320 return $Opal['$coerce_to!'](num, $$$('Rational'), "to_r") 20321 } else if (($eqeqeq($$$('Numeric'), num) && ($eqeqeq($$$('Numeric'), den)))) { 20322 return $rb_divide(num, den) 20323 } else { 20324 return self.$reduce(num, den) 20325 } }); 20326 20327 $def(self, '$initialize', function $$initialize(num, den) { 20328 var self = this; 20329 20330 20331 self.num = num; 20332 self.den = den; 20333 return self.$freeze(); 20334 }); 20335 20336 $def(self, '$numerator', $return_ivar("num")); 20337 20338 $def(self, '$denominator', $return_ivar("den")); 20339 20340 $def(self, '$coerce', function $$coerce(other) { 20341 var self = this, $ret_or_1 = nil; 20342 20343 if ($eqeqeq($$$('Rational'), ($ret_or_1 = other))) { 20344 return [other, self] 20345 } else if ($eqeqeq($$$('Integer'), $ret_or_1)) { 20346 return [other.$to_r(), self] 20347 } else if ($eqeqeq($$$('Float'), $ret_or_1)) { 20348 return [other, self.$to_f()] 20349 } else { 20350 return nil 20351 } 20352 }); 20353 20354 $def(self, '$==', function $Rational_$eq_eq$1(other) { 20355 var self = this, $ret_or_1 = nil, $ret_or_2 = nil; 20356 20357 if ($eqeqeq($$$('Rational'), ($ret_or_1 = other))) { 20358 if ($truthy(($ret_or_2 = self.num['$=='](other.$numerator())))) { 20359 return self.den['$=='](other.$denominator()) 20360 } else { 20361 return $ret_or_2 20362 } 20363 } else if ($eqeqeq($$$('Integer'), $ret_or_1)) { 20364 if ($truthy(($ret_or_2 = self.num['$=='](other)))) { 20365 return self.den['$=='](1) 20366 } else { 20367 return $ret_or_2 20368 } 20369 } else if ($eqeqeq($$$('Float'), $ret_or_1)) { 20370 return self.$to_f()['$=='](other) 20371 } else { 20372 return other['$=='](self) 20373 } 20374 }); 20375 20376 $def(self, '$<=>', function $Rational_$lt_eq_gt$2(other) { 20377 var self = this, $ret_or_1 = nil; 20378 20379 if ($eqeqeq($$$('Rational'), ($ret_or_1 = other))) { 20380 return $rb_minus($rb_times(self.num, other.$denominator()), $rb_times(self.den, other.$numerator()))['$<=>'](0) 20381 } else if ($eqeqeq($$$('Integer'), $ret_or_1)) { 20382 return $rb_minus(self.num, $rb_times(self.den, other))['$<=>'](0) 20383 } else if ($eqeqeq($$$('Float'), $ret_or_1)) { 20384 return self.$to_f()['$<=>'](other) 20385 } else { 20386 return self.$__coerced__("<=>", other) 20387 } 20388 }); 20389 20390 $def(self, '$+', function $Rational_$plus$3(other) { 20391 var self = this, $ret_or_1 = nil, num = nil, den = nil; 20392 20393 if ($eqeqeq($$$('Rational'), ($ret_or_1 = other))) { 20394 20395 num = $rb_plus($rb_times(self.num, other.$denominator()), $rb_times(self.den, other.$numerator())); 20396 den = $rb_times(self.den, other.$denominator()); 20397 return $Kernel.$Rational(num, den); 20398 } else if ($eqeqeq($$$('Integer'), $ret_or_1)) { 20399 return $Kernel.$Rational($rb_plus(self.num, $rb_times(other, self.den)), self.den) 20400 } else if ($eqeqeq($$$('Float'), $ret_or_1)) { 20401 return $rb_plus(self.$to_f(), other) 20402 } else { 20403 return self.$__coerced__("+", other) 20404 } 20405 }); 20406 20407 $def(self, '$-', function $Rational_$minus$4(other) { 20408 var self = this, $ret_or_1 = nil, num = nil, den = nil; 20409 20410 if ($eqeqeq($$$('Rational'), ($ret_or_1 = other))) { 20411 20412 num = $rb_minus($rb_times(self.num, other.$denominator()), $rb_times(self.den, other.$numerator())); 20413 den = $rb_times(self.den, other.$denominator()); 20414 return $Kernel.$Rational(num, den); 20415 } else if ($eqeqeq($$$('Integer'), $ret_or_1)) { 20416 return $Kernel.$Rational($rb_minus(self.num, $rb_times(other, self.den)), self.den) 20417 } else if ($eqeqeq($$$('Float'), $ret_or_1)) { 20418 return $rb_minus(self.$to_f(), other) 20419 } else { 20420 return self.$__coerced__("-", other) 20421 } 20422 }); 20423 20424 $def(self, '$*', function $Rational_$$5(other) { 20425 var self = this, $ret_or_1 = nil, num = nil, den = nil; 20426 20427 if ($eqeqeq($$$('Rational'), ($ret_or_1 = other))) { 20428 20429 num = $rb_times(self.num, other.$numerator()); 20430 den = $rb_times(self.den, other.$denominator()); 20431 return $Kernel.$Rational(num, den); 20432 } else if ($eqeqeq($$$('Integer'), $ret_or_1)) { 20433 return $Kernel.$Rational($rb_times(self.num, other), self.den) 20434 } else if ($eqeqeq($$$('Float'), $ret_or_1)) { 20435 return $rb_times(self.$to_f(), other) 20436 } else { 20437 return self.$__coerced__("*", other) 20438 } 20439 }); 20440 20441 $def(self, '$/', function $Rational_$slash$6(other) { 20442 var self = this, $ret_or_1 = nil, num = nil, den = nil; 20443 20444 if ($eqeqeq($$$('Rational'), ($ret_or_1 = other))) { 20445 20446 num = $rb_times(self.num, other.$denominator()); 20447 den = $rb_times(self.den, other.$numerator()); 20448 return $Kernel.$Rational(num, den); 20449 } else if ($eqeqeq($$$('Integer'), $ret_or_1)) { 20450 if ($eqeq(other, 0)) { 20451 return $rb_divide(self.$to_f(), 0.0) 20452 } else { 20453 return $Kernel.$Rational(self.num, $rb_times(self.den, other)) 20454 } 20455 } else if ($eqeqeq($$$('Float'), $ret_or_1)) { 20456 return $rb_divide(self.$to_f(), other) 20457 } else { 20458 return self.$__coerced__("/", other) 20459 } 20460 }); 20461 20462 $def(self, '$**', function $Rational_$$$7(other) { 20463 var self = this, $ret_or_1 = nil; 20464 20465 if ($eqeqeq($$$('Integer'), ($ret_or_1 = other))) { 20466 if (($eqeq(self, 0) && ($truthy($rb_lt(other, 0))))) { 20467 return $$$($$$('Float'), 'INFINITY') 20468 } else if ($truthy($rb_gt(other, 0))) { 20469 return $Kernel.$Rational(self.num['$**'](other), self.den['$**'](other)) 20470 } else if ($truthy($rb_lt(other, 0))) { 20471 return $Kernel.$Rational(self.den['$**'](other['$-@']()), self.num['$**'](other['$-@']())) 20472 } else { 20473 return $Kernel.$Rational(1, 1) 20474 } 20475 } else if ($eqeqeq($$$('Float'), $ret_or_1)) { 20476 return self.$to_f()['$**'](other) 20477 } else if ($eqeqeq($$$('Rational'), $ret_or_1)) { 20478 if ($eqeq(other, 0)) { 20479 return $Kernel.$Rational(1, 1) 20480 } else if ($eqeq(other.$denominator(), 1)) { 20481 if ($truthy($rb_lt(other, 0))) { 20482 return $Kernel.$Rational(self.den['$**'](other.$numerator().$abs()), self.num['$**'](other.$numerator().$abs())) 20483 } else { 20484 return $Kernel.$Rational(self.num['$**'](other.$numerator()), self.den['$**'](other.$numerator())) 20485 } 20486 } else if (($eqeq(self, 0) && ($truthy($rb_lt(other, 0))))) { 20487 return $Kernel.$raise($$$('ZeroDivisionError'), "divided by 0") 20488 } else { 20489 return self.$to_f()['$**'](other) 20490 } 20491 } else { 20492 return self.$__coerced__("**", other) 20493 } 20494 }); 20495 20496 $def(self, '$abs', function $$abs() { 20497 var self = this; 20498 20499 return $Kernel.$Rational(self.num.$abs(), self.den.$abs()) 20500 }); 20501 20502 $def(self, '$ceil', function $$ceil(precision) { 20503 var self = this; 20504 20505 20506 if (precision == null) precision = 0; 20507 if ($eqeq(precision, 0)) { 20508 return $rb_divide(self.num['$-@'](), self.den)['$-@']().$ceil() 20509 } else { 20510 return self.$with_precision("ceil", precision) 20511 } }, -1); 20512 20513 $def(self, '$floor', function $$floor(precision) { 20514 var self = this; 20515 20516 20517 if (precision == null) precision = 0; 20518 if ($eqeq(precision, 0)) { 20519 return $rb_divide(self.num['$-@'](), self.den)['$-@']().$floor() 20520 } else { 20521 return self.$with_precision("floor", precision) 20522 } }, -1); 20523 20524 $def(self, '$hash', function $$hash() { 20525 var self = this; 20526 20527 return "Rational:" + (self.num) + ":" + (self.den) 20528 }); 20529 20530 $def(self, '$inspect', function $$inspect() { 20531 var self = this; 20532 20533 return "(" + (self) + ")" 20534 }); 20535 20536 $def(self, '$rationalize', function $$rationalize(eps) { 20537 var self = this; 20538 20539 if (arguments.length > 1) { 20540 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (arguments.length) + " for 0..1)"); 20541 } 20542 20543 if (eps == null) { 20544 return self; 20545 } 20546 20547 var e = eps.$abs(), 20548 a = $rb_minus(self, e), 20549 b = $rb_plus(self, e); 20550 20551 var p0 = 0, 20552 p1 = 1, 20553 q0 = 1, 20554 q1 = 0, 20555 p2, q2; 20556 20557 var c, k, t; 20558 20559 while (true) { 20560 c = (a).$ceil(); 20561 20562 if ($rb_le(c, b)) { 20563 break; 20564 } 20565 20566 k = c - 1; 20567 p2 = k * p1 + p0; 20568 q2 = k * q1 + q0; 20569 t = $rb_divide(1, $rb_minus(b, k)); 20570 b = $rb_divide(1, $rb_minus(a, k)); 20571 a = t; 20572 20573 p0 = p1; 20574 q0 = q1; 20575 p1 = p2; 20576 q1 = q2; 20577 } 20578 20579 return $Kernel.$Rational(c * p1 + p0, c * q1 + q0); 20580 }, -1); 20581 20582 $def(self, '$round', function $$round(precision) { 20583 var self = this, num = nil, den = nil, approx = nil; 20584 20585 20586 if (precision == null) precision = 0; 20587 if (!$eqeq(precision, 0)) { 20588 return self.$with_precision("round", precision) 20589 } if ($eqeq(self.num, 0)) { 20590 return 0 20591 } if ($eqeq(self.den, 1)) { 20592 return self.num 20593 } num = $rb_plus($rb_times(self.num.$abs(), 2), self.den); 20594 den = $rb_times(self.den, 2); 20595 approx = $rb_divide(num, den).$truncate(); 20596 if ($truthy($rb_lt(self.num, 0))) { 20597 return approx['$-@']() 20598 } else { 20599 return approx 20600 } }, -1); 20601 20602 $def(self, '$to_f', function $$to_f() { 20603 var self = this; 20604 20605 return $rb_divide(self.num, self.den) 20606 }); 20607 20608 $def(self, '$to_i', function $$to_i() { 20609 var self = this; 20610 20611 return self.$truncate() 20612 }); 20613 20614 $def(self, '$to_r', $return_self); 20615 20616 $def(self, '$to_s', function $$to_s() { 20617 var self = this; 20618 20619 return "" + (self.num) + "/" + (self.den) 20620 }); 20621 20622 $def(self, '$truncate', function $$truncate(precision) { 20623 var self = this; 20624 20625 20626 if (precision == null) precision = 0; 20627 if ($eqeq(precision, 0)) { 20628 if ($truthy($rb_lt(self.num, 0))) { 20629 return self.$ceil() 20630 } else { 20631 return self.$floor() 20632 } 20633 } else { 20634 return self.$with_precision("truncate", precision) 20635 } }, -1); 20636 20637 $def(self, '$with_precision', function $$with_precision(method, precision) { 20638 var self = this, p = nil, s = nil; 20639 20640 20641 if (!$eqeqeq($$$('Integer'), precision)) { 20642 $Kernel.$raise($$$('TypeError'), "not an Integer"); 20643 } p = (10)['$**'](precision); 20644 s = $rb_times(self, p); 20645 if ($truthy($rb_lt(precision, 1))) { 20646 return $rb_divide(s.$send(method), p).$to_i() 20647 } else { 20648 return $Kernel.$Rational(s.$send(method), p) 20649 } }); 20650 $defs(self, '$from_string', function $$from_string(string) { 20651 20652 20653 var str = string.trimLeft(), 20654 re = /^[+-]?[\d_]+(\.[\d_]+)?/; 20655 str.match(re); 20656 var numerator, denominator; 20657 20658 function isFloat() { 20659 return re.test(str); 20660 } 20661 20662 function cutFloat() { 20663 var match = str.match(re); 20664 var number = match[0]; 20665 str = str.slice(number.length); 20666 return number.replace(/_/g, ''); 20667 } 20668 20669 if (isFloat()) { 20670 numerator = parseFloat(cutFloat()); 20671 20672 if (str[0] === '/') { 20673 // rational real part 20674 str = str.slice(1); 20675 20676 if (isFloat()) { 20677 denominator = parseFloat(cutFloat()); 20678 return $Kernel.$Rational(numerator, denominator); 20679 } else { 20680 return $Kernel.$Rational(numerator, 1); 20681 } 20682 } else { 20683 return $Kernel.$Rational(numerator, 1); 20684 } 20685 } else { 20686 return $Kernel.$Rational(0, 1); 20687 } 20688 20689 }); 20690 $alias(self, "divide", "/"); 20691 return $alias(self, "quo", "/"); 20692 })('::', $$$('Numeric')); 20693}; 20694 20695Opal.modules["corelib/time"] = function(Opal) {/* Generated by Opal 1.7.3 */ 20696 var $slice = Opal.slice, $deny_frozen_access = Opal.deny_frozen_access, $klass = Opal.klass, $Kernel = Opal.Kernel, $Opal = Opal.Opal, $defs = Opal.defs, $eqeqeq = Opal.eqeqeq, $def = Opal.def, $truthy = Opal.truthy, $rb_gt = Opal.rb_gt, $rb_lt = Opal.rb_lt, $send = Opal.send, $rb_plus = Opal.rb_plus, $rb_divide = Opal.rb_divide, $rb_minus = Opal.rb_minus, $range = Opal.range, $neqeq = Opal.neqeq, $rb_le = Opal.rb_le, $eqeq = Opal.eqeq, $alias = Opal.alias, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 20697 20698 Opal.add_stubs('require,include,===,raise,coerce_to!,respond_to?,to_str,to_i,_parse_offset,new,<=>,to_f,nil?,>,<,strftime,each,define_method,year,month,day,+,round,/,-,copy_instance_variables,initialize_dup,is_a?,zero?,wday,utc?,mon,yday,hour,min,sec,rjust,ljust,zone,to_s,[],cweek_cyear,jd,to_date,format,isdst,!=,<=,==,ceil,local,gm,asctime,getgm,gmt_offset,inspect,usec,gmtime,gmt?'); 20699 20700 self.$require("corelib/comparable"); 20701 return (function($base, $super, $parent_nesting) { 20702 var self = $klass($base, $super, 'Time'); 20703 20704 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 20705 20706 20707 self.$include($$$('Comparable')); 20708 20709 var days_of_week = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], 20710 short_days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], 20711 short_months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], 20712 long_months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; 20713 $defs(self, '$at', function $$at(seconds, frac) { 20714 20715 var result; 20716 20717 if ($$$('Time')['$==='](seconds)) { 20718 if (frac !== undefined) { 20719 $Kernel.$raise($$$('TypeError'), "can't convert Time into an exact number"); 20720 } 20721 result = new Date(seconds.getTime()); 20722 result.timezone = seconds.timezone; 20723 return result; 20724 } 20725 20726 if (!seconds.$$is_number) { 20727 seconds = $Opal['$coerce_to!'](seconds, $$$('Integer'), "to_int"); 20728 } 20729 20730 if (frac === undefined) { 20731 return new Date(seconds * 1000); 20732 } 20733 20734 if (!frac.$$is_number) { 20735 frac = $Opal['$coerce_to!'](frac, $$$('Integer'), "to_int"); 20736 } 20737 20738 return new Date(seconds * 1000 + (frac / 1000)); 20739 }, -2); 20740 20741 function time_params(year, month, day, hour, min, sec) { 20742 if (year.$$is_string) { 20743 year = parseInt(year, 10); 20744 } else { 20745 year = $Opal['$coerce_to!'](year, $$$('Integer'), "to_int"); 20746 } 20747 20748 if (month === nil) { 20749 month = 1; 20750 } else if (!month.$$is_number) { 20751 if ((month)['$respond_to?']("to_str")) { 20752 month = (month).$to_str(); 20753 switch (month.toLowerCase()) { 20754 case 'jan': month = 1; break; 20755 case 'feb': month = 2; break; 20756 case 'mar': month = 3; break; 20757 case 'apr': month = 4; break; 20758 case 'may': month = 5; break; 20759 case 'jun': month = 6; break; 20760 case 'jul': month = 7; break; 20761 case 'aug': month = 8; break; 20762 case 'sep': month = 9; break; 20763 case 'oct': month = 10; break; 20764 case 'nov': month = 11; break; 20765 case 'dec': month = 12; break; 20766 default: month = (month).$to_i(); 20767 } 20768 } else { 20769 month = $Opal['$coerce_to!'](month, $$$('Integer'), "to_int"); 20770 } 20771 } 20772 20773 if (month < 1 || month > 12) { 20774 $Kernel.$raise($$$('ArgumentError'), "month out of range: " + (month)); 20775 } 20776 month = month - 1; 20777 20778 if (day === nil) { 20779 day = 1; 20780 } else if (day.$$is_string) { 20781 day = parseInt(day, 10); 20782 } else { 20783 day = $Opal['$coerce_to!'](day, $$$('Integer'), "to_int"); 20784 } 20785 20786 if (day < 1 || day > 31) { 20787 $Kernel.$raise($$$('ArgumentError'), "day out of range: " + (day)); 20788 } 20789 20790 if (hour === nil) { 20791 hour = 0; 20792 } else if (hour.$$is_string) { 20793 hour = parseInt(hour, 10); 20794 } else { 20795 hour = $Opal['$coerce_to!'](hour, $$$('Integer'), "to_int"); 20796 } 20797 20798 if (hour < 0 || hour > 24) { 20799 $Kernel.$raise($$$('ArgumentError'), "hour out of range: " + (hour)); 20800 } 20801 20802 if (min === nil) { 20803 min = 0; 20804 } else if (min.$$is_string) { 20805 min = parseInt(min, 10); 20806 } else { 20807 min = $Opal['$coerce_to!'](min, $$$('Integer'), "to_int"); 20808 } 20809 20810 if (min < 0 || min > 59) { 20811 $Kernel.$raise($$$('ArgumentError'), "min out of range: " + (min)); 20812 } 20813 20814 if (sec === nil) { 20815 sec = 0; 20816 } else if (!sec.$$is_number) { 20817 if (sec.$$is_string) { 20818 sec = parseInt(sec, 10); 20819 } else { 20820 sec = $Opal['$coerce_to!'](sec, $$$('Integer'), "to_int"); 20821 } 20822 } 20823 20824 if (sec < 0 || sec > 60) { 20825 $Kernel.$raise($$$('ArgumentError'), "sec out of range: " + (sec)); 20826 } 20827 20828 return [year, month, day, hour, min, sec]; 20829 } 20830 $defs(self, '$new', function $Time_new$1(year, month, day, hour, min, sec, utc_offset) { 20831 var self = this; 20832 if (month == null) month = nil; 20833 if (day == null) day = nil; 20834 if (hour == null) hour = nil; 20835 if (min == null) min = nil; 20836 if (sec == null) sec = nil; 20837 if (utc_offset == null) utc_offset = nil; 20838 20839 var args, result, timezone, utc_date; 20840 20841 if (year === undefined) { 20842 return new Date(); 20843 } 20844 20845 args = time_params(year, month, day, hour, min, sec); 20846 year = args[0]; 20847 month = args[1]; 20848 day = args[2]; 20849 hour = args[3]; 20850 min = args[4]; 20851 sec = args[5]; 20852 20853 if (utc_offset === nil) { 20854 result = new Date(year, month, day, hour, min, 0, sec * 1000); 20855 if (year < 100) { 20856 result.setFullYear(year); 20857 } 20858 return result; 20859 } 20860 20861 timezone = self.$_parse_offset(utc_offset); 20862 utc_date = new Date(Date.UTC(year, month, day, hour, min, 0, sec * 1000)); 20863 if (year < 100) { 20864 utc_date.setUTCFullYear(year); 20865 } 20866 20867 result = new Date(utc_date.getTime() - timezone * 3600000); 20868 result.timezone = timezone; 20869 20870 return result; 20871 }, -1); 20872 $defs(self, '$_parse_offset', function $$_parse_offset(utc_offset) { 20873 20874 20875 var timezone; 20876 if (utc_offset.$$is_string) { 20877 if (utc_offset == 'UTC') { 20878 timezone = 0; 20879 } 20880 else if(/^[+-]\d\d:[0-5]\d$/.test(utc_offset)) { 20881 var sign, hours, minutes; 20882 sign = utc_offset[0]; 20883 hours = +(utc_offset[1] + utc_offset[2]); 20884 minutes = +(utc_offset[4] + utc_offset[5]); 20885 20886 timezone = (sign == '-' ? -1 : 1) * (hours + minutes / 60); 20887 } 20888 else { 20889 // Unsupported: "A".."I","K".."Z" 20890 $Kernel.$raise($$$('ArgumentError'), "\"+HH:MM\", \"-HH:MM\", \"UTC\" expected for utc_offset: " + (utc_offset)); 20891 } 20892 } 20893 else if (utc_offset.$$is_number) { 20894 timezone = utc_offset / 3600; 20895 } 20896 else { 20897 $Kernel.$raise($$$('ArgumentError'), "Opal doesn't support other types for a timezone argument than Integer and String"); 20898 } 20899 return timezone; 20900 20901 }); 20902 $defs(self, '$local', function $$local(year, month, day, hour, min, sec, millisecond, _dummy1, _dummy2, _dummy3) { 20903 20904 20905 if (month == null) month = nil; 20906 if (day == null) day = nil; 20907 if (hour == null) hour = nil; 20908 if (min == null) min = nil; 20909 if (sec == null) sec = nil; 20910 if (millisecond == null) millisecond = nil; 20911 if (_dummy1 == null) _dummy1 = nil; 20912 if (_dummy2 == null) _dummy2 = nil; 20913 if (_dummy3 == null) _dummy3 = nil; 20914 20915 var args, result; 20916 20917 if (arguments.length === 10) { 20918 args = $slice(arguments); 20919 year = args[5]; 20920 month = args[4]; 20921 day = args[3]; 20922 hour = args[2]; 20923 min = args[1]; 20924 sec = args[0]; 20925 } 20926 20927 args = time_params(year, month, day, hour, min, sec); 20928 year = args[0]; 20929 month = args[1]; 20930 day = args[2]; 20931 hour = args[3]; 20932 min = args[4]; 20933 sec = args[5]; 20934 20935 result = new Date(year, month, day, hour, min, 0, sec * 1000); 20936 if (year < 100) { 20937 result.setFullYear(year); 20938 } 20939 return result; 20940 }, -2); 20941 $defs(self, '$gm', function $$gm(year, month, day, hour, min, sec, millisecond, _dummy1, _dummy2, _dummy3) { 20942 20943 20944 if (month == null) month = nil; 20945 if (day == null) day = nil; 20946 if (hour == null) hour = nil; 20947 if (min == null) min = nil; 20948 if (sec == null) sec = nil; 20949 if (millisecond == null) millisecond = nil; 20950 if (_dummy1 == null) _dummy1 = nil; 20951 if (_dummy2 == null) _dummy2 = nil; 20952 if (_dummy3 == null) _dummy3 = nil; 20953 20954 var args, result; 20955 20956 if (arguments.length === 10) { 20957 args = $slice(arguments); 20958 year = args[5]; 20959 month = args[4]; 20960 day = args[3]; 20961 hour = args[2]; 20962 min = args[1]; 20963 sec = args[0]; 20964 } 20965 20966 args = time_params(year, month, day, hour, min, sec); 20967 year = args[0]; 20968 month = args[1]; 20969 day = args[2]; 20970 hour = args[3]; 20971 min = args[4]; 20972 sec = args[5]; 20973 20974 result = new Date(Date.UTC(year, month, day, hour, min, 0, sec * 1000)); 20975 if (year < 100) { 20976 result.setUTCFullYear(year); 20977 } 20978 result.timezone = 0; 20979 return result; 20980 }, -2); 20981 $defs(self, '$now', function $$now() { 20982 var self = this; 20983 20984 return self.$new() 20985 }); 20986 20987 $def(self, '$+', function $Time_$plus$2(other) { 20988 var self = this; 20989 20990 20991 if ($eqeqeq($$$('Time'), other)) { 20992 $Kernel.$raise($$$('TypeError'), "time + time?"); 20993 } 20994 if (!other.$$is_number) { 20995 other = $Opal['$coerce_to!'](other, $$$('Integer'), "to_int"); 20996 } 20997 var result = new Date(self.getTime() + (other * 1000)); 20998 result.timezone = self.timezone; 20999 return result; 21000 }); 21001 21002 $def(self, '$-', function $Time_$minus$3(other) { 21003 var self = this; 21004 21005 21006 if ($eqeqeq($$$('Time'), other)) { 21007 return (self.getTime() - other.getTime()) / 1000 21008 } 21009 if (!other.$$is_number) { 21010 other = $Opal['$coerce_to!'](other, $$$('Integer'), "to_int"); 21011 } 21012 var result = new Date(self.getTime() - (other * 1000)); 21013 result.timezone = self.timezone; 21014 return result; 21015 }); 21016 21017 $def(self, '$<=>', function $Time_$lt_eq_gt$4(other) { 21018 var self = this, r = nil; 21019 21020 if ($eqeqeq($$$('Time'), other)) { 21021 return self.$to_f()['$<=>'](other.$to_f()) 21022 } else { 21023 21024 r = other['$<=>'](self); 21025 if ($truthy(r['$nil?']())) { 21026 return nil 21027 } else if ($truthy($rb_gt(r, 0))) { 21028 return -1 21029 } else if ($truthy($rb_lt(r, 0))) { 21030 return 1 21031 } else { 21032 return 0 21033 } } 21034 }); 21035 21036 $def(self, '$==', function $Time_$eq_eq$5(other) { 21037 var self = this, $ret_or_1 = nil; 21038 21039 if ($truthy(($ret_or_1 = $$$('Time')['$==='](other)))) { 21040 return self.$to_f() === other.$to_f() 21041 } else { 21042 return $ret_or_1 21043 } 21044 }); 21045 21046 $def(self, '$asctime', function $$asctime() { 21047 var self = this; 21048 21049 return self.$strftime("%a %b %e %H:%M:%S %Y") 21050 }); 21051 $send([["year", "getFullYear", "getUTCFullYear"], ["mon", "getMonth", "getUTCMonth", 1], ["wday", "getDay", "getUTCDay"], ["day", "getDate", "getUTCDate"], ["hour", "getHours", "getUTCHours"], ["min", "getMinutes", "getUTCMinutes"], ["sec", "getSeconds", "getUTCSeconds"]], 'each', [], function $Time$6(method, getter, utcgetter, difference){var self = $Time$6.$$s == null ? this : $Time$6.$$s; 21052 21053 21054 if (method == null) method = nil; 21055 if (getter == null) getter = nil; 21056 if (utcgetter == null) utcgetter = nil; 21057 if (difference == null) difference = 0; 21058 return $send(self, 'define_method', [method], function $$7(){var self = $$7.$$s == null ? this : $$7.$$s; 21059 21060 21061 return difference + ((self.timezone != null) ? 21062 (new Date(self.getTime() + self.timezone * 3600000))[utcgetter]() : 21063 self[getter]()) 21064 }, {$$s: self});}, {$$arity: -4, $$s: self}); 21065 21066 $def(self, '$yday', function $$yday() { 21067 var self = this, start_of_year = nil, start_of_day = nil, one_day = nil; 21068 21069 21070 start_of_year = $$('Time').$new(self.$year()).$to_i(); 21071 start_of_day = $$('Time').$new(self.$year(), self.$month(), self.$day()).$to_i(); 21072 one_day = 86400; 21073 return $rb_plus($rb_divide($rb_minus(start_of_day, start_of_year), one_day).$round(), 1); 21074 }); 21075 21076 $def(self, '$isdst', function $$isdst() { 21077 var self = this; 21078 21079 21080 var jan = new Date(self.getFullYear(), 0, 1), 21081 jul = new Date(self.getFullYear(), 6, 1); 21082 return self.getTimezoneOffset() < Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset()); 21083 21084 }); 21085 21086 $def(self, '$dup', function $$dup() { 21087 var self = this, copy = nil; 21088 21089 21090 copy = new Date(self.getTime()); 21091 copy.$copy_instance_variables(self); 21092 copy.$initialize_dup(self); 21093 return copy; 21094 }); 21095 21096 $def(self, '$eql?', function $Time_eql$ques$8(other) { 21097 var self = this, $ret_or_1 = nil; 21098 21099 if ($truthy(($ret_or_1 = other['$is_a?']($$$('Time'))))) { 21100 return self['$<=>'](other)['$zero?']() 21101 } else { 21102 return $ret_or_1 21103 } 21104 }); 21105 $send([["sunday?", 0], ["monday?", 1], ["tuesday?", 2], ["wednesday?", 3], ["thursday?", 4], ["friday?", 5], ["saturday?", 6]], 'each', [], function $Time$9(method, weekday){var self = $Time$9.$$s == null ? this : $Time$9.$$s; 21106 21107 21108 if (method == null) method = nil; 21109 if (weekday == null) weekday = nil; 21110 return $send(self, 'define_method', [method], function $$10(){var self = $$10.$$s == null ? this : $$10.$$s; 21111 21112 return self.$wday() === weekday}, {$$s: self});}, {$$s: self}); 21113 21114 $def(self, '$hash', function $$hash() { 21115 var self = this; 21116 21117 return 'Time:' + self.getTime(); 21118 }); 21119 21120 $def(self, '$inspect', function $$inspect() { 21121 var self = this; 21122 21123 if ($truthy(self['$utc?']())) { 21124 return self.$strftime("%Y-%m-%d %H:%M:%S UTC") 21125 } else { 21126 return self.$strftime("%Y-%m-%d %H:%M:%S %z") 21127 } 21128 }); 21129 21130 $def(self, '$succ', function $$succ() { 21131 var self = this; 21132 21133 21134 var result = new Date(self.getTime() + 1000); 21135 result.timezone = self.timezone; 21136 return result; 21137 21138 }); 21139 21140 $def(self, '$usec', function $$usec() { 21141 var self = this; 21142 21143 return self.getMilliseconds() * 1000; 21144 }); 21145 21146 $def(self, '$zone', function $$zone() { 21147 var self = this; 21148 21149 21150 if (self.timezone === 0) return "UTC"; 21151 else if (self.timezone != null) return nil; 21152 21153 var string = self.toString(), 21154 result; 21155 21156 if (string.indexOf('(') == -1) { 21157 result = string.match(/[A-Z]{3,4}/)[0]; 21158 } 21159 else { 21160 result = string.match(/\((.+)\)(?:\s|$)/)[1]; 21161 } 21162 21163 if (result == "GMT" && /(GMT\W*\d{4})/.test(string)) { 21164 return RegExp.$1; 21165 } 21166 else { 21167 return result; 21168 } 21169 21170 }); 21171 21172 $def(self, '$getgm', function $$getgm() { 21173 var self = this; 21174 21175 21176 var result = new Date(self.getTime()); 21177 result.timezone = 0; 21178 return result; 21179 21180 }); 21181 21182 $def(self, '$gmtime', function $$gmtime() { 21183 var self = this; 21184 21185 21186 if (self.timezone !== 0) { 21187 $deny_frozen_access(self); 21188 self.timezone = 0; 21189 } 21190 return self; 21191 21192 }); 21193 21194 $def(self, '$gmt?', function $Time_gmt$ques$11() { 21195 var self = this; 21196 21197 return self.timezone === 0; 21198 }); 21199 21200 $def(self, '$gmt_offset', function $$gmt_offset() { 21201 var self = this; 21202 21203 return (self.timezone != null) ? self.timezone * 60 : -self.getTimezoneOffset() * 60; 21204 }); 21205 21206 $def(self, '$strftime', function $$strftime(format) { 21207 var self = this; 21208 21209 21210 return format.replace(/%([\-_#^0]*:{0,2})(\d+)?([EO]*)(.)/g, function(full, flags, width, _, conv) { 21211 var result = "", jd, c, s, 21212 zero = flags.indexOf('0') !== -1, 21213 pad = flags.indexOf('-') === -1, 21214 blank = flags.indexOf('_') !== -1, 21215 upcase = flags.indexOf('^') !== -1, 21216 invert = flags.indexOf('#') !== -1, 21217 colons = (flags.match(':') || []).length; 21218 21219 width = parseInt(width, 10); 21220 21221 if (zero && blank) { 21222 if (flags.indexOf('0') < flags.indexOf('_')) { 21223 zero = false; 21224 } 21225 else { 21226 blank = false; 21227 } 21228 } 21229 21230 switch (conv) { 21231 case 'Y': 21232 result += self.$year(); 21233 break; 21234 21235 case 'C': 21236 zero = !blank; 21237 result += Math.round(self.$year() / 100); 21238 break; 21239 21240 case 'y': 21241 zero = !blank; 21242 result += (self.$year() % 100); 21243 break; 21244 21245 case 'm': 21246 zero = !blank; 21247 result += self.$mon(); 21248 break; 21249 21250 case 'B': 21251 result += long_months[self.$mon() - 1]; 21252 break; 21253 21254 case 'b': 21255 case 'h': 21256 blank = !zero; 21257 result += short_months[self.$mon() - 1]; 21258 break; 21259 21260 case 'd': 21261 zero = !blank; 21262 result += self.$day(); 21263 break; 21264 21265 case 'e': 21266 blank = !zero; 21267 result += self.$day(); 21268 break; 21269 21270 case 'j': 21271 zero = !blank; 21272 width = isNaN(width) ? 3 : width; 21273 result += self.$yday(); 21274 break; 21275 21276 case 'H': 21277 zero = !blank; 21278 result += self.$hour(); 21279 break; 21280 21281 case 'k': 21282 blank = !zero; 21283 result += self.$hour(); 21284 break; 21285 21286 case 'I': 21287 zero = !blank; 21288 result += (self.$hour() % 12 || 12); 21289 break; 21290 21291 case 'l': 21292 blank = !zero; 21293 result += (self.$hour() % 12 || 12); 21294 break; 21295 21296 case 'P': 21297 result += (self.$hour() >= 12 ? "pm" : "am"); 21298 break; 21299 21300 case 'p': 21301 result += (self.$hour() >= 12 ? "PM" : "AM"); 21302 break; 21303 21304 case 'M': 21305 zero = !blank; 21306 result += self.$min(); 21307 break; 21308 21309 case 'S': 21310 zero = !blank; 21311 result += self.$sec(); 21312 break; 21313 21314 case 'L': 21315 zero = !blank; 21316 width = isNaN(width) ? 3 : width; 21317 result += self.getMilliseconds(); 21318 break; 21319 21320 case 'N': 21321 width = isNaN(width) ? 9 : width; 21322 result += (self.getMilliseconds().toString()).$rjust(3, "0"); 21323 result = (result).$ljust(width, "0"); 21324 break; 21325 21326 case 'z': 21327 var offset = (self.timezone == null) ? self.getTimezoneOffset() : (-self.timezone * 60), 21328 hours = Math.floor(Math.abs(offset) / 60), 21329 minutes = Math.abs(offset) % 60; 21330 21331 result += offset < 0 ? "+" : "-"; 21332 result += hours < 10 ? "0" : ""; 21333 result += hours; 21334 21335 if (colons > 0) { 21336 result += ":"; 21337 } 21338 21339 result += minutes < 10 ? "0" : ""; 21340 result += minutes; 21341 21342 if (colons > 1) { 21343 result += ":00"; 21344 } 21345 21346 break; 21347 21348 case 'Z': 21349 result += self.$zone(); 21350 break; 21351 21352 case 'A': 21353 result += days_of_week[self.$wday()]; 21354 break; 21355 21356 case 'a': 21357 result += short_days[self.$wday()]; 21358 break; 21359 21360 case 'u': 21361 result += (self.$wday() + 1); 21362 break; 21363 21364 case 'w': 21365 result += self.$wday(); 21366 break; 21367 21368 case 'V': 21369 result += self.$cweek_cyear()['$[]'](0).$to_s().$rjust(2, "0"); 21370 break; 21371 21372 case 'G': 21373 result += self.$cweek_cyear()['$[]'](1); 21374 break; 21375 21376 case 'g': 21377 result += self.$cweek_cyear()['$[]'](1)['$[]']($range(-2, -1, false)); 21378 break; 21379 21380 case 's': 21381 result += self.$to_i(); 21382 break; 21383 21384 case 'n': 21385 result += "\n"; 21386 break; 21387 21388 case 't': 21389 result += "\t"; 21390 break; 21391 21392 case '%': 21393 result += "%"; 21394 break; 21395 21396 case 'c': 21397 result += self.$strftime("%a %b %e %T %Y"); 21398 break; 21399 21400 case 'D': 21401 case 'x': 21402 result += self.$strftime("%m/%d/%y"); 21403 break; 21404 21405 case 'F': 21406 result += self.$strftime("%Y-%m-%d"); 21407 break; 21408 21409 case 'v': 21410 result += self.$strftime("%e-%^b-%4Y"); 21411 break; 21412 21413 case 'r': 21414 result += self.$strftime("%I:%M:%S %p"); 21415 break; 21416 21417 case 'R': 21418 result += self.$strftime("%H:%M"); 21419 break; 21420 21421 case 'T': 21422 case 'X': 21423 result += self.$strftime("%H:%M:%S"); 21424 break; 21425 21426 // Non-standard: JIS X 0301 date format 21427 case 'J': 21428 jd = self.$to_date().$jd(); 21429 if (jd < 2405160) { 21430 result += self.$strftime("%Y-%m-%d"); 21431 break; 21432 } 21433 else if (jd < 2419614) 21434 c = 'M', s = 1867; 21435 else if (jd < 2424875) 21436 c = 'T', s = 1911; 21437 else if (jd < 2447535) 21438 c = 'S', s = 1925; 21439 else if (jd < 2458605) 21440 c = 'H', s = 1988; 21441 else 21442 c = 'R', s = 2018; 21443 21444 result += self.$format("%c%02d", c, $rb_minus(self.$year(), s)); 21445 result += self.$strftime("-%m-%d"); 21446 break; 21447 21448 default: 21449 return full; 21450 } 21451 21452 if (upcase) { 21453 result = result.toUpperCase(); 21454 } 21455 21456 if (invert) { 21457 result = result.replace(/[A-Z]/, function(c) { c.toLowerCase(); }). 21458 replace(/[a-z]/, function(c) { c.toUpperCase(); }); 21459 } 21460 21461 if (pad && (zero || blank)) { 21462 result = (result).$rjust(isNaN(width) ? 2 : width, blank ? " " : "0"); 21463 } 21464 21465 return result; 21466 }); 21467 21468 }); 21469 21470 $def(self, '$to_a', function $$to_a() { 21471 var self = this; 21472 21473 return [self.$sec(), self.$min(), self.$hour(), self.$day(), self.$month(), self.$year(), self.$wday(), self.$yday(), self.$isdst(), self.$zone()] 21474 }); 21475 21476 $def(self, '$to_f', function $$to_f() { 21477 var self = this; 21478 21479 return self.getTime() / 1000; 21480 }); 21481 21482 $def(self, '$to_i', function $$to_i() { 21483 var self = this; 21484 21485 return parseInt(self.getTime() / 1000, 10); 21486 }); 21487 21488 $def(self, '$cweek_cyear', function $$cweek_cyear() { 21489 var self = this, jan01 = nil, jan01_wday = nil, year = nil, offset = nil, week = nil, dec31 = nil, dec31_wday = nil; 21490 21491 21492 jan01 = $$$('Time').$new(self.$year(), 1, 1); 21493 jan01_wday = jan01.$wday(); 21494 year = self.$year(); 21495 if (($truthy($rb_le(jan01_wday, 4)) && ($neqeq(jan01_wday, 0)))) { 21496 offset = $rb_minus(jan01_wday, 1); 21497 } else { 21498 21499 offset = $rb_minus($rb_minus(jan01_wday, 7), 1); 21500 if ($eqeq(offset, -8)) { 21501 offset = -1; 21502 } } week = $rb_divide($rb_plus(self.$yday(), offset), 7.0).$ceil(); 21503 if ($truthy($rb_le(week, 0))) { 21504 return $$$('Time').$new($rb_minus(self.$year(), 1), 12, 31).$cweek_cyear() 21505 } else if ($eqeq(week, 53)) { 21506 21507 dec31 = $$$('Time').$new(self.$year(), 12, 31); 21508 dec31_wday = dec31.$wday(); 21509 if (($truthy($rb_le(dec31_wday, 3)) && ($neqeq(dec31_wday, 0)))) { 21510 21511 week = 1; 21512 year = $rb_plus(year, 1); 21513 } } return [week, year]; 21514 }); 21515 (function(self, $parent_nesting) { 21516 21517 21518 $alias(self, "mktime", "local"); 21519 return $alias(self, "utc", "gm"); 21520 })(Opal.get_singleton_class(self)); 21521 $alias(self, "ctime", "asctime"); 21522 $alias(self, "dst?", "isdst"); 21523 $alias(self, "getutc", "getgm"); 21524 $alias(self, "gmtoff", "gmt_offset"); 21525 $alias(self, "mday", "day"); 21526 $alias(self, "month", "mon"); 21527 $alias(self, "to_s", "inspect"); 21528 $alias(self, "tv_sec", "to_i"); 21529 $alias(self, "tv_usec", "usec"); 21530 $alias(self, "utc", "gmtime"); 21531 $alias(self, "utc?", "gmt?"); 21532 return $alias(self, "utc_offset", "gmt_offset"); 21533 })('::', Date, $nesting); 21534}; 21535 21536Opal.modules["corelib/struct"] = function(Opal) {/* Generated by Opal 1.7.3 */ 21537 var $klass = Opal.klass, $slice = Opal.slice, $extract_kwargs = Opal.extract_kwargs, $ensure_kwargs = Opal.ensure_kwargs, $truthy = Opal.truthy, $neqeq = Opal.neqeq, $eqeq = Opal.eqeq, $Opal = Opal.Opal, $send = Opal.send, $Class = Opal.Class, $to_a = Opal.to_a, $def = Opal.def, $defs = Opal.defs, $Kernel = Opal.Kernel, $hash2 = Opal.hash2, $rb_gt = Opal.rb_gt, $rb_minus = Opal.rb_minus, $eqeqeq = Opal.eqeqeq, $rb_lt = Opal.rb_lt, $rb_ge = Opal.rb_ge, $rb_plus = Opal.rb_plus, $alias = Opal.alias, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 21538 21539 Opal.add_stubs('require,include,!=,upcase,[],==,class,unshift,const_name!,map,coerce_to!,new,each,define_struct_attribute,allocate,initialize,alias_method,module_eval,to_proc,const_set,raise,<<,members,define_method,instance_eval,last,>,length,-,keys,any?,join,[]=,each_with_index,hash,===,<,-@,size,>=,include?,to_sym,instance_of?,__id__,eql?,enum_for,+,name,each_pair,inspect,to_h,args,each_with_object,flatten,to_a,respond_to?,dig'); 21540 21541 self.$require("corelib/enumerable"); 21542 return (function($base, $super, $parent_nesting) { 21543 var self = $klass($base, $super, 'Struct'); 21544 21545 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 21546 21547 21548 self.$include($$$('Enumerable')); 21549 $defs(self, '$new', function $Struct_new$1(const_name, $a, $b) { 21550 var block = $Struct_new$1.$$p || nil, $post_args, $kwargs, args, keyword_init, self = this, klass = nil; 21551 21552 $Struct_new$1.$$p = null; 21553 $post_args = $slice(arguments, 1); 21554 $kwargs = $extract_kwargs($post_args); 21555 $kwargs = $ensure_kwargs($kwargs); 21556 args = $post_args; 21557 21558 keyword_init = $kwargs.$$smap["keyword_init"];if (keyword_init == null) keyword_init = false; 21559 if ($truthy(const_name)) { 21560 if (($eqeq(const_name.$class(), $$$('String')) && ($neqeq(const_name['$[]'](0).$upcase(), const_name['$[]'](0))))) { 21561 21562 args.$unshift(const_name); 21563 const_name = nil; 21564 } else { 21565 21566 try { 21567 const_name = $Opal['$const_name!'](const_name); 21568 } catch ($err) { 21569 if (Opal.rescue($err, [$$$('TypeError'), $$$('NameError')])) { 21570 try { 21571 21572 args.$unshift(const_name); 21573 const_name = nil; 21574 } finally { Opal.pop_exception(); } 21575 } else { throw $err; } 21576 } } 21577 } $send(args, 'map', [], function $$2(arg){ 21578 21579 if (arg == null) arg = nil; 21580 return $Opal['$coerce_to!'](arg, $$$('String'), "to_str");}); 21581 klass = $send($Class, 'new', [self], function $$3(){var self = $$3.$$s == null ? this : $$3.$$s; 21582 21583 21584 $send(args, 'each', [], function $$4(arg){var self = $$4.$$s == null ? this : $$4.$$s; 21585 21586 21587 if (arg == null) arg = nil; 21588 return self.$define_struct_attribute(arg);}, {$$s: self}); 21589 return (function(self, $parent_nesting) { 21590 21591 21592 21593 $def(self, '$new', function $new$5($a) { 21594 var $post_args, args, self = this, instance = nil; 21595 21596 21597 $post_args = $slice(arguments); 21598 args = $post_args; 21599 instance = self.$allocate(); 21600 instance.$$data = {}; 21601 $send(instance, 'initialize', $to_a(args)); 21602 return instance; 21603 }, -1); 21604 return self.$alias_method("[]", "new"); 21605 })(Opal.get_singleton_class(self));}, {$$s: self}); 21606 if ($truthy(block)) { 21607 $send(klass, 'module_eval', [], block.$to_proc()); 21608 } klass.$$keyword_init = keyword_init; 21609 if ($truthy(const_name)) { 21610 $$$('Struct').$const_set(const_name, klass); 21611 } return klass; 21612 }, -2); 21613 $defs(self, '$define_struct_attribute', function $$define_struct_attribute(name) { 21614 var self = this; 21615 21616 21617 if ($eqeq(self, $$$('Struct'))) { 21618 $Kernel.$raise($$$('ArgumentError'), "you cannot define attributes to the Struct class"); 21619 } self.$members()['$<<'](name); 21620 $send(self, 'define_method', [name], function $$6(){var self = $$6.$$s == null ? this : $$6.$$s; 21621 21622 return self.$$data[name];}, {$$s: self}); 21623 return $send(self, 'define_method', ["" + (name) + "="], function $$7(value){var self = $$7.$$s == null ? this : $$7.$$s; 21624 21625 21626 if (value == null) value = nil; 21627 return self.$$data[name] = value;}, {$$s: self}); 21628 }); 21629 $defs(self, '$members', function $$members() { 21630 var self = this, $ret_or_1 = nil; 21631 if (self.members == null) self.members = nil; 21632 21633 21634 if ($eqeq(self, $$$('Struct'))) { 21635 $Kernel.$raise($$$('ArgumentError'), "the Struct class has no members"); 21636 } return (self.members = ($truthy(($ret_or_1 = self.members)) ? ($ret_or_1) : ([]))); 21637 }); 21638 $defs(self, '$inherited', function $$inherited(klass) { 21639 var self = this, members = nil; 21640 if (self.members == null) self.members = nil; 21641 21642 21643 members = self.members; 21644 return $send(klass, 'instance_eval', [], function $$8(){var self = $$8.$$s == null ? this : $$8.$$s; 21645 21646 return (self.members = members)}, {$$s: self}); 21647 }); 21648 21649 $def(self, '$initialize', function $$initialize($a) { 21650 var $post_args, args, self = this, kwargs = nil, $ret_or_1 = nil, extra = nil; 21651 21652 21653 $post_args = $slice(arguments); 21654 args = $post_args; 21655 if ($truthy(self.$class().$$keyword_init)) { 21656 21657 kwargs = ($truthy(($ret_or_1 = args.$last())) ? ($ret_or_1) : ($hash2([], {}))); 21658 if (($truthy($rb_gt(args.$length(), 1)) || ($truthy((args.length === 1 && !kwargs.$$is_hash))))) { 21659 $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (given " + (args.$length()) + ", expected 0)"); 21660 } extra = $rb_minus(kwargs.$keys(), self.$class().$members()); 21661 if ($truthy(extra['$any?']())) { 21662 $Kernel.$raise($$$('ArgumentError'), "unknown keywords: " + (extra.$join(", "))); 21663 } return $send(self.$class().$members(), 'each', [], function $$9(name){var $b, self = $$9.$$s == null ? this : $$9.$$s; 21664 21665 21666 if (name == null) name = nil; 21667 return ($b = [name, kwargs['$[]'](name)], $send(self, '[]=', $b), $b[$b.length - 1]);}, {$$s: self}); 21668 } else { 21669 21670 if ($truthy($rb_gt(args.$length(), self.$class().$members().$length()))) { 21671 $Kernel.$raise($$$('ArgumentError'), "struct size differs"); 21672 } return $send(self.$class().$members(), 'each_with_index', [], function $$10(name, index){var $b, self = $$10.$$s == null ? this : $$10.$$s; 21673 21674 21675 if (name == null) name = nil; 21676 if (index == null) index = nil; 21677 return ($b = [name, args['$[]'](index)], $send(self, '[]=', $b), $b[$b.length - 1]);}, {$$s: self}); 21678 } }, -1); 21679 21680 $def(self, '$initialize_copy', function $$initialize_copy(from) { 21681 var self = this; 21682 21683 21684 self.$$data = {}; 21685 var keys = Object.keys(from.$$data), i, max, name; 21686 for (i = 0, max = keys.length; i < max; i++) { 21687 name = keys[i]; 21688 self.$$data[name] = from.$$data[name]; 21689 } 21690 21691 }); 21692 $defs(self, '$keyword_init?', function $Struct_keyword_init$ques$11() { 21693 var self = this; 21694 21695 return self.$$keyword_init; 21696 }); 21697 21698 $def(self, '$members', function $$members() { 21699 var self = this; 21700 21701 return self.$class().$members() 21702 }); 21703 21704 $def(self, '$hash', function $$hash() { 21705 var self = this; 21706 21707 return $$('Hash').$new(self.$$data).$hash() 21708 }); 21709 21710 $def(self, '$[]', function $Struct_$$$12(name) { 21711 var self = this; 21712 21713 21714 if ($eqeqeq($$$('Integer'), name)) { 21715 21716 if ($truthy($rb_lt(name, self.$class().$members().$size()['$-@']()))) { 21717 $Kernel.$raise($$$('IndexError'), "offset " + (name) + " too small for struct(size:" + (self.$class().$members().$size()) + ")"); 21718 } if ($truthy($rb_ge(name, self.$class().$members().$size()))) { 21719 $Kernel.$raise($$$('IndexError'), "offset " + (name) + " too large for struct(size:" + (self.$class().$members().$size()) + ")"); 21720 } name = self.$class().$members()['$[]'](name); 21721 } else if ($eqeqeq($$$('String'), name)) { 21722 21723 if(!self.$$data.hasOwnProperty(name)) { 21724 $Kernel.$raise($$$('NameError').$new("no member '" + (name) + "' in struct", name)); 21725 } 21726 21727 } else { 21728 $Kernel.$raise($$$('TypeError'), "no implicit conversion of " + (name.$class()) + " into Integer"); 21729 } name = $Opal['$coerce_to!'](name, $$$('String'), "to_str"); 21730 return self.$$data[name]; }); 21731 21732 $def(self, '$[]=', function $Struct_$$$eq$13(name, value) { 21733 var self = this; 21734 21735 21736 if ($eqeqeq($$$('Integer'), name)) { 21737 21738 if ($truthy($rb_lt(name, self.$class().$members().$size()['$-@']()))) { 21739 $Kernel.$raise($$$('IndexError'), "offset " + (name) + " too small for struct(size:" + (self.$class().$members().$size()) + ")"); 21740 } if ($truthy($rb_ge(name, self.$class().$members().$size()))) { 21741 $Kernel.$raise($$$('IndexError'), "offset " + (name) + " too large for struct(size:" + (self.$class().$members().$size()) + ")"); 21742 } name = self.$class().$members()['$[]'](name); 21743 } else if ($eqeqeq($$$('String'), name)) { 21744 if (!$truthy(self.$class().$members()['$include?'](name.$to_sym()))) { 21745 $Kernel.$raise($$$('NameError').$new("no member '" + (name) + "' in struct", name)); 21746 } 21747 } else { 21748 $Kernel.$raise($$$('TypeError'), "no implicit conversion of " + (name.$class()) + " into Integer"); 21749 } name = $Opal['$coerce_to!'](name, $$$('String'), "to_str"); 21750 return self.$$data[name] = value; }); 21751 21752 $def(self, '$==', function $Struct_$eq_eq$14(other) { 21753 var self = this; 21754 21755 21756 if (!$truthy(other['$instance_of?'](self.$class()))) { 21757 return false 21758 } 21759 var recursed1 = {}, recursed2 = {}; 21760 21761 function _eqeq(struct, other) { 21762 var key, a, b; 21763 21764 recursed1[(struct).$__id__()] = true; 21765 recursed2[(other).$__id__()] = true; 21766 21767 for (key in struct.$$data) { 21768 a = struct.$$data[key]; 21769 b = other.$$data[key]; 21770 21771 if ($$$('Struct')['$==='](a)) { 21772 if (!recursed1.hasOwnProperty((a).$__id__()) || !recursed2.hasOwnProperty((b).$__id__())) { 21773 if (!_eqeq(a, b)) { 21774 return false; 21775 } 21776 } 21777 } else { 21778 if (!(a)['$=='](b)) { 21779 return false; 21780 } 21781 } 21782 } 21783 21784 return true; 21785 } 21786 21787 return _eqeq(self, other); 21788 }); 21789 21790 $def(self, '$eql?', function $Struct_eql$ques$15(other) { 21791 var self = this; 21792 21793 21794 if (!$truthy(other['$instance_of?'](self.$class()))) { 21795 return false 21796 } 21797 var recursed1 = {}, recursed2 = {}; 21798 21799 function _eqeq(struct, other) { 21800 var key, a, b; 21801 21802 recursed1[(struct).$__id__()] = true; 21803 recursed2[(other).$__id__()] = true; 21804 21805 for (key in struct.$$data) { 21806 a = struct.$$data[key]; 21807 b = other.$$data[key]; 21808 21809 if ($$$('Struct')['$==='](a)) { 21810 if (!recursed1.hasOwnProperty((a).$__id__()) || !recursed2.hasOwnProperty((b).$__id__())) { 21811 if (!_eqeq(a, b)) { 21812 return false; 21813 } 21814 } 21815 } else { 21816 if (!(a)['$eql?'](b)) { 21817 return false; 21818 } 21819 } 21820 } 21821 21822 return true; 21823 } 21824 21825 return _eqeq(self, other); 21826 }); 21827 21828 $def(self, '$each', function $$each() { 21829 var $yield = $$each.$$p || nil, self = this; 21830 21831 $$each.$$p = null; 21832 21833 if (!($yield !== nil)) { 21834 return $send(self, 'enum_for', ["each"], function $$16(){var self = $$16.$$s == null ? this : $$16.$$s; 21835 21836 return self.$size()}, {$$s: self}) 21837 } $send(self.$class().$members(), 'each', [], function $$17(name){var self = $$17.$$s == null ? this : $$17.$$s; 21838 21839 21840 if (name == null) name = nil; 21841 return Opal.yield1($yield, self['$[]'](name));}, {$$s: self}); 21842 return self; 21843 }); 21844 21845 $def(self, '$each_pair', function $$each_pair() { 21846 var $yield = $$each_pair.$$p || nil, self = this; 21847 21848 $$each_pair.$$p = null; 21849 21850 if (!($yield !== nil)) { 21851 return $send(self, 'enum_for', ["each_pair"], function $$18(){var self = $$18.$$s == null ? this : $$18.$$s; 21852 21853 return self.$size()}, {$$s: self}) 21854 } $send(self.$class().$members(), 'each', [], function $$19(name){var self = $$19.$$s == null ? this : $$19.$$s; 21855 21856 21857 if (name == null) name = nil; 21858 return Opal.yield1($yield, [name, self['$[]'](name)]);}, {$$s: self}); 21859 return self; 21860 }); 21861 21862 $def(self, '$length', function $$length() { 21863 var self = this; 21864 21865 return self.$class().$members().$length() 21866 }); 21867 21868 $def(self, '$to_a', function $$to_a() { 21869 var self = this; 21870 21871 return $send(self.$class().$members(), 'map', [], function $$20(name){var self = $$20.$$s == null ? this : $$20.$$s; 21872 21873 21874 if (name == null) name = nil; 21875 return self['$[]'](name);}, {$$s: self}) 21876 }); 21877 var inspect_stack = []; 21878 21879 $def(self, '$inspect', function $$inspect() { 21880 var self = this, result = nil, pushed = nil; 21881 21882 return (function() { try { 21883 21884 result = "#<struct "; 21885 if ($truthy((inspect_stack)['$include?'](self.$__id__()))) { 21886 return $rb_plus(result, ":...>") 21887 } else { 21888 21889 (inspect_stack)['$<<'](self.$__id__()); 21890 pushed = true; 21891 if (($eqeqeq($$$('Struct'), self) && ($truthy(self.$class().$name())))) { 21892 result = $rb_plus(result, "" + (self.$class()) + " "); 21893 }; 21894 result = $rb_plus(result, $send(self.$each_pair(), 'map', [], function $$21(name, value){ 21895 21896 if (name == null) name = nil; 21897 if (value == null) value = nil; 21898 return "" + (name) + "=" + ($$('Opal').$inspect(value));}).$join(", ")); 21899 result = $rb_plus(result, ">"); 21900 return result; 21901 }; 21902 } finally { 21903 ($truthy(pushed) ? (inspect_stack.pop()) : nil); 21904 } })() 21905 }); 21906 21907 $def(self, '$to_h', function $$to_h() { 21908 var block = $$to_h.$$p || nil, self = this; 21909 21910 $$to_h.$$p = null; 21911 if ((block !== nil)) { 21912 return $send($send(self, 'map', [], block.$to_proc()), 'to_h', $to_a(self.$args())) 21913 } return $send(self.$class().$members(), 'each_with_object', [$hash2([], {})], function $$22(name, h){var $a, self = $$22.$$s == null ? this : $$22.$$s; 21914 21915 21916 if (name == null) name = nil; 21917 if (h == null) h = nil; 21918 return ($a = [name, self['$[]'](name)], $send(h, '[]=', $a), $a[$a.length - 1]);}, {$$s: self}); 21919 }); 21920 21921 $def(self, '$values_at', function $$values_at($a) { 21922 var $post_args, args, self = this; 21923 21924 21925 $post_args = $slice(arguments); 21926 args = $post_args; 21927 args = $send(args, 'map', [], function $$23(arg){ 21928 21929 if (arg == null) arg = nil; 21930 return arg.$$is_range ? arg.$to_a() : arg;}).$flatten(); 21931 21932 var result = []; 21933 for (var i = 0, len = args.length; i < len; i++) { 21934 if (!args[i].$$is_number) { 21935 $Kernel.$raise($$$('TypeError'), "no implicit conversion of " + ((args[i]).$class()) + " into Integer"); 21936 } 21937 result.push(self['$[]'](args[i])); 21938 } 21939 return result; 21940 }, -1); 21941 21942 $def(self, '$dig', function $$dig(key, $a) { 21943 var $post_args, keys, self = this, item = nil; 21944 21945 21946 $post_args = $slice(arguments, 1); 21947 keys = $post_args; 21948 item = ($truthy(key.$$is_string && self.$$data.hasOwnProperty(key)) ? (self.$$data[key] || nil) : nil); 21949 21950 if (item === nil || keys.length === 0) { 21951 return item; 21952 } 21953 if (!$truthy(item['$respond_to?']("dig"))) { 21954 $Kernel.$raise($$$('TypeError'), "" + (item.$class()) + " does not have #dig method"); 21955 } return $send(item, 'dig', $to_a(keys)); 21956 }, -2); 21957 $alias(self, "size", "length"); 21958 $alias(self, "to_s", "inspect"); 21959 return $alias(self, "values", "to_a"); 21960 })('::', null, $nesting); 21961}; 21962 21963Opal.modules["corelib/set"] = function(Opal) {/* Generated by Opal 1.7.3 */ 21964 var $freeze = Opal.freeze, $klass = Opal.klass, $slice = Opal.slice, $defs = Opal.defs, $hash2 = Opal.hash2, $truthy = Opal.truthy, $eqeqeq = Opal.eqeqeq, $Kernel = Opal.Kernel, $send = Opal.send, $def = Opal.def, $eqeq = Opal.eqeq, $rb_lt = Opal.rb_lt, $rb_le = Opal.rb_le, $alias = Opal.alias, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 21965 21966 Opal.add_stubs('include,new,nil?,===,raise,each,add,merge,class,respond_to?,subtract,dup,join,to_a,equal?,instance_of?,==,instance_variable_get,size,is_a?,all?,include?,[]=,enum_for,[],<<,replace,compare_by_identity,name,compare_by_identity?,delete,select,frozen?,freeze,reject,delete_if,to_proc,keep_if,each_key,empty?,eql?,instance_eval,clear,<,<=,any?,!,intersect?,keys,|,proper_subset?,subset?,proper_superset?,superset?,-,select!,collect!'); 21967 return (function($base, $super, $parent_nesting) { 21968 var self = $klass($base, $super, 'Set'); 21969 21970 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $ret_or_1 = nil, $proto = self.$$prototype; 21971 21972 $proto.hash = nil; 21973 21974 self.$include($$$('Enumerable')); 21975 $defs(self, '$[]', function $Set_$$$1($a) { 21976 var $post_args, ary, self = this; 21977 21978 21979 $post_args = $slice(arguments); 21980 ary = $post_args; 21981 return self.$new(ary); 21982 }, -1); 21983 21984 $def(self, '$initialize', function $$initialize(enum$) { 21985 var block = $$initialize.$$p || nil, self = this; 21986 21987 $$initialize.$$p = null; 21988 if (enum$ == null) enum$ = nil; 21989 self.hash = $hash2([], {}); 21990 if ($truthy(enum$['$nil?']())) { 21991 return nil 21992 } if (!$eqeqeq($$$('Enumerable'), enum$)) { 21993 $Kernel.$raise($$$('ArgumentError'), "value must be enumerable"); 21994 } if ($truthy(block)) { 21995 return $send(enum$, 'each', [], function $$2(item){var self = $$2.$$s == null ? this : $$2.$$s; 21996 21997 21998 if (item == null) item = nil; 21999 return self.$add(Opal.yield1(block, item));}, {$$s: self}) 22000 } else { 22001 return self.$merge(enum$) 22002 } }, -1); 22003 22004 $def(self, '$dup', function $$dup() { 22005 var self = this, result = nil; 22006 22007 22008 result = self.$class().$new(); 22009 return result.$merge(self); 22010 }); 22011 22012 $def(self, '$-', function $Set_$minus$3(enum$) { 22013 var self = this; 22014 22015 22016 if (!$truthy(enum$['$respond_to?']("each"))) { 22017 $Kernel.$raise($$$('ArgumentError'), "value must be enumerable"); 22018 } return self.$dup().$subtract(enum$); 22019 }); 22020 22021 $def(self, '$inspect', function $$inspect() { 22022 var self = this; 22023 22024 return "#<Set: {" + (self.$to_a().$join(",")) + "}>" 22025 }); 22026 22027 $def(self, '$==', function $Set_$eq_eq$4(other) { 22028 var self = this; 22029 22030 if ($truthy(self['$equal?'](other))) { 22031 return true 22032 } else if ($truthy(other['$instance_of?'](self.$class()))) { 22033 return self.hash['$=='](other.$instance_variable_get("@hash")) 22034 } else if (($truthy(other['$is_a?']($$$('Set'))) && ($eqeq(self.$size(), other.$size())))) { 22035 return $send(other, 'all?', [], function $$5(o){var self = $$5.$$s == null ? this : $$5.$$s; 22036 if (self.hash == null) self.hash = nil; 22037 22038 22039 if (o == null) o = nil; 22040 return self.hash['$include?'](o);}, {$$s: self}) 22041 } else { 22042 return false 22043 } 22044 }); 22045 22046 $def(self, '$add', function $$add(o) { 22047 var self = this; 22048 22049 22050 self.hash['$[]='](o, true); 22051 return self; 22052 }); 22053 22054 $def(self, '$classify', function $$classify() { 22055 var block = $$classify.$$p || nil, self = this, result = nil; 22056 22057 $$classify.$$p = null; 22058 if (!(block !== nil)) { 22059 return self.$enum_for("classify") 22060 } result = $send($$$('Hash'), 'new', [], function $$6(h, k){var $a, self = $$6.$$s == null ? this : $$6.$$s; 22061 22062 22063 if (h == null) h = nil; 22064 if (k == null) k = nil; 22065 return ($a = [k, self.$class().$new()], $send(h, '[]=', $a), $a[$a.length - 1]);}, {$$s: self}); 22066 $send(self, 'each', [], function $$7(item){ 22067 22068 if (item == null) item = nil; 22069 return result['$[]'](Opal.yield1(block, item)).$add(item);}); 22070 return result; 22071 }); 22072 22073 $def(self, '$collect!', function $Set_collect$excl$8() { 22074 var block = $Set_collect$excl$8.$$p || nil, self = this, result = nil; 22075 22076 $Set_collect$excl$8.$$p = null; 22077 if (!(block !== nil)) { 22078 return self.$enum_for("collect!") 22079 } result = self.$class().$new(); 22080 $send(self, 'each', [], function $$9(item){ 22081 22082 if (item == null) item = nil; 22083 return result['$<<'](Opal.yield1(block, item));}); 22084 return self.$replace(result); 22085 }); 22086 22087 $def(self, '$compare_by_identity', function $$compare_by_identity() { 22088 var self = this; 22089 22090 if ($truthy(self.hash['$respond_to?']("compare_by_identity"))) { 22091 22092 self.hash.$compare_by_identity(); 22093 return self; 22094 } else { 22095 return self.$raise($$('NotImplementedError'), "" + (self.$class().$name()) + "#" + ("compare_by_identity") + " is not implemented") 22096 } 22097 }); 22098 22099 $def(self, '$compare_by_identity?', function $Set_compare_by_identity$ques$10() { 22100 var self = this, $ret_or_1 = nil; 22101 22102 if ($truthy(($ret_or_1 = self.hash['$respond_to?']("compare_by_identity?")))) { 22103 return self.hash['$compare_by_identity?']() 22104 } else { 22105 return $ret_or_1 22106 } 22107 }); 22108 22109 $def(self, '$delete', function $Set_delete$11(o) { 22110 var self = this; 22111 22112 22113 self.hash.$delete(o); 22114 return self; 22115 }); 22116 22117 $def(self, '$delete?', function $Set_delete$ques$12(o) { 22118 var self = this; 22119 22120 if ($truthy(self['$include?'](o))) { 22121 22122 self.$delete(o); 22123 return self; 22124 } else { 22125 return nil 22126 } 22127 }); 22128 22129 $def(self, '$delete_if', function $$delete_if() { 22130 var $yield = $$delete_if.$$p || nil, self = this; 22131 22132 $$delete_if.$$p = null; 22133 22134 if (!($yield !== nil)) { 22135 return self.$enum_for("delete_if") 22136 } $send($send(self, 'select', [], function $$13(o){ 22137 22138 if (o == null) o = nil; 22139 return Opal.yield1($yield, o);}), 'each', [], function $$14(o){var self = $$14.$$s == null ? this : $$14.$$s; 22140 if (self.hash == null) self.hash = nil; 22141 22142 22143 if (o == null) o = nil; 22144 return self.hash.$delete(o);}, {$$s: self}); 22145 return self; 22146 }); 22147 22148 $def(self, '$freeze', function $$freeze() { 22149 var self = this; 22150 22151 22152 if ($truthy(self['$frozen?']())) { 22153 return self 22154 } self.hash.$freeze(); 22155 return $freeze(self); }); 22156 22157 $def(self, '$keep_if', function $$keep_if() { 22158 var $yield = $$keep_if.$$p || nil, self = this; 22159 22160 $$keep_if.$$p = null; 22161 22162 if (!($yield !== nil)) { 22163 return self.$enum_for("keep_if") 22164 } $send($send(self, 'reject', [], function $$15(o){ 22165 22166 if (o == null) o = nil; 22167 return Opal.yield1($yield, o);}), 'each', [], function $$16(o){var self = $$16.$$s == null ? this : $$16.$$s; 22168 if (self.hash == null) self.hash = nil; 22169 22170 22171 if (o == null) o = nil; 22172 return self.hash.$delete(o);}, {$$s: self}); 22173 return self; 22174 }); 22175 22176 $def(self, '$reject!', function $Set_reject$excl$17() { 22177 var block = $Set_reject$excl$17.$$p || nil, self = this, before = nil; 22178 22179 $Set_reject$excl$17.$$p = null; 22180 if (!(block !== nil)) { 22181 return self.$enum_for("reject!") 22182 } before = self.$size(); 22183 $send(self, 'delete_if', [], block.$to_proc()); 22184 if ($eqeq(self.$size(), before)) { 22185 return nil 22186 } else { 22187 return self 22188 } }); 22189 22190 $def(self, '$select!', function $Set_select$excl$18() { 22191 var block = $Set_select$excl$18.$$p || nil, self = this, before = nil; 22192 22193 $Set_select$excl$18.$$p = null; 22194 if (!(block !== nil)) { 22195 return self.$enum_for("select!") 22196 } before = self.$size(); 22197 $send(self, 'keep_if', [], block.$to_proc()); 22198 if ($eqeq(self.$size(), before)) { 22199 return nil 22200 } else { 22201 return self 22202 } }); 22203 22204 $def(self, '$add?', function $Set_add$ques$19(o) { 22205 var self = this; 22206 22207 if ($truthy(self['$include?'](o))) { 22208 return nil 22209 } else { 22210 return self.$add(o) 22211 } 22212 }); 22213 22214 $def(self, '$each', function $$each() { 22215 var block = $$each.$$p || nil, self = this; 22216 22217 $$each.$$p = null; 22218 if (!(block !== nil)) { 22219 return self.$enum_for("each") 22220 } $send(self.hash, 'each_key', [], block.$to_proc()); 22221 return self; 22222 }); 22223 22224 $def(self, '$empty?', function $Set_empty$ques$20() { 22225 var self = this; 22226 22227 return self.hash['$empty?']() 22228 }); 22229 22230 $def(self, '$eql?', function $Set_eql$ques$21(other) { 22231 var self = this; 22232 22233 return self.hash['$eql?']($send(other, 'instance_eval', [], function $$22(){var self = $$22.$$s == null ? this : $$22.$$s; 22234 if (self.hash == null) self.hash = nil; 22235 22236 return self.hash}, {$$s: self})) 22237 }); 22238 22239 $def(self, '$clear', function $$clear() { 22240 var self = this; 22241 22242 22243 self.hash.$clear(); 22244 return self; 22245 }); 22246 22247 $def(self, '$include?', function $Set_include$ques$23(o) { 22248 var self = this; 22249 22250 return self.hash['$include?'](o) 22251 }); 22252 22253 $def(self, '$merge', function $$merge(enum$) { 22254 var self = this; 22255 22256 22257 $send(enum$, 'each', [], function $$24(item){var self = $$24.$$s == null ? this : $$24.$$s; 22258 22259 22260 if (item == null) item = nil; 22261 return self.$add(item);}, {$$s: self}); 22262 return self; 22263 }); 22264 22265 $def(self, '$replace', function $$replace(enum$) { 22266 var self = this; 22267 22268 22269 self.$clear(); 22270 self.$merge(enum$); 22271 return self; 22272 }); 22273 22274 $def(self, '$size', function $$size() { 22275 var self = this; 22276 22277 return self.hash.$size() 22278 }); 22279 22280 $def(self, '$subtract', function $$subtract(enum$) { 22281 var self = this; 22282 22283 22284 $send(enum$, 'each', [], function $$25(item){var self = $$25.$$s == null ? this : $$25.$$s; 22285 22286 22287 if (item == null) item = nil; 22288 return self.$delete(item);}, {$$s: self}); 22289 return self; 22290 }); 22291 22292 $def(self, '$|', function $Set_$$26(enum$) { 22293 var self = this; 22294 22295 22296 if (!$truthy(enum$['$respond_to?']("each"))) { 22297 $Kernel.$raise($$$('ArgumentError'), "value must be enumerable"); 22298 } return self.$dup().$merge(enum$); 22299 }); 22300 22301 function is_set(set) { 22302 ($truthy(($ret_or_1 = (set)['$is_a?']($$$('Set')))) ? ($ret_or_1) : ($Kernel.$raise($$$('ArgumentError'), "value must be a set"))); 22303 } 22304 22305 $def(self, '$superset?', function $Set_superset$ques$27(set) { 22306 var self = this; 22307 22308 22309 is_set(set); 22310 if ($truthy($rb_lt(self.$size(), set.$size()))) { 22311 return false 22312 } return $send(set, 'all?', [], function $$28(o){var self = $$28.$$s == null ? this : $$28.$$s; 22313 22314 22315 if (o == null) o = nil; 22316 return self['$include?'](o);}, {$$s: self}); 22317 }); 22318 22319 $def(self, '$proper_superset?', function $Set_proper_superset$ques$29(set) { 22320 var self = this; 22321 22322 22323 is_set(set); 22324 if ($truthy($rb_le(self.$size(), set.$size()))) { 22325 return false 22326 } return $send(set, 'all?', [], function $$30(o){var self = $$30.$$s == null ? this : $$30.$$s; 22327 22328 22329 if (o == null) o = nil; 22330 return self['$include?'](o);}, {$$s: self}); 22331 }); 22332 22333 $def(self, '$subset?', function $Set_subset$ques$31(set) { 22334 var self = this; 22335 22336 22337 is_set(set); 22338 if ($truthy($rb_lt(set.$size(), self.$size()))) { 22339 return false 22340 } return $send(self, 'all?', [], function $$32(o){ 22341 22342 if (o == null) o = nil; 22343 return set['$include?'](o);}); 22344 }); 22345 22346 $def(self, '$proper_subset?', function $Set_proper_subset$ques$33(set) { 22347 var self = this; 22348 22349 22350 is_set(set); 22351 if ($truthy($rb_le(set.$size(), self.$size()))) { 22352 return false 22353 } return $send(self, 'all?', [], function $$34(o){ 22354 22355 if (o == null) o = nil; 22356 return set['$include?'](o);}); 22357 }); 22358 22359 $def(self, '$intersect?', function $Set_intersect$ques$35(set) { 22360 var self = this; 22361 22362 22363 is_set(set); 22364 if ($truthy($rb_lt(self.$size(), set.$size()))) { 22365 return $send(self, 'any?', [], function $$36(o){ 22366 22367 if (o == null) o = nil; 22368 return set['$include?'](o);}) 22369 } else { 22370 return $send(set, 'any?', [], function $$37(o){var self = $$37.$$s == null ? this : $$37.$$s; 22371 22372 22373 if (o == null) o = nil; 22374 return self['$include?'](o);}, {$$s: self}) 22375 } }); 22376 22377 $def(self, '$disjoint?', function $Set_disjoint$ques$38(set) { 22378 var self = this; 22379 22380 return self['$intersect?'](set)['$!']() 22381 }); 22382 22383 $def(self, '$to_a', function $$to_a() { 22384 var self = this; 22385 22386 return self.hash.$keys() 22387 }); 22388 $alias(self, "+", "|"); 22389 $alias(self, "<", "proper_subset?"); 22390 $alias(self, "<<", "add"); 22391 $alias(self, "<=", "subset?"); 22392 $alias(self, ">", "proper_superset?"); 22393 $alias(self, ">=", "superset?"); 22394 $alias(self, "difference", "-"); 22395 $alias(self, "filter!", "select!"); 22396 $alias(self, "length", "size"); 22397 $alias(self, "map!", "collect!"); 22398 $alias(self, "member?", "include?"); 22399 return $alias(self, "union", "|"); 22400 })('::', null, $nesting) 22401}; 22402 22403Opal.modules["corelib/dir"] = function(Opal) {/* Generated by Opal 1.7.3 */ 22404 var $klass = Opal.klass, $def = Opal.def, $truthy = Opal.truthy, $alias = Opal.alias, nil = Opal.nil, $$$ = Opal.$$$; 22405 22406 Opal.add_stubs('[],pwd'); 22407 return (function($base, $super, $parent_nesting) { 22408 var self = $klass($base, $super, 'Dir'); 22409 22410 return (function(self, $parent_nesting) { 22411 22412 22413 22414 $def(self, '$chdir', function $$chdir(dir) { 22415 var $yield = $$chdir.$$p || nil, prev_cwd = nil; 22416 22417 $$chdir.$$p = null; 22418 return (function() { try { 22419 22420 prev_cwd = Opal.current_dir; 22421 Opal.current_dir = dir; 22422 return Opal.yieldX($yield, []);; 22423 } finally { 22424 Opal.current_dir = prev_cwd; 22425 } })() 22426 }); 22427 22428 $def(self, '$pwd', function $$pwd() { 22429 22430 return Opal.current_dir || '.'; 22431 }); 22432 22433 $def(self, '$home', function $$home() { 22434 var $ret_or_1 = nil; 22435 22436 if ($truthy(($ret_or_1 = $$$('ENV')['$[]']("HOME")))) { 22437 return $ret_or_1 22438 } else { 22439 return "." 22440 } 22441 }); 22442 return $alias(self, "getwd", "pwd"); 22443 })(Opal.get_singleton_class(self)) 22444 })('::', null) 22445}; 22446 22447Opal.modules["corelib/file"] = function(Opal) {/* Generated by Opal 1.7.3 */ 22448 var $truthy = Opal.truthy, $klass = Opal.klass, $const_set = Opal.const_set, $Opal = Opal.Opal, $regexp = Opal.regexp, $rb_plus = Opal.rb_plus, $def = Opal.def, $Kernel = Opal.Kernel, $eqeq = Opal.eqeq, $rb_lt = Opal.rb_lt, $rb_minus = Opal.rb_minus, $range = Opal.range, $send = Opal.send, $slice = Opal.slice, $alias = Opal.alias, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 22449 22450 Opal.add_stubs('respond_to?,to_path,coerce_to!,pwd,split,sub,+,unshift,join,home,raise,start_with?,absolute_path,==,<,dirname,-,basename,empty?,rindex,[],length,nil?,gsub,find,=~,map,each_with_index,flatten,reject,to_proc,end_with?,expand_path,exist?'); 22451 return (function($base, $super, $parent_nesting) { 22452 var self = $klass($base, $super, 'File'); 22453 22454 var $nesting = [self].concat($parent_nesting), windows_root_rx = nil; 22455 22456 22457 $const_set($nesting[0], 'Separator', $const_set($nesting[0], 'SEPARATOR', "/")); 22458 $const_set($nesting[0], 'ALT_SEPARATOR', nil); 22459 $const_set($nesting[0], 'PATH_SEPARATOR', ":"); 22460 $const_set($nesting[0], 'FNM_SYSCASE', 0); 22461 windows_root_rx = /^[a-zA-Z]:(?:\\|\/)/; 22462 return (function(self, $parent_nesting) { 22463 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 22464 22465 22466 22467 $def(self, '$absolute_path', function $$absolute_path(path, basedir) { 22468 var sep = nil, sep_chars = nil, new_parts = nil, $ret_or_1 = nil, path_abs = nil, basedir_abs = nil, parts = nil, leading_sep = nil, abs = nil, new_path = nil; 22469 22470 22471 if (basedir == null) basedir = nil; 22472 sep = $$('SEPARATOR'); 22473 sep_chars = $sep_chars(); 22474 new_parts = []; 22475 path = ($truthy(path['$respond_to?']("to_path")) ? (path.$to_path()) : (path)); 22476 path = $Opal['$coerce_to!'](path, $$$('String'), "to_str"); 22477 basedir = ($truthy(($ret_or_1 = basedir)) ? ($ret_or_1) : ($$$('Dir').$pwd())); 22478 path_abs = path.substr(0, sep.length) === sep || windows_root_rx.test(path); 22479 basedir_abs = basedir.substr(0, sep.length) === sep || windows_root_rx.test(basedir); 22480 if ($truthy(path_abs)) { 22481 22482 parts = path.$split($regexp(["[", sep_chars, "]"])); 22483 leading_sep = windows_root_rx.test(path) ? '' : path.$sub($regexp(["^([", sep_chars, "]+).*$"]), "\\1"); 22484 abs = true; 22485 } else { 22486 22487 parts = $rb_plus(basedir.$split($regexp(["[", sep_chars, "]"])), path.$split($regexp(["[", sep_chars, "]"]))); 22488 leading_sep = windows_root_rx.test(basedir) ? '' : basedir.$sub($regexp(["^([", sep_chars, "]+).*$"]), "\\1"); 22489 abs = basedir_abs; 22490 } 22491 var part; 22492 for (var i = 0, ii = parts.length; i < ii; i++) { 22493 part = parts[i]; 22494 22495 if ( 22496 (part === nil) || 22497 (part === '' && ((new_parts.length === 0) || abs)) || 22498 (part === '.' && ((new_parts.length === 0) || abs)) 22499 ) { 22500 continue; 22501 } 22502 if (part === '..') { 22503 new_parts.pop(); 22504 } else { 22505 new_parts.push(part); 22506 } 22507 } 22508 22509 if (!abs && parts[0] !== '.') { 22510 new_parts.$unshift("."); 22511 } 22512 new_path = new_parts.$join(sep); 22513 if ($truthy(abs)) { 22514 new_path = $rb_plus(leading_sep, new_path); 22515 } return new_path; 22516 }, -2); 22517 22518 $def(self, '$expand_path', function $$expand_path(path, basedir) { 22519 var self = this, sep = nil, sep_chars = nil, home = nil, leading_sep = nil, home_path_regexp = nil; 22520 22521 22522 if (basedir == null) basedir = nil; 22523 sep = $$('SEPARATOR'); 22524 sep_chars = $sep_chars(); 22525 if ($truthy(path[0] === '~' || (basedir && basedir[0] === '~'))) { 22526 22527 home = $$('Dir').$home(); 22528 if (!$truthy(home)) { 22529 $Kernel.$raise($$$('ArgumentError'), "couldn't find HOME environment -- expanding `~'"); 22530 } leading_sep = windows_root_rx.test(home) ? '' : home.$sub($regexp(["^([", sep_chars, "]+).*$"]), "\\1"); 22531 if (!$truthy(home['$start_with?'](leading_sep))) { 22532 $Kernel.$raise($$$('ArgumentError'), "non-absolute home"); 22533 } home = $rb_plus(home, sep); 22534 home_path_regexp = $regexp(["^\\~(?:", sep, "|$)"]); 22535 path = path.$sub(home_path_regexp, home); 22536 if ($truthy(basedir)) { 22537 basedir = basedir.$sub(home_path_regexp, home); 22538 } } return self.$absolute_path(path, basedir); 22539 }, -2); 22540 22541 // Coerce a given path to a path string using #to_path and #to_str 22542 function $coerce_to_path(path) { 22543 if ($truthy((path)['$respond_to?']("to_path"))) { 22544 path = path.$to_path(); 22545 } 22546 22547 path = $Opal['$coerce_to!'](path, $$$('String'), "to_str"); 22548 22549 return path; 22550 } 22551 22552 // Return a RegExp compatible char class 22553 function $sep_chars() { 22554 if ($$('ALT_SEPARATOR') === nil) { 22555 return Opal.escape_regexp($$('SEPARATOR')); 22556 } else { 22557 return Opal.escape_regexp($rb_plus($$('SEPARATOR'), $$('ALT_SEPARATOR'))); 22558 } 22559 } 22560 22561 $def(self, '$dirname', function $$dirname(path, level) { 22562 var self = this, sep_chars = nil; 22563 22564 22565 if (level == null) level = 1; 22566 if ($eqeq(level, 0)) { 22567 return path 22568 } if ($truthy($rb_lt(level, 0))) { 22569 $Kernel.$raise($$$('ArgumentError'), "level can't be negative"); 22570 } sep_chars = $sep_chars(); 22571 path = $coerce_to_path(path); 22572 22573 var absolute = path.match(new RegExp("^[" + (sep_chars) + "]")), out; 22574 22575 path = path.replace(new RegExp("[" + (sep_chars) + "]+$"), ''); // remove trailing separators 22576 path = path.replace(new RegExp("[^" + (sep_chars) + "]+$"), ''); // remove trailing basename 22577 path = path.replace(new RegExp("[" + (sep_chars) + "]+$"), ''); // remove final trailing separators 22578 22579 if (path === '') { 22580 out = absolute ? '/' : '.'; 22581 } 22582 else { 22583 out = path; 22584 } 22585 22586 if (level == 1) { 22587 return out; 22588 } 22589 else { 22590 return self.$dirname(out, $rb_minus(level, 1)) 22591 } 22592 }, -2); 22593 22594 $def(self, '$basename', function $$basename(name, suffix) { 22595 var sep_chars = nil; 22596 22597 22598 if (suffix == null) suffix = nil; 22599 sep_chars = $sep_chars(); 22600 name = $coerce_to_path(name); 22601 22602 if (name.length == 0) { 22603 return name; 22604 } 22605 22606 if (suffix !== nil) { 22607 suffix = $Opal['$coerce_to!'](suffix, $$$('String'), "to_str"); 22608 } else { 22609 suffix = null; 22610 } 22611 22612 name = name.replace(new RegExp("(.)[" + (sep_chars) + "]*$"), '$1'); 22613 name = name.replace(new RegExp("^(?:.*[" + (sep_chars) + "])?([^" + (sep_chars) + "]+)$"), '$1'); 22614 22615 if (suffix === ".*") { 22616 name = name.replace(/\.[^\.]+$/, ''); 22617 } else if(suffix !== null) { 22618 suffix = Opal.escape_regexp(suffix); 22619 name = name.replace(new RegExp("" + (suffix) + "$"), ''); 22620 } 22621 22622 return name; 22623 }, -2); 22624 22625 $def(self, '$extname', function $$extname(path) { 22626 var self = this, filename = nil, last_dot_idx = nil; 22627 22628 22629 path = $coerce_to_path(path); 22630 filename = self.$basename(path); 22631 if ($truthy(filename['$empty?']())) { 22632 return "" 22633 } last_dot_idx = filename['$[]']($range(1, -1, false)).$rindex("."); 22634 if (($truthy(last_dot_idx['$nil?']()) || ($eqeq($rb_plus(last_dot_idx, 1), $rb_minus(filename.$length(), 1))))) { 22635 return "" 22636 } else { 22637 return filename['$[]'](Opal.Range.$new($rb_plus(last_dot_idx, 1), -1, false)) 22638 } }); 22639 22640 $def(self, '$exist?', function $exist$ques$1(path) { 22641 22642 return Opal.modules[path] != null 22643 }); 22644 22645 $def(self, '$directory?', function $directory$ques$2(path) { 22646 var files = nil; 22647 22648 22649 files = []; 22650 22651 for (var key in Opal.modules) { 22652 files.push(key); 22653 } 22654 path = path.$gsub($regexp(["(^.", $$('SEPARATOR'), "+|", $$('SEPARATOR'), "+$)"])); 22655 return $send(files, 'find', [], function $$3(f){ 22656 22657 if (f == null) f = nil; 22658 return f['$=~']($regexp(["^", path]));}); 22659 }); 22660 22661 $def(self, '$join', function $$join($a) { 22662 var $post_args, paths, result = nil; 22663 22664 22665 $post_args = $slice(arguments); 22666 paths = $post_args; 22667 if ($truthy(paths['$empty?']())) { 22668 return "" 22669 } result = ""; 22670 paths = $send(paths.$flatten().$each_with_index(), 'map', [], function $$4(item, index){ 22671 22672 if (item == null) item = nil; 22673 if (index == null) index = nil; 22674 if (($eqeq(index, 0) && ($truthy(item['$empty?']())))) { 22675 return $$('SEPARATOR') 22676 } else if (($eqeq(paths.$length(), $rb_plus(index, 1)) && ($truthy(item['$empty?']())))) { 22677 return $$('SEPARATOR') 22678 } else { 22679 return item 22680 }}); 22681 paths = $send(paths, 'reject', [], "empty?".$to_proc()); 22682 $send(paths, 'each_with_index', [], function $$5(item, index){var next_item = nil; 22683 22684 22685 if (item == null) item = nil; 22686 if (index == null) index = nil; 22687 next_item = paths['$[]']($rb_plus(index, 1)); 22688 if ($truthy(next_item['$nil?']())) { 22689 return (result = "" + (result) + (item)) 22690 } else { 22691 22692 if (($truthy(item['$end_with?']($$('SEPARATOR'))) && ($truthy(next_item['$start_with?']($$('SEPARATOR')))))) { 22693 item = item.$sub($regexp([$$('SEPARATOR'), "+$"]), ""); 22694 } return (result = (($truthy(item['$end_with?']($$('SEPARATOR'))) || ($truthy(next_item['$start_with?']($$('SEPARATOR'))))) ? ("" + (result) + (item)) : ("" + (result) + (item) + ($$('SEPARATOR'))))); 22695 }}); 22696 return result; 22697 }, -1); 22698 22699 $def(self, '$split', function $$split(path) { 22700 22701 return path.$split($$('SEPARATOR')) 22702 }); 22703 $alias(self, "realpath", "expand_path"); 22704 return $alias(self, "exists?", "exist?"); 22705 })(Opal.get_singleton_class(self), $nesting); 22706 })('::', $$$('IO'), $nesting) 22707}; 22708 22709Opal.modules["corelib/process/base"] = function(Opal) {/* Generated by Opal 1.7.3 */ 22710 var $klass = Opal.klass, $slice = Opal.slice, $defs = Opal.defs, $return_val = Opal.return_val, nil = Opal.nil; 22711 22712 22713 (function($base, $super) { 22714 var self = $klass($base, $super, 'Signal'); 22715 22716 22717 return $defs(self, '$trap', function $$trap($a) { 22718 22719 22720 $slice(arguments); 22721 return nil; 22722 }, -1) 22723 })('::', null); 22724 return (function($base, $super) { 22725 var self = $klass($base, $super, 'GC'); 22726 22727 22728 return $defs(self, '$start', $return_val(nil)) 22729 })('::', null); 22730}; 22731 22732Opal.modules["corelib/process"] = function(Opal) {/* Generated by Opal 1.7.3 */ 22733 var $module = Opal.module, $defs = Opal.defs, $truthy = Opal.truthy, $return_val = Opal.return_val, $Kernel = Opal.Kernel, nil = Opal.nil, $$$ = Opal.$$$; 22734 22735 Opal.add_stubs('const_set,size,<<,__register_clock__,to_f,now,new,[],raise'); 22736 return (function($base) { 22737 var self = $module($base, 'Process'); 22738 22739 var monotonic = nil; 22740 22741 22742 self.__clocks__ = []; 22743 $defs(self, '$__register_clock__', function $$__register_clock__(name, func) { 22744 var self = this; 22745 if (self.__clocks__ == null) self.__clocks__ = nil; 22746 22747 22748 self.$const_set(name, self.__clocks__.$size()); 22749 return self.__clocks__['$<<'](func); 22750 }); 22751 self.$__register_clock__("CLOCK_REALTIME", function() { return Date.now() }); 22752 monotonic = false; 22753 22754 if (Opal.global.performance) { 22755 monotonic = function() { 22756 return performance.now() 22757 }; 22758 } 22759 else if (Opal.global.process && process.hrtime) { 22760 // let now be the base to get smaller numbers 22761 var hrtime_base = process.hrtime(); 22762 22763 monotonic = function() { 22764 var hrtime = process.hrtime(hrtime_base); 22765 var us = (hrtime[1] / 1000) | 0; // cut below microsecs; 22766 return ((hrtime[0] * 1000) + (us / 1000)); 22767 }; 22768 } 22769 if ($truthy(monotonic)) { 22770 self.$__register_clock__("CLOCK_MONOTONIC", monotonic); 22771 } $defs(self, '$pid', $return_val(0)); 22772 $defs(self, '$times', function $$times() { 22773 var t = nil; 22774 22775 22776 t = $$$('Time').$now().$to_f(); 22777 return $$$($$$('Benchmark'), 'Tms').$new(t, t, t, t, t); 22778 }); 22779 return $defs(self, '$clock_gettime', function $$clock_gettime(clock_id, unit) { 22780 var self = this, clock = nil; 22781 if (self.__clocks__ == null) self.__clocks__ = nil; 22782 22783 22784 if (unit == null) unit = "float_second"; 22785 if ($truthy(((clock = self.__clocks__['$[]'](clock_id))))) ; else { 22786 $Kernel.$raise($$$($$$('Errno'), 'EINVAL'), "clock_gettime(" + (clock_id) + ") " + (self.__clocks__['$[]'](clock_id))); 22787 } 22788 var ms = clock(); 22789 switch (unit) { 22790 case 'float_second': return (ms / 1000); // number of seconds as a float (default) 22791 case 'float_millisecond': return (ms / 1); // number of milliseconds as a float 22792 case 'float_microsecond': return (ms * 1000); // number of microseconds as a float 22793 case 'second': return ((ms / 1000) | 0); // number of seconds as an integer 22794 case 'millisecond': return ((ms / 1) | 0); // number of milliseconds as an integer 22795 case 'microsecond': return ((ms * 1000) | 0); // number of microseconds as an integer 22796 case 'nanosecond': return ((ms * 1000000) | 0); // number of nanoseconds as an integer 22797 default: $Kernel.$raise($$$('ArgumentError'), "unexpected unit: " + (unit)); 22798 } 22799 }, -2); 22800 })('::') 22801}; 22802 22803Opal.modules["corelib/random/formatter"] = function(Opal) {/* Generated by Opal 1.7.3 */ 22804 var $klass = Opal.klass, $module = Opal.module, $def = Opal.def, $range = Opal.range, $send = Opal.send, $rb_divide = Opal.rb_divide, $Kernel = Opal.Kernel, $Opal = Opal.Opal, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 22805 22806 Opal.add_stubs('_verify_count,bytes,encode,strict_encode64,random_bytes,urlsafe_encode64,split,hex,[]=,[],map,to_proc,join,times,<<,|,ord,/,abs,random_float,raise,coerce_to!,flatten,new,random_number,length,include,extend'); 22807 return (function($base, $super, $parent_nesting) { 22808 var self = $klass($base, $super, 'Random'); 22809 22810 var $nesting = [self].concat($parent_nesting); 22811 22812 22813 (function($base, $parent_nesting) { 22814 var self = $module($base, 'Formatter'); 22815 22816 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 22817 22818 22819 22820 $def(self, '$hex', function $$hex(count) { 22821 var self = this; 22822 22823 22824 if (count == null) count = nil; 22825 count = $$$('Random').$_verify_count(count); 22826 22827 var bytes = self.$bytes(count); 22828 var out = ""; 22829 for (var i = 0; i < count; i++) { 22830 out += bytes.charCodeAt(i).toString(16).padStart(2, '0'); 22831 } 22832 return (out).$encode("US-ASCII"); 22833 }, -1); 22834 22835 $def(self, '$random_bytes', function $$random_bytes(count) { 22836 var self = this; 22837 22838 22839 if (count == null) count = nil; 22840 return self.$bytes(count); 22841 }, -1); 22842 22843 $def(self, '$base64', function $$base64(count) { 22844 var self = this; 22845 22846 22847 if (count == null) count = nil; 22848 return $$$('Base64').$strict_encode64(self.$random_bytes(count)).$encode("US-ASCII"); 22849 }, -1); 22850 22851 $def(self, '$urlsafe_base64', function $$urlsafe_base64(count, padding) { 22852 var self = this; 22853 22854 22855 if (count == null) count = nil; 22856 if (padding == null) padding = false; 22857 return $$$('Base64').$urlsafe_encode64(self.$random_bytes(count), padding).$encode("US-ASCII"); 22858 }, -1); 22859 22860 $def(self, '$uuid', function $$uuid() { 22861 var self = this, str = nil; 22862 22863 22864 str = self.$hex(16).$split(""); 22865 str['$[]='](12, "4"); 22866 str['$[]='](16, (parseInt(str['$[]'](16), 16) & 3 | 8).toString(16)); 22867 str = [str['$[]']($range(0, 8, true)), str['$[]']($range(8, 12, true)), str['$[]']($range(12, 16, true)), str['$[]']($range(16, 20, true)), str['$[]']($range(20, 32, true))]; 22868 str = $send(str, 'map', [], "join".$to_proc()); 22869 return str.$join("-"); 22870 }); 22871 22872 $def(self, '$random_float', function $$random_float() { 22873 var self = this, bs = nil, num = nil; 22874 22875 22876 bs = self.$bytes(4); 22877 num = 0; 22878 $send((4), 'times', [], function $$1(i){ 22879 22880 if (i == null) i = nil; 22881 num = num['$<<'](8); 22882 return (num = num['$|'](bs['$[]'](i).$ord()));}); 22883 return $rb_divide(num.$abs(), 2147483647); 22884 }); 22885 22886 $def(self, '$random_number', function $$random_number(limit) { 22887 var self = this; 22888 22889 function randomFloat() { 22890 return self.$random_float(); 22891 } 22892 22893 function randomInt(max) { 22894 return Math.floor(randomFloat() * max); 22895 } 22896 22897 function randomRange() { 22898 var min = limit.begin, 22899 max = limit.end; 22900 22901 if (min === nil || max === nil) { 22902 return nil; 22903 } 22904 22905 var length = max - min; 22906 22907 if (length < 0) { 22908 return nil; 22909 } 22910 22911 if (length === 0) { 22912 return min; 22913 } 22914 22915 if (max % 1 === 0 && min % 1 === 0 && !limit.excl) { 22916 length++; 22917 } 22918 22919 return randomInt(length) + min; 22920 } 22921 22922 if (limit == null) { 22923 return randomFloat(); 22924 } else if (limit.$$is_range) { 22925 return randomRange(); 22926 } else if (limit.$$is_number) { 22927 if (limit <= 0) { 22928 $Kernel.$raise($$$('ArgumentError'), "invalid argument - " + (limit)); 22929 } 22930 22931 if (limit % 1 === 0) { 22932 // integer 22933 return randomInt(limit); 22934 } else { 22935 return randomFloat() * limit; 22936 } 22937 } else { 22938 limit = $Opal['$coerce_to!'](limit, $$$('Integer'), "to_int"); 22939 22940 if (limit <= 0) { 22941 $Kernel.$raise($$$('ArgumentError'), "invalid argument - " + (limit)); 22942 } 22943 22944 return randomInt(limit); 22945 } 22946 }, -1); 22947 return $def(self, '$alphanumeric', function $$alphanumeric(count) { 22948 var self = this, map = nil; 22949 22950 22951 if (count == null) count = nil; 22952 count = $$('Random').$_verify_count(count); 22953 map = $send([$range("0", "9", false), $range("a", "z", false), $range("A", "Z", false)], 'map', [], "to_a".$to_proc()).$flatten(); 22954 return $send($$$('Array'), 'new', [count], function $$2(i){var self = $$2.$$s == null ? this : $$2.$$s; 22955 return map['$[]'](self.$random_number(map.$length()));}, {$$s: self}).$join(); 22956 }, -1); 22957 })(self, $nesting); 22958 self.$include($$$($$$('Random'), 'Formatter')); 22959 return self.$extend($$$($$$('Random'), 'Formatter')); 22960 })('::', null, $nesting) 22961}; 22962 22963Opal.modules["corelib/random/mersenne_twister"] = function(Opal) {/* Generated by Opal 1.7.3 */ 22964 var $klass = Opal.klass, $const_set = Opal.const_set, $send = Opal.send, nil = Opal.nil, $$$ = Opal.$$$, mersenne_twister = nil; 22965 22966 Opal.add_stubs('generator='); 22967 22968 mersenne_twister = (function() { 22969 /* Period parameters */ 22970 var N = 624; 22971 var M = 397; 22972 var MATRIX_A = 0x9908b0df; /* constant vector a */ 22973 var UMASK = 0x80000000; /* most significant w-r bits */ 22974 var LMASK = 0x7fffffff; /* least significant r bits */ 22975 var MIXBITS = function(u,v) { return ( ((u) & UMASK) | ((v) & LMASK) ); }; 22976 var TWIST = function(u,v) { return (MIXBITS((u),(v)) >>> 1) ^ ((v & 0x1) ? MATRIX_A : 0x0); }; 22977 22978 function init(s) { 22979 var mt = {left: 0, next: N, state: new Array(N)}; 22980 init_genrand(mt, s); 22981 return mt; 22982 } 22983 22984 /* initializes mt[N] with a seed */ 22985 function init_genrand(mt, s) { 22986 var j; 22987 mt.state[0] = s >>> 0; 22988 for (j=1; j<N; j++) { 22989 mt.state[j] = (1812433253 * ((mt.state[j-1] ^ (mt.state[j-1] >> 30) >>> 0)) + j); 22990 /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ 22991 /* In the previous versions, MSBs of the seed affect */ 22992 /* only MSBs of the array state[]. */ 22993 /* 2002/01/09 modified by Makoto Matsumoto */ 22994 mt.state[j] &= 0xffffffff; /* for >32 bit machines */ 22995 } 22996 mt.left = 1; 22997 mt.next = N; 22998 } 22999 23000 /* generate N words at one time */ 23001 function next_state(mt) { 23002 var p = 0, _p = mt.state; 23003 var j; 23004 23005 mt.left = N; 23006 mt.next = 0; 23007 23008 for (j=N-M+1; --j; p++) 23009 _p[p] = _p[p+(M)] ^ TWIST(_p[p+(0)], _p[p+(1)]); 23010 23011 for (j=M; --j; p++) 23012 _p[p] = _p[p+(M-N)] ^ TWIST(_p[p+(0)], _p[p+(1)]); 23013 23014 _p[p] = _p[p+(M-N)] ^ TWIST(_p[p+(0)], _p[0]); 23015 } 23016 23017 /* generates a random number on [0,0xffffffff]-interval */ 23018 function genrand_int32(mt) { 23019 /* mt must be initialized */ 23020 var y; 23021 23022 if (--mt.left <= 0) next_state(mt); 23023 y = mt.state[mt.next++]; 23024 23025 /* Tempering */ 23026 y ^= (y >>> 11); 23027 y ^= (y << 7) & 0x9d2c5680; 23028 y ^= (y << 15) & 0xefc60000; 23029 y ^= (y >>> 18); 23030 23031 return y >>> 0; 23032 } 23033 23034 function int_pair_to_real_exclusive(a, b) { 23035 a >>>= 5; 23036 b >>>= 6; 23037 return (a*67108864.0+b)*(1.0/9007199254740992.0); 23038 } 23039 23040 // generates a random number on [0,1) with 53-bit resolution 23041 function genrand_real(mt) { 23042 /* mt must be initialized */ 23043 var a = genrand_int32(mt), b = genrand_int32(mt); 23044 return int_pair_to_real_exclusive(a, b); 23045 } 23046 23047 return { genrand_real: genrand_real, init: init }; 23048})(); 23049 return (function($base, $super) { 23050 var self = $klass($base, $super, 'Random'); 23051 23052 var $a; 23053 23054 23055 var MAX_INT = Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1; 23056 $const_set(self, 'MERSENNE_TWISTER_GENERATOR', { 23057 new_seed: function() { return Math.round(Math.random() * MAX_INT); }, 23058 reseed: function(seed) { return mersenne_twister.init(seed); }, 23059 rand: function(mt) { return mersenne_twister.genrand_real(mt); } 23060 }); 23061 return ($a = [$$$(self, 'MERSENNE_TWISTER_GENERATOR')], $send(self, 'generator=', $a), $a[$a.length - 1]); 23062 })('::', null); 23063}; 23064 23065Opal.modules["corelib/random"] = function(Opal) {/* Generated by Opal 1.7.3 */ 23066 var $truthy = Opal.truthy, $klass = Opal.klass, $Kernel = Opal.Kernel, $defs = Opal.defs, $Opal = Opal.Opal, $def = Opal.def, $eqeqeq = Opal.eqeqeq, $send = Opal.send, self = Opal.top, nil = Opal.nil, $$$ = Opal.$$$; 23067 23068 Opal.add_stubs('require,attr_reader,to_int,raise,new_seed,coerce_to!,reseed,rand,seed,bytes,===,==,state,_verify_count,encode,join,new,chr,random_number,random_float,const_defined?,const_set'); 23069 23070 self.$require("corelib/random/formatter"); 23071 (function($base, $super) { 23072 var self = $klass($base, $super, 'Random'); 23073 23074 23075 23076 self.$attr_reader("seed", "state"); 23077 $defs(self, '$_verify_count', function $$_verify_count(count) { 23078 23079 23080 if (!$truthy(count)) count = 16; 23081 if (typeof count !== "number") count = (count).$to_int(); 23082 if (count < 0) $Kernel.$raise($$$('ArgumentError'), "negative string size (or size too big)"); 23083 count = Math.floor(count); 23084 return count; 23085 23086 }); 23087 23088 $def(self, '$initialize', function $$initialize(seed) { 23089 var self = this; 23090 23091 23092 if (seed == null) seed = $$$('Random').$new_seed(); 23093 seed = $Opal['$coerce_to!'](seed, $$$('Integer'), "to_int"); 23094 self.state = seed; 23095 return self.$reseed(seed); 23096 }, -1); 23097 23098 $def(self, '$reseed', function $$reseed(seed) { 23099 var self = this; 23100 23101 23102 self.seed = seed; 23103 return self.$rng = Opal.$$rand.reseed(seed); }); 23104 $defs(self, '$new_seed', function $$new_seed() { 23105 23106 return Opal.$$rand.new_seed(); 23107 }); 23108 $defs(self, '$rand', function $$rand(limit) { 23109 var self = this; 23110 return $$$(self, 'DEFAULT').$rand(limit); 23111 }, -1); 23112 $defs(self, '$srand', function $$srand(n) { 23113 var self = this, previous_seed = nil; 23114 23115 23116 if (n == null) n = $$$('Random').$new_seed(); 23117 n = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int"); 23118 previous_seed = $$$(self, 'DEFAULT').$seed(); 23119 $$$(self, 'DEFAULT').$reseed(n); 23120 return previous_seed; 23121 }, -1); 23122 $defs(self, '$urandom', function $$urandom(size) { 23123 23124 return $$$('SecureRandom').$bytes(size) 23125 }); 23126 23127 $def(self, '$==', function $Random_$eq_eq$1(other) { 23128 var self = this, $ret_or_1 = nil; 23129 23130 23131 if (!$eqeqeq($$$('Random'), other)) { 23132 return false 23133 } if ($truthy(($ret_or_1 = self.$seed()['$=='](other.$seed())))) { 23134 return self.$state()['$=='](other.$state()) 23135 } else { 23136 return $ret_or_1 23137 } }); 23138 23139 $def(self, '$bytes', function $$bytes(length) { 23140 var self = this; 23141 23142 23143 length = $$$('Random').$_verify_count(length); 23144 return $send($$$('Array'), 'new', [length], function $$2(){var self = $$2.$$s == null ? this : $$2.$$s; 23145 23146 return self.$rand(255).$chr()}, {$$s: self}).$join().$encode("ASCII-8BIT"); 23147 }); 23148 $defs(self, '$bytes', function $$bytes(length) { 23149 var self = this; 23150 23151 return $$$(self, 'DEFAULT').$bytes(length) 23152 }); 23153 23154 $def(self, '$rand', function $$rand(limit) { 23155 var self = this; 23156 return self.$random_number(limit); 23157 }, -1); 23158 23159 $def(self, '$random_float', function $$random_float() { 23160 var self = this; 23161 23162 23163 self.state++; 23164 return Opal.$$rand.rand(self.$rng); 23165 23166 }); 23167 $defs(self, '$random_float', function $$random_float() { 23168 var self = this; 23169 23170 return $$$(self, 'DEFAULT').$random_float() 23171 }); 23172 return $defs(self, '$generator=', function $Random_generator$eq$3(generator) { 23173 var self = this; 23174 23175 23176 Opal.$$rand = generator; 23177 if ($truthy(self['$const_defined?']("DEFAULT"))) { 23178 return $$$(self, 'DEFAULT').$reseed() 23179 } else { 23180 return self.$const_set("DEFAULT", self.$new(self.$new_seed())) 23181 } }); 23182 })('::', null); 23183 return self.$require("corelib/random/mersenne_twister"); 23184}; 23185 23186Opal.modules["corelib/unsupported"] = function(Opal) {/* Generated by Opal 1.7.3 */ 23187 var $Kernel = Opal.Kernel, $klass = Opal.klass, $send = Opal.send, $slice = Opal.slice, $module = Opal.module, $def = Opal.def, $return_val = Opal.return_val, $alias = Opal.alias, $defs = Opal.defs, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 23188 23189 Opal.add_stubs('raise,warn,each,define_method,%,public,private_method_defined?,private_class_method,instance_method,instance_methods,method_defined?,private_methods'); 23190 23191 23192 var warnings = {}; 23193 23194 function handle_unsupported_feature(message) { 23195 switch (Opal.config.unsupported_features_severity) { 23196 case 'error': 23197 $Kernel.$raise($$$('NotImplementedError'), message); 23198 break; 23199 case 'warning': 23200 warn(message); 23201 break; 23202 // noop 23203 } 23204 } 23205 23206 function warn(string) { 23207 if (warnings[string]) { 23208 return; 23209 } 23210 23211 warnings[string] = true; 23212 self.$warn(string); 23213 } 23214 (function($base, $super) { 23215 var self = $klass($base, $super, 'String'); 23216 23217 23218 23219 var ERROR = "String#%s not supported. Mutable String methods are not supported in Opal."; 23220 return $send(["<<", "capitalize!", "chomp!", "chop!", "downcase!", "gsub!", "lstrip!", "next!", "reverse!", "slice!", "squeeze!", "strip!", "sub!", "succ!", "swapcase!", "tr!", "tr_s!", "upcase!", "prepend", "[]=", "clear", "encode!", "unicode_normalize!"], 'each', [], function $String$1(method_name){var self = $String$1.$$s == null ? this : $String$1.$$s; 23221 23222 23223 if (method_name == null) method_name = nil; 23224 return $send(self, 'define_method', [method_name], function $$2($a){ 23225 23226 $slice(arguments); 23227 return $Kernel.$raise($$$('NotImplementedError'), (ERROR)['$%'](method_name));}, -1);}, {$$s: self}); 23228 })('::', null); 23229 (function($base) { 23230 var self = $module($base, 'Kernel'); 23231 23232 23233 23234 var ERROR = "Object tainting is not supported by Opal"; 23235 23236 $def(self, '$taint', function $$taint() { 23237 var self = this; 23238 23239 23240 handle_unsupported_feature(ERROR); 23241 return self; 23242 }); 23243 23244 $def(self, '$untaint', function $$untaint() { 23245 var self = this; 23246 23247 23248 handle_unsupported_feature(ERROR); 23249 return self; 23250 }); 23251 return $def(self, '$tainted?', function $Kernel_tainted$ques$3() { 23252 23253 23254 handle_unsupported_feature(ERROR); 23255 return false; 23256 }); 23257 })('::'); 23258 (function($base, $super) { 23259 var self = $klass($base, $super, 'Module'); 23260 23261 23262 23263 23264 $def(self, '$public', function $Module_public$4($a) { 23265 var $post_args, methods, self = this; 23266 23267 23268 $post_args = $slice(arguments); 23269 methods = $post_args; 23270 23271 if (methods.length === 0) { 23272 self.$$module_function = false; 23273 return nil; 23274 } 23275 return (methods.length === 1) ? methods[0] : methods; 23276 }, -1); 23277 23278 $def(self, '$private_class_method', function $$private_class_method($a) { 23279 var $post_args, methods; 23280 23281 23282 $post_args = $slice(arguments); 23283 methods = $post_args; 23284 return (methods.length === 1) ? methods[0] : methods; }, -1); 23285 23286 $def(self, '$private_method_defined?', $return_val(false)); 23287 23288 $def(self, '$private_constant', function $$private_constant($a) { 23289 23290 23291 $slice(arguments); 23292 return nil; 23293 }, -1); 23294 $alias(self, "nesting", "public"); 23295 $alias(self, "private", "public"); 23296 $alias(self, "protected", "public"); 23297 $alias(self, "protected_method_defined?", "private_method_defined?"); 23298 $alias(self, "public_class_method", "private_class_method"); 23299 $alias(self, "public_instance_method", "instance_method"); 23300 $alias(self, "public_instance_methods", "instance_methods"); 23301 return $alias(self, "public_method_defined?", "method_defined?"); 23302 })('::', null); 23303 (function($base) { 23304 var self = $module($base, 'Kernel'); 23305 23306 23307 23308 23309 $def(self, '$private_methods', function $$private_methods($a) { 23310 23311 23312 $slice(arguments); 23313 return []; 23314 }, -1); 23315 $alias(self, "protected_methods", "private_methods"); 23316 $alias(self, "private_instance_methods", "private_methods"); 23317 return $alias(self, "protected_instance_methods", "private_methods"); 23318 })('::'); 23319 (function($base, $parent_nesting) { 23320 var self = $module($base, 'Kernel'); 23321 23322 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 23323 23324 return $def(self, '$eval', function $Kernel_eval$5($a) { 23325 23326 23327 $slice(arguments); 23328 return $Kernel.$raise($$$('NotImplementedError'), "To use Kernel#eval, you must first require 'opal-parser'. " + ("See https://github.com/opal/opal/blob/" + ($$('RUBY_ENGINE_VERSION')) + "/docs/opal_parser.md for details.")); 23329 }, -1) 23330 })('::', $nesting); 23331 $defs(self, '$public', function $public$6($a) { 23332 var $post_args, methods; 23333 23334 23335 $post_args = $slice(arguments); 23336 methods = $post_args; 23337 return (methods.length === 1) ? methods[0] : methods; }, -1); 23338 return $defs(self, '$private', function $private$7($a) { 23339 var $post_args, methods; 23340 23341 23342 $post_args = $slice(arguments); 23343 methods = $post_args; 23344 return (methods.length === 1) ? methods[0] : methods; }, -1); 23345}; 23346 23347Opal.queue(function(Opal) {/* Generated by Opal 1.7.3 */ 23348 var $Object = Opal.Object; Opal.nil; 23349 23350 Opal.add_stubs('require,autoload'); 23351 23352 $Object.$require("opal/base"); 23353 $Object.$require("opal/mini"); 23354 $Object.$require("corelib/kernel/format"); 23355 $Object.$require("corelib/string/encoding"); 23356 $Object.$autoload("Math", "corelib/math"); 23357 $Object.$require("corelib/complex/base"); 23358 $Object.$autoload("Complex", "corelib/complex"); 23359 $Object.$require("corelib/rational/base"); 23360 $Object.$autoload("Rational", "corelib/rational"); 23361 $Object.$require("corelib/time"); 23362 $Object.$autoload("Struct", "corelib/struct"); 23363 $Object.$autoload("Set", "corelib/set"); 23364 $Object.$autoload("Dir", "corelib/dir"); 23365 $Object.$autoload("File", "corelib/file"); 23366 $Object.$require("corelib/process/base"); 23367 $Object.$autoload("Process", "corelib/process"); 23368 $Object.$autoload("Random", "corelib/random"); 23369 return $Object.$require("corelib/unsupported"); 23370}); 23371 23372 23373var Opal$1 = Opal; 23374 23375Opal.modules["nodejs/base"] = function(Opal) {/* Generated by Opal 1.7.3 */ 23376 var $module = Opal.module, $const_set = Opal.const_set, $eqeq = Opal.eqeq, $lambda = Opal.lambda, $send = Opal.send, $a, $nesting = [], $$ = Opal.$r($nesting), nil = Opal.nil; 23377 23378 Opal.add_stubs('==,first,shift,write_proc=,read_proc=,tty='); 23379 23380 (function($base, $parent_nesting) { 23381 var self = $module($base, 'NodeJS'); 23382 23383 var $nesting = [self].concat($parent_nesting); 23384 23385 return $const_set($nesting[0], 'VERSION', process.version) 23386 })($nesting[0], $nesting); 23387 Opal.exit = process.exit; 23388 $const_set($nesting[0], 'ARGV', process.argv.slice(2)); 23389 if ($eqeq($$('ARGV').$first(), "--")) { 23390 $$('ARGV').$shift(); 23391 } $$('STDOUT')['$write_proc=']($lambda(function $$1(string){ 23392 23393 if (string == null) string = nil; 23394 return process.stdout.write(string);})); 23395 $$('STDERR')['$write_proc=']($lambda(function $$2(string){ 23396 23397 if (string == null) string = nil; 23398 return process.stderr.write(string);})); 23399 $$('STDIN')['$read_proc='](function(_count) { 23400 // Ignore count, return as much as we can get 23401 var buf = Buffer.alloc(65536), count; 23402 try { 23403 count = __fs__.readSync(this.fd, buf, 0, 65536, null); 23404 } 23405 catch (e) { // Windows systems may raise EOF 23406 return nil; 23407 } 23408 if (count == 0) return nil; 23409 return buf.toString('utf8', 0, count); 23410}); 23411 $$('STDIN')['$tty='](true); 23412 $$('STDOUT')['$tty='](true); 23413 return ($a = [true], $send($$('STDERR'), 'tty=', $a), $a[$a.length - 1]); 23414}; 23415 23416Opal.modules["corelib/file"] = function(Opal) {/* Generated by Opal 1.7.3 */ 23417 var $truthy = Opal.truthy, $klass = Opal.klass, $const_set = Opal.const_set, $Opal = Opal.Opal, $regexp = Opal.regexp, $rb_plus = Opal.rb_plus, $def = Opal.def, $Kernel = Opal.Kernel, $eqeq = Opal.eqeq, $rb_lt = Opal.rb_lt, $rb_minus = Opal.rb_minus, $range = Opal.range, $send = Opal.send, $slice = Opal.slice, $alias = Opal.alias, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 23418 23419 Opal.add_stubs('respond_to?,to_path,coerce_to!,pwd,split,sub,+,unshift,join,home,raise,start_with?,absolute_path,==,<,dirname,-,basename,empty?,rindex,[],length,nil?,gsub,find,=~,map,each_with_index,flatten,reject,to_proc,end_with?,expand_path,exist?'); 23420 return (function($base, $super, $parent_nesting) { 23421 var self = $klass($base, $super, 'File'); 23422 23423 var $nesting = [self].concat($parent_nesting), windows_root_rx = nil; 23424 23425 23426 $const_set($nesting[0], 'Separator', $const_set($nesting[0], 'SEPARATOR', "/")); 23427 $const_set($nesting[0], 'ALT_SEPARATOR', nil); 23428 $const_set($nesting[0], 'PATH_SEPARATOR', ":"); 23429 $const_set($nesting[0], 'FNM_SYSCASE', 0); 23430 windows_root_rx = /^[a-zA-Z]:(?:\\|\/)/; 23431 return (function(self, $parent_nesting) { 23432 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 23433 23434 23435 23436 $def(self, '$absolute_path', function $$absolute_path(path, basedir) { 23437 var sep = nil, sep_chars = nil, new_parts = nil, $ret_or_1 = nil, path_abs = nil, basedir_abs = nil, parts = nil, leading_sep = nil, abs = nil, new_path = nil; 23438 23439 23440 if (basedir == null) basedir = nil; 23441 sep = $$('SEPARATOR'); 23442 sep_chars = $sep_chars(); 23443 new_parts = []; 23444 path = ($truthy(path['$respond_to?']("to_path")) ? (path.$to_path()) : (path)); 23445 path = $Opal['$coerce_to!'](path, $$$('String'), "to_str"); 23446 basedir = ($truthy(($ret_or_1 = basedir)) ? ($ret_or_1) : ($$$('Dir').$pwd())); 23447 path_abs = path.substr(0, sep.length) === sep || windows_root_rx.test(path); 23448 basedir_abs = basedir.substr(0, sep.length) === sep || windows_root_rx.test(basedir); 23449 if ($truthy(path_abs)) { 23450 23451 parts = path.$split($regexp(["[", sep_chars, "]"])); 23452 leading_sep = windows_root_rx.test(path) ? '' : path.$sub($regexp(["^([", sep_chars, "]+).*$"]), "\\1"); 23453 abs = true; 23454 } else { 23455 23456 parts = $rb_plus(basedir.$split($regexp(["[", sep_chars, "]"])), path.$split($regexp(["[", sep_chars, "]"]))); 23457 leading_sep = windows_root_rx.test(basedir) ? '' : basedir.$sub($regexp(["^([", sep_chars, "]+).*$"]), "\\1"); 23458 abs = basedir_abs; 23459 } 23460 var part; 23461 for (var i = 0, ii = parts.length; i < ii; i++) { 23462 part = parts[i]; 23463 23464 if ( 23465 (part === nil) || 23466 (part === '' && ((new_parts.length === 0) || abs)) || 23467 (part === '.' && ((new_parts.length === 0) || abs)) 23468 ) { 23469 continue; 23470 } 23471 if (part === '..') { 23472 new_parts.pop(); 23473 } else { 23474 new_parts.push(part); 23475 } 23476 } 23477 23478 if (!abs && parts[0] !== '.') { 23479 new_parts.$unshift("."); 23480 } 23481 new_path = new_parts.$join(sep); 23482 if ($truthy(abs)) { 23483 new_path = $rb_plus(leading_sep, new_path); 23484 } return new_path; 23485 }, -2); 23486 23487 $def(self, '$expand_path', function $$expand_path(path, basedir) { 23488 var self = this, sep = nil, sep_chars = nil, home = nil, leading_sep = nil, home_path_regexp = nil; 23489 23490 23491 if (basedir == null) basedir = nil; 23492 sep = $$('SEPARATOR'); 23493 sep_chars = $sep_chars(); 23494 if ($truthy(path[0] === '~' || (basedir && basedir[0] === '~'))) { 23495 23496 home = $$('Dir').$home(); 23497 if (!$truthy(home)) { 23498 $Kernel.$raise($$$('ArgumentError'), "couldn't find HOME environment -- expanding `~'"); 23499 } leading_sep = windows_root_rx.test(home) ? '' : home.$sub($regexp(["^([", sep_chars, "]+).*$"]), "\\1"); 23500 if (!$truthy(home['$start_with?'](leading_sep))) { 23501 $Kernel.$raise($$$('ArgumentError'), "non-absolute home"); 23502 } home = $rb_plus(home, sep); 23503 home_path_regexp = $regexp(["^\\~(?:", sep, "|$)"]); 23504 path = path.$sub(home_path_regexp, home); 23505 if ($truthy(basedir)) { 23506 basedir = basedir.$sub(home_path_regexp, home); 23507 } } return self.$absolute_path(path, basedir); 23508 }, -2); 23509 23510 // Coerce a given path to a path string using #to_path and #to_str 23511 function $coerce_to_path(path) { 23512 if ($truthy((path)['$respond_to?']("to_path"))) { 23513 path = path.$to_path(); 23514 } 23515 23516 path = $Opal['$coerce_to!'](path, $$$('String'), "to_str"); 23517 23518 return path; 23519 } 23520 23521 // Return a RegExp compatible char class 23522 function $sep_chars() { 23523 if ($$('ALT_SEPARATOR') === nil) { 23524 return Opal.escape_regexp($$('SEPARATOR')); 23525 } else { 23526 return Opal.escape_regexp($rb_plus($$('SEPARATOR'), $$('ALT_SEPARATOR'))); 23527 } 23528 } 23529 23530 $def(self, '$dirname', function $$dirname(path, level) { 23531 var self = this, sep_chars = nil; 23532 23533 23534 if (level == null) level = 1; 23535 if ($eqeq(level, 0)) { 23536 return path 23537 } if ($truthy($rb_lt(level, 0))) { 23538 $Kernel.$raise($$$('ArgumentError'), "level can't be negative"); 23539 } sep_chars = $sep_chars(); 23540 path = $coerce_to_path(path); 23541 23542 var absolute = path.match(new RegExp("^[" + (sep_chars) + "]")), out; 23543 23544 path = path.replace(new RegExp("[" + (sep_chars) + "]+$"), ''); // remove trailing separators 23545 path = path.replace(new RegExp("[^" + (sep_chars) + "]+$"), ''); // remove trailing basename 23546 path = path.replace(new RegExp("[" + (sep_chars) + "]+$"), ''); // remove final trailing separators 23547 23548 if (path === '') { 23549 out = absolute ? '/' : '.'; 23550 } 23551 else { 23552 out = path; 23553 } 23554 23555 if (level == 1) { 23556 return out; 23557 } 23558 else { 23559 return self.$dirname(out, $rb_minus(level, 1)) 23560 } 23561 }, -2); 23562 23563 $def(self, '$basename', function $$basename(name, suffix) { 23564 var sep_chars = nil; 23565 23566 23567 if (suffix == null) suffix = nil; 23568 sep_chars = $sep_chars(); 23569 name = $coerce_to_path(name); 23570 23571 if (name.length == 0) { 23572 return name; 23573 } 23574 23575 if (suffix !== nil) { 23576 suffix = $Opal['$coerce_to!'](suffix, $$$('String'), "to_str"); 23577 } else { 23578 suffix = null; 23579 } 23580 23581 name = name.replace(new RegExp("(.)[" + (sep_chars) + "]*$"), '$1'); 23582 name = name.replace(new RegExp("^(?:.*[" + (sep_chars) + "])?([^" + (sep_chars) + "]+)$"), '$1'); 23583 23584 if (suffix === ".*") { 23585 name = name.replace(/\.[^\.]+$/, ''); 23586 } else if(suffix !== null) { 23587 suffix = Opal.escape_regexp(suffix); 23588 name = name.replace(new RegExp("" + (suffix) + "$"), ''); 23589 } 23590 23591 return name; 23592 }, -2); 23593 23594 $def(self, '$extname', function $$extname(path) { 23595 var self = this, filename = nil, last_dot_idx = nil; 23596 23597 23598 path = $coerce_to_path(path); 23599 filename = self.$basename(path); 23600 if ($truthy(filename['$empty?']())) { 23601 return "" 23602 } last_dot_idx = filename['$[]']($range(1, -1, false)).$rindex("."); 23603 if (($truthy(last_dot_idx['$nil?']()) || ($eqeq($rb_plus(last_dot_idx, 1), $rb_minus(filename.$length(), 1))))) { 23604 return "" 23605 } else { 23606 return filename['$[]'](Opal.Range.$new($rb_plus(last_dot_idx, 1), -1, false)) 23607 } }); 23608 23609 $def(self, '$exist?', function $exist$ques$1(path) { 23610 23611 return Opal.modules[path] != null 23612 }); 23613 23614 $def(self, '$directory?', function $directory$ques$2(path) { 23615 var files = nil; 23616 23617 23618 files = []; 23619 23620 for (var key in Opal.modules) { 23621 files.push(key); 23622 } 23623 path = path.$gsub($regexp(["(^.", $$('SEPARATOR'), "+|", $$('SEPARATOR'), "+$)"])); 23624 return $send(files, 'find', [], function $$3(f){ 23625 23626 if (f == null) f = nil; 23627 return f['$=~']($regexp(["^", path]));}); 23628 }); 23629 23630 $def(self, '$join', function $$join($a) { 23631 var $post_args, paths, result = nil; 23632 23633 23634 $post_args = $slice(arguments); 23635 paths = $post_args; 23636 if ($truthy(paths['$empty?']())) { 23637 return "" 23638 } result = ""; 23639 paths = $send(paths.$flatten().$each_with_index(), 'map', [], function $$4(item, index){ 23640 23641 if (item == null) item = nil; 23642 if (index == null) index = nil; 23643 if (($eqeq(index, 0) && ($truthy(item['$empty?']())))) { 23644 return $$('SEPARATOR') 23645 } else if (($eqeq(paths.$length(), $rb_plus(index, 1)) && ($truthy(item['$empty?']())))) { 23646 return $$('SEPARATOR') 23647 } else { 23648 return item 23649 }}); 23650 paths = $send(paths, 'reject', [], "empty?".$to_proc()); 23651 $send(paths, 'each_with_index', [], function $$5(item, index){var next_item = nil; 23652 23653 23654 if (item == null) item = nil; 23655 if (index == null) index = nil; 23656 next_item = paths['$[]']($rb_plus(index, 1)); 23657 if ($truthy(next_item['$nil?']())) { 23658 return (result = "" + (result) + (item)) 23659 } else { 23660 23661 if (($truthy(item['$end_with?']($$('SEPARATOR'))) && ($truthy(next_item['$start_with?']($$('SEPARATOR')))))) { 23662 item = item.$sub($regexp([$$('SEPARATOR'), "+$"]), ""); 23663 } return (result = (($truthy(item['$end_with?']($$('SEPARATOR'))) || ($truthy(next_item['$start_with?']($$('SEPARATOR'))))) ? ("" + (result) + (item)) : ("" + (result) + (item) + ($$('SEPARATOR'))))); 23664 }}); 23665 return result; 23666 }, -1); 23667 23668 $def(self, '$split', function $$split(path) { 23669 23670 return path.$split($$('SEPARATOR')) 23671 }); 23672 $alias(self, "realpath", "expand_path"); 23673 return $alias(self, "exists?", "exist?"); 23674 })(Opal.get_singleton_class(self), $nesting); 23675 })('::', $$$('IO'), $nesting) 23676}; 23677 23678Opal.modules["nodejs/file"] = function(Opal) {/* Generated by Opal 1.7.3 */ 23679 var $klass = Opal.klass, $truthy = Opal.truthy, $const_set = Opal.const_set, $defs = Opal.defs, $alias = Opal.alias, $slice = Opal.slice, $send = Opal.send, $neqeq = Opal.neqeq, $send2 = Opal.send2, $find_super = Opal.find_super, $def = Opal.def, $assign_ivar = Opal.assign_ivar, self = Opal.top, $nesting = [], $$ = Opal.$r($nesting), nil = Opal.nil, $$$ = Opal.$$$; 23680 23681 Opal.add_stubs('require,constants,raise,warn,const_get,new,size,delete,respond_to?,path,join,call,map,to_proc,start_with?,first,exist?,realpath,!=,close,to_path,pwd,to_str,include?,match?,sub,attr_reader'); 23682 23683 self.$require("corelib/file"); 23684 23685 var warnings = {}, errno_codes = $$('Errno').$constants(); 23686 23687 function handle_unsupported_feature(message) { 23688 switch (Opal.config.unsupported_features_severity) { 23689 case 'error': 23690 $$('Kernel').$raise($$('NotImplementedError'), message); 23691 break; 23692 case 'warning': 23693 warn(message); 23694 break; 23695 // noop 23696 } 23697 } 23698 function warn(string) { 23699 if (warnings[string]) { 23700 return; 23701 } 23702 warnings[string] = true; 23703 self.$warn(string); 23704 } 23705 function is_utf8(bytes) { 23706 var i = 0; 23707 while (i < bytes.length) { 23708 if ((// ASCII 23709 bytes[i] === 0x09 || 23710 bytes[i] === 0x0A || 23711 bytes[i] === 0x0D || 23712 (0x20 <= bytes[i] && bytes[i] <= 0x7E) 23713 ) 23714 ) { 23715 i += 1; 23716 continue; 23717 } 23718 23719 if ((// non-overlong 2-byte 23720 (0xC2 <= bytes[i] && bytes[i] <= 0xDF) && 23721 (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) 23722 ) 23723 ) { 23724 i += 2; 23725 continue; 23726 } 23727 23728 if ((// excluding overlongs 23729 bytes[i] === 0xE0 && 23730 (0xA0 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) && 23731 (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) 23732 ) || 23733 (// straight 3-byte 23734 ((0xE1 <= bytes[i] && bytes[i] <= 0xEC) || 23735 bytes[i] === 0xEE || 23736 bytes[i] === 0xEF) && 23737 (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) && 23738 (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) 23739 ) || 23740 (// excluding surrogates 23741 bytes[i] === 0xED && 23742 (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0x9F) && 23743 (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) 23744 ) 23745 ) { 23746 i += 3; 23747 continue; 23748 } 23749 23750 if ((// planes 1-3 23751 bytes[i] === 0xF0 && 23752 (0x90 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) && 23753 (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) && 23754 (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF) 23755 ) || 23756 (// planes 4-15 23757 (0xF1 <= bytes[i] && bytes[i] <= 0xF3) && 23758 (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) && 23759 (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) && 23760 (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF) 23761 ) || 23762 (// plane 16 23763 bytes[i] === 0xF4 && 23764 (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0x8F) && 23765 (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) && 23766 (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF) 23767 ) 23768 ) { 23769 i += 4; 23770 continue; 23771 } 23772 23773 return false; 23774 } 23775 23776 return true; 23777 } 23778 function executeIOAction(action) { 23779 try { 23780 return action(); 23781 } catch (error) { 23782 if (errno_codes.indexOf(error.code) >= 0) { 23783 var error_class = $$('Errno').$const_get(error.code); 23784 $$('Kernel').$raise((error_class).$new(error.message)); 23785 } 23786 $$('Kernel').$raise(error); 23787 } 23788 } 23789 (function($base, $super, $parent_nesting) { 23790 var self = $klass($base, $super, 'File'); 23791 23792 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype; 23793 if (self.__fs__ == null) self.__fs__ = nil; 23794 if (self.__path__ == null) self.__path__ = nil; 23795 if (self.__util__ == null) self.__util__ = nil; 23796 23797 $proto.eof = $proto.binary_flag = $proto.path = $proto.fd = nil; 23798 23799 self.__fs__ = __fs__; 23800 self.__path__ = __path__; 23801 self.__util__ = __util__; 23802 var __TextEncoder__ = typeof TextEncoder !== 'undefined' ? TextEncoder : __util__.TextEncoder; 23803 var __TextDecoder__ = typeof TextDecoder !== 'undefined' ? TextDecoder : __util__.TextDecoder; 23804 var __utf8TextDecoder__ = new __TextDecoder__('utf8'); 23805 var __textEncoder__ = new __TextEncoder__(); 23806 if ($truthy(__path__.sep !== $$('Separator'))) { 23807 $const_set($nesting[0], 'ALT_SEPARATOR', __path__.sep); 23808 } $defs(self, '$read', function $$read(path) { 23809 23810 return executeIOAction(function(){return __fs__.readFileSync(path).toString()}) 23811 }); 23812 $defs(self, '$write', function $$write(path, data) { 23813 23814 23815 executeIOAction(function(){return __fs__.writeFileSync(path, data)}); 23816 return data.$size(); 23817 }); 23818 $defs(self, '$symlink', function $$symlink(path, new_path) { 23819 23820 23821 executeIOAction(function(){return __fs__.symlinkSync(path, new_path)}); 23822 return 0; 23823 }); 23824 $defs(self, '$delete', function $File_delete$1(path) { 23825 23826 return executeIOAction(function(){return __fs__.unlinkSync(path)}) 23827 }); 23828 (function(self, $parent_nesting) { 23829 23830 return $alias(self, "unlink", "delete") 23831 })(Opal.get_singleton_class(self)); 23832 $defs(self, '$exist?', function $File_exist$ques$2(path) { 23833 23834 23835 if ($truthy(path['$respond_to?']("path"))) { 23836 path = path.$path(); 23837 } return executeIOAction(function(){return __fs__.existsSync(path)}); 23838 }); 23839 $defs(self, '$realpath', function $$realpath(pathname, dir_string, cache) { 23840 var block = $$realpath.$$p || nil, self = this; 23841 23842 $$realpath.$$p = null; 23843 if (dir_string == null) dir_string = nil; 23844 if (cache == null) cache = nil; 23845 if ($truthy(dir_string)) { 23846 pathname = self.$join(dir_string, pathname); 23847 } if ((block !== nil)) { 23848 23849 __fs__.realpath(pathname, cache, function(error, realpath){ 23850 if (error) Opal.IOError.$new(error.message); 23851 else block.$call(realpath); 23852 }); 23853 23854 } else { 23855 return executeIOAction(function(){return __fs__.realpathSync(pathname, cache)}) 23856 } }, -2); 23857 $defs(self, '$join', function $$join($a) { 23858 var $post_args, paths, $b, prefix = nil; 23859 23860 23861 $post_args = $slice(arguments); 23862 paths = $post_args; 23863 paths = $send(paths, 'map', [], "to_s".$to_proc()); 23864 prefix = ($truthy(($b = paths.$first(), ($b === nil || $b == null) ? nil : $b['$start_with?']("//"))) ? ("/") : ("")); 23865 return prefix + __path__.posix.join.apply(__path__, paths); 23866 }, -1); 23867 $defs(self, '$directory?', function $File_directory$ques$3(path) { 23868 var self = this, result = nil, realpath = nil; 23869 23870 23871 if (!$truthy(self['$exist?'](path))) { 23872 return false 23873 } result = executeIOAction(function(){return !!__fs__.lstatSync(path).isDirectory()}); 23874 if (!$truthy(result)) { 23875 23876 realpath = self.$realpath(path); 23877 if ($neqeq(realpath, path)) { 23878 result = executeIOAction(function(){return !!__fs__.lstatSync(realpath).isDirectory()}); 23879 } } return result; 23880 }); 23881 $defs(self, '$file?', function $File_file$ques$4(path) { 23882 var self = this, result = nil, realpath = nil; 23883 23884 23885 if (!$truthy(self['$exist?'](path))) { 23886 return false 23887 } result = executeIOAction(function(){return !!__fs__.lstatSync(path).isFile()}); 23888 if (!$truthy(result)) { 23889 23890 realpath = self.$realpath(path); 23891 if ($neqeq(realpath, path)) { 23892 result = executeIOAction(function(){return !!__fs__.lstatSync(realpath).isFile()}); 23893 } } return result; 23894 }); 23895 $defs(self, '$readable?', function $File_readable$ques$5(path) { 23896 var self = this; 23897 23898 23899 if (!$truthy(self['$exist?'](path))) { 23900 return false 23901 } return "\n" + " try {\n" + " __fs__.accessSync(path, __fs__.R_OK);\n" + " return true;\n" + " } catch (error) {\n" + " return false;\n" + " }\n" + " "; 23902 }); 23903 $defs(self, '$size', function $$size(path) { 23904 23905 return executeIOAction(function(){return __fs__.lstatSync(path).size}); 23906 }); 23907 $defs(self, '$open', function $$open(path, mode) { 23908 var $yield = $$open.$$p || nil, self = this, file = nil; 23909 23910 $$open.$$p = null; 23911 23912 if (mode == null) mode = "r"; 23913 file = self.$new(path, mode); 23914 if (($yield !== nil)) { 23915 23916 return (function() { try { 23917 return Opal.yield1($yield, file); 23918 } finally { 23919 file.$close(); 23920 } })(); 23921 } else { 23922 return file 23923 } }, -2); 23924 $defs(self, '$stat', function $$stat(path) { 23925 23926 23927 if ($truthy(path['$respond_to?']("path"))) { 23928 path = path.$path(); 23929 } return $$$($$('File'), 'Stat').$new(path); 23930 }); 23931 $defs(self, '$mtime', function $$mtime(path) { 23932 23933 return executeIOAction(function(){return __fs__.statSync(path).mtime}) 23934 }); 23935 $defs(self, '$symlink?', function $File_symlink$ques$6(path) { 23936 23937 return executeIOAction(function(){return __fs__.lstatSync(path).isSymbolicLink()}) 23938 }); 23939 $defs(self, '$absolute_path', function $$absolute_path(path, basedir) { 23940 var $ret_or_1 = nil; 23941 23942 23943 if (basedir == null) basedir = nil; 23944 path = ($truthy(path['$respond_to?']("to_path")) ? (path.$to_path()) : (path)); 23945 basedir = ($truthy(($ret_or_1 = basedir)) ? ($ret_or_1) : ($$('Dir').$pwd())); 23946 return __path__.normalize(__path__.resolve(basedir.$to_str(), path.$to_str())).split(__path__.sep).join(__path__.posix.sep); 23947 }, -2); 23948 23949 $def(self, '$initialize', function $$initialize(path, flags) { 23950 var self = this, encoding_option_rx = nil, fd = nil; 23951 23952 $$initialize.$$p = null; 23953 23954 if (flags == null) flags = "r"; 23955 self.binary_flag = flags['$include?']("b"); 23956 flags = flags.$delete("b"); 23957 encoding_option_rx = /:(.*)/; 23958 if ($truthy(encoding_option_rx['$match?'](flags))) { 23959 23960 handle_unsupported_feature("Encoding option (:encoding) is unsupported by Node.js openSync method and will be removed."); 23961 flags = flags.$sub(encoding_option_rx, ""); 23962 } self.path = path; 23963 fd = executeIOAction(function(){return __fs__.openSync(path, flags)}); 23964 return $send2(self, $find_super(self, 'initialize', $$initialize, false, true), 'initialize', [fd, flags], null); 23965 }, -2); 23966 self.$attr_reader("path"); 23967 23968 $def(self, '$sysread', function $$sysread(bytes) { 23969 var self = this, res = nil; 23970 23971 if ($truthy(self.eof)) { 23972 return self.$raise($$('EOFError'), "end of file reached") 23973 } else { 23974 23975 if ($truthy(self.binary_flag)) { 23976 23977 23978 var buf = executeIOAction(function(){return __fs__.readFileSync(self.path)}); 23979 var content; 23980 if (is_utf8(buf)) { 23981 content = buf.toString('utf8'); 23982 } else { 23983 // coerce to utf8 23984 content = __utf8TextDecoder__.decode(__textEncoder__.encode(buf.toString('binary'))); 23985 } 23986 res = content; 23987 } else { 23988 res = executeIOAction(function(){return __fs__.readFileSync(self.path).toString('utf8')}); 23989 } self.eof = true; 23990 self.lineno = res.$size(); 23991 return res; 23992 } 23993 }); 23994 23995 $def(self, '$write', function $$write(string) { 23996 var self = this; 23997 23998 return executeIOAction(function(){return __fs__.writeSync(self.fd, string)}) 23999 }); 24000 24001 $def(self, '$flush', function $$flush() { 24002 var self = this; 24003 24004 return executeIOAction(function(){return __fs__.fsyncSync(self.fd)}) 24005 }); 24006 24007 $def(self, '$close', function $$close() { 24008 var $yield = $$close.$$p || nil, self = this; 24009 24010 $$close.$$p = null; 24011 24012 executeIOAction(function(){return __fs__.closeSync(self.fd)}); 24013 return $send2(self, $find_super(self, 'close', $$close, false, true), 'close', [], $yield); 24014 }); 24015 return $def(self, '$mtime', function $$mtime() { 24016 var self = this; 24017 24018 return executeIOAction(function(){return __fs__.statSync(self.path).mtime}) 24019 }); 24020 })($nesting[0], $$('IO'), $nesting); 24021 return (function($base, $super) { 24022 var self = $klass($base, $super, 'Stat'); 24023 24024 var $proto = self.$$prototype; 24025 if (self.__fs__ == null) self.__fs__ = nil; 24026 24027 $proto.path = nil; 24028 24029 self.__fs__ = __fs__; 24030 24031 $def(self, '$initialize', $assign_ivar("path")); 24032 24033 $def(self, '$file?', function $Stat_file$ques$7() { 24034 var self = this; 24035 24036 return executeIOAction(function(){return __fs__.statSync(self.path).isFile()}) 24037 }); 24038 24039 $def(self, '$directory?', function $Stat_directory$ques$8() { 24040 var self = this; 24041 24042 return executeIOAction(function(){return __fs__.statSync(self.path).isDirectory()}) 24043 }); 24044 24045 $def(self, '$mtime', function $$mtime() { 24046 var self = this; 24047 24048 return executeIOAction(function(){return __fs__.statSync(self.path).mtime}) 24049 }); 24050 24051 $def(self, '$readable?', function $Stat_readable$ques$9() { 24052 var self = this; 24053 24054 return executeIOAction(function(){return __fs__.accessSync(self.path, __fs__.constants.R_OK)}) 24055 }); 24056 24057 $def(self, '$writable?', function $Stat_writable$ques$10() { 24058 var self = this; 24059 24060 return executeIOAction(function(){return __fs__.accessSync(self.path, __fs__.constants.W_OK)}) 24061 }); 24062 return $def(self, '$executable?', function $Stat_executable$ques$11() { 24063 var self = this; 24064 24065 return executeIOAction(function(){return __fs__.accessSync(self.path, __fs__.constants.X_OK)}) 24066 }); 24067 })($$('File'), null); 24068}; 24069 24070Opal.modules["nodejs/dir"] = function(Opal) {/* Generated by Opal 1.7.3 */ 24071 var $klass = Opal.klass, $def = Opal.def, $truthy = Opal.truthy, $send = Opal.send, $Opal = Opal.Opal, $alias = Opal.alias, $nesting = [], nil = Opal.nil; 24072 24073 Opal.add_stubs('respond_to?,flat_map,to_path,coerce_to!,pwd'); 24074 return (function($base, $super, $parent_nesting) { 24075 var self = $klass($base, $super, 'Dir'); 24076 24077 var $nesting = [self].concat($parent_nesting); 24078 if (self.__glob__ == null) self.__glob__ = nil; 24079 if (self.__fs__ == null) self.__fs__ = nil; 24080 if (self.__path__ == null) self.__path__ = nil; 24081 if (self.__os__ == null) self.__os__ = nil; 24082 24083 24084 self.__glob__ = __glob__; 24085 self.__fs__ = __fs__; 24086 self.__path__ = __path__; 24087 self.__os__ = __os__; 24088 return (function(self, $parent_nesting) { 24089 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 24090 24091 24092 24093 $def(self, '$[]', function $$$1(glob) { 24094 24095 return __glob__.sync(glob) 24096 }); 24097 24098 $def(self, '$pwd', function $$pwd() { 24099 24100 return process.cwd().split(__path__.sep).join(__path__.posix.sep); 24101 }); 24102 24103 $def(self, '$home', function $$home() { 24104 24105 return __os__.homedir(); 24106 }); 24107 24108 $def(self, '$chdir', function $$chdir(path) { 24109 24110 return process.chdir(path) 24111 }); 24112 24113 $def(self, '$mkdir', function $$mkdir(path) { 24114 24115 return __fs__.mkdirSync(path) 24116 }); 24117 24118 $def(self, '$entries', function $$entries(dirname) { 24119 24120 24121 var result = []; 24122 var entries = __fs__.readdirSync(dirname); 24123 for (var i = 0, ii = entries.length; i < ii; i++) { 24124 result.push(entries[i]); 24125 } 24126 return result; 24127 24128 }); 24129 24130 $def(self, '$glob', function $$glob(pattern) { 24131 24132 24133 if (!$truthy(pattern['$respond_to?']("each"))) { 24134 pattern = [pattern]; 24135 } return $send(pattern, 'flat_map', [], function $$2(subpattern){ 24136 24137 if (subpattern == null) subpattern = nil; 24138 if ($truthy(subpattern['$respond_to?']("to_path"))) { 24139 subpattern = subpattern.$to_path(); 24140 } subpattern = $Opal['$coerce_to!'](subpattern, $$('String'), "to_str"); 24141 return __glob__.sync(subpattern);}); 24142 }); 24143 return $alias(self, "getwd", "pwd"); 24144 })(Opal.get_singleton_class(self), $nesting); 24145 })($nesting[0], null, $nesting) 24146}; 24147 24148Opal.modules["nodejs/io"] = function(Opal) {/* Generated by Opal 1.7.3 */ 24149 var $klass = Opal.klass, $alias = Opal.alias, $def = Opal.def, $defs = Opal.defs, self = Opal.top, $nesting = []; Opal.nil; 24150 24151 Opal.add_stubs('require,attr_reader,initialize,initialize_before_node_io,write,read'); 24152 24153 self.$require("nodejs/file"); 24154 24155 function executeIOAction(action) { 24156 try { 24157 return action(); 24158 } catch (error) { 24159 if (error.code === 'EACCES' || 24160 error.code === 'EISDIR' || 24161 error.code === 'EMFILE' || 24162 error.code === 'ENOENT' || 24163 error.code === 'EPERM') { 24164 throw Opal.IOError.$new(error.message) 24165 } 24166 throw error; 24167 } 24168 } 24169 return (function($base, $super, $parent_nesting) { 24170 var self = $klass($base, $super, 'IO'); 24171 24172 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 24173 24174 24175 self.__fs__ = __fs__; 24176 self.$attr_reader("lineno"); 24177 $alias(self, "initialize_before_node_io", "initialize"); 24178 24179 $def(self, '$initialize', function $$initialize(fd, flags) { 24180 var self = this; 24181 24182 24183 if (flags == null) flags = "r"; 24184 self.lineno = 0; 24185 return self.$initialize_before_node_io(fd, flags); 24186 }, -2); 24187 $defs(self, '$write', function $$write(path, data) { 24188 24189 return $$('File').$write(path, data) 24190 }); 24191 $defs(self, '$read', function $$read(path) { 24192 24193 return $$('File').$read(path) 24194 }); 24195 return $defs(self, '$binread', function $$binread(path) { 24196 24197 return executeIOAction(function(){return __fs__.readFileSync(path).toString('binary')}) 24198 }); 24199 })($nesting[0], null, $nesting); 24200}; 24201 24202Opal.modules["nodejs/argf"] = function(Opal) {/* Generated by Opal 1.7.3 */ 24203 var $const_set = Opal.const_set, $return_val = Opal.return_val, $def = Opal.def, $eqeq = Opal.eqeq, $gvars = Opal.gvars, $truthy = Opal.truthy, $slice = Opal.slice, $send = Opal.send, $to_a = Opal.to_a, $rb_plus = Opal.rb_plus, $rb_minus = Opal.rb_minus, $rb_gt = Opal.rb_gt, $thrower = Opal.thrower, $not = Opal.not, $alias = Opal.alias, $a, $nesting = [], $$ = Opal.$r($nesting), nil = Opal.nil; 24204 24205 Opal.add_stubs('new,include,filename,==,open,argv,shift,close,file,closed?,enum_for,gets,nil?,+,loop,read,-,length,>,to_a,each,attr_accessor,rewind,!,fileno,eof?,lineno='); 24206 24207 $const_set($nesting[0], 'ARGF', $$('Object').$new()); 24208 (function(self, $parent_nesting) { 24209 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 24210 24211 24212 self.$include($$('Enumerable')); 24213 24214 $def(self, '$inspect', $return_val("ARGF")); 24215 24216 $def(self, '$argv', function $$argv() { 24217 24218 return $$('ARGV') 24219 }); 24220 24221 $def(self, '$file', function $$file() { 24222 var self = this, fn = nil, $ret_or_1 = nil; 24223 if (self.file == null) self.file = nil; 24224 if ($gvars.stdin == null) $gvars.stdin = nil; 24225 24226 24227 fn = self.$filename(); 24228 if ($eqeq(fn, "-")) { 24229 return $gvars.stdin 24230 } else { 24231 return (self.file = ($truthy(($ret_or_1 = self.file)) ? ($ret_or_1) : ($$('File').$open(fn, "r")))) 24232 } }); 24233 24234 $def(self, '$filename', function $$filename() { 24235 var self = this, $ret_or_1 = nil; 24236 if (self.filename == null) self.filename = nil; 24237 if (self.last_filename == null) self.last_filename = nil; 24238 24239 24240 if ($truthy(self.filename)) { 24241 return self.filename 24242 } if ($eqeq(self.$argv(), ["-"])) { 24243 return "-" 24244 } else if ($eqeq(self.$argv(), [])) { 24245 if ($truthy(($ret_or_1 = self.last_filename))) { 24246 return $ret_or_1 24247 } else { 24248 return "-" 24249 } 24250 } else { 24251 24252 self.file = nil; 24253 return (self.filename = (self.last_filename = self.$argv().$shift())); 24254 } }); 24255 24256 $def(self, '$close', function $$close() { 24257 var self = this; 24258 24259 24260 self.$file().$close(); 24261 self.filename = nil; 24262 return self; 24263 }); 24264 24265 $def(self, '$closed?', function $closed$ques$1() { 24266 var self = this; 24267 24268 return self.$file()['$closed?']() 24269 }); 24270 24271 $def(self, '$each', function $$each($a) { 24272 var block = $$each.$$p || nil, $post_args, args, self = this, l = nil; 24273 24274 $$each.$$p = null; 24275 $post_args = $slice(arguments); 24276 args = $post_args; 24277 if (!(block !== nil)) { 24278 return self.$enum_for("each") 24279 } while ($truthy((l = $send(self, 'gets', $to_a(args))))) { 24280 Opal.yield1(block, l); 24281 } }, -1); 24282 24283 $def(self, '$gets', function $$gets($a) { 24284 var $post_args, args, self = this, s = nil; 24285 if (self.lineno == null) self.lineno = nil; 24286 24287 24288 $post_args = $slice(arguments); 24289 args = $post_args; 24290 s = $send(self.$file(), 'gets', $to_a(args)); 24291 if ($truthy(s['$nil?']())) { 24292 24293 self.$close(); 24294 s = $send(self.$file(), 'gets', $to_a(args)); 24295 } if ($truthy(s)) { 24296 self.lineno = $rb_plus(self.lineno, 1); 24297 } return s; 24298 }, -1); 24299 24300 $def(self, '$read', function $$read(len) { 24301 var self = this, buf = nil; 24302 24303 24304 if (len == null) len = nil; 24305 buf = ""; 24306 return (function(){try { var $t_break = $thrower('break'); return $send(self, 'loop', [], function $$2(){var self = $$2.$$s == null ? this : $$2.$$s, r = nil; 24307 if (self.filename == null) self.filename = nil; 24308 24309 24310 r = self.$file().$read(len); 24311 if ($truthy(r)) { 24312 24313 buf = $rb_plus(buf, r); 24314 len = $rb_minus(len, r.$length()); 24315 }; 24316 self.$file().$close(); 24317 if ((($truthy(len) && ($truthy($rb_gt(len, 0)))) && ($truthy(self.filename)))) { 24318 $t_break.$throw(); 24319 } else { 24320 return nil 24321 };}, {$$s: self})} catch($e) { 24322 if ($e === $t_break) return $e.$v; 24323 throw $e; 24324 }})(); 24325 }, -1); 24326 24327 $def(self, '$readlines', function $$readlines($a) { 24328 var $post_args, args, self = this; 24329 24330 24331 $post_args = $slice(arguments); 24332 args = $post_args; 24333 return $send(self, 'each', $to_a(args)).$to_a(); 24334 }, -1); 24335 self.$attr_accessor("lineno"); 24336 24337 $def(self, '$rewind', function $$rewind() { 24338 var self = this, f = nil; 24339 24340 24341 self.lineno = 1; 24342 f = self.$file(); 24343 24344 try { 24345 f.$rewind(); 24346 } catch ($err) { 24347 if (Opal.rescue($err, [$$('StandardError')])) { 24348 try { 24349 nil; 24350 } finally { Opal.pop_exception(); } 24351 } else { throw $err; } 24352 } return 0; 24353 }); 24354 24355 $def(self, '$fileno', function $$fileno() { 24356 var self = this; 24357 if (self.last_filename == null) self.last_filename = nil; 24358 if (self.filename == null) self.filename = nil; 24359 24360 24361 if (($not(self.filename) && ($truthy(self.last_filename)))) { 24362 return 0 24363 } return self.$file().$fileno(); 24364 }); 24365 24366 $def(self, '$eof?', function $eof$ques$3() { 24367 var self = this; 24368 24369 return self.$file()['$eof?']() 24370 }); 24371 $alias(self, "each_line", "each"); 24372 $alias(self, "eof", "eof?"); 24373 $alias(self, "path", "filename"); 24374 $alias(self, "skip", "close"); 24375 $alias(self, "to_i", "fileno"); 24376 return $alias(self, "to_io", "file"); 24377 })(Opal.get_singleton_class($$('ARGF')), $nesting); 24378 return ($a = [1], $send($$('ARGF'), 'lineno=', $a), $a[$a.length - 1]); 24379}; 24380 24381Opal.modules["nodejs/open-uri"] = function(Opal) {/* Generated by Opal 1.7.3 */ 24382 var $module = Opal.module, $defs = Opal.defs, $nesting = [], nil = Opal.nil; 24383 24384 return (function($base) { 24385 var self = $module($base, 'OpenURI'); 24386 24387 if (self.__xmlhttprequest__ == null) self.__xmlhttprequest__ = nil; 24388 24389 24390 self.__xmlhttprequest__ = __xmlhttprequest__; 24391 var __XMLHttpRequest__ = self.__xmlhttprequest__.XMLHttpRequest; 24392 $defs(self, '$request', function $$request(uri) { 24393 24394 24395 var xhr = new __XMLHttpRequest__(); 24396 xhr.open('GET', uri, false); 24397 xhr.responseType = 'arraybuffer'; 24398 xhr.send(); 24399 return xhr; 24400 24401 }); 24402 return $defs(self, '$data', function $$data(req) { 24403 24404 24405 var arrayBuffer = req.response; 24406 var byteArray = new Uint8Array(arrayBuffer); 24407 var result = []; 24408 for (var i = 0; i < byteArray.byteLength; i++) { 24409 result.push(byteArray[i]); 24410 } 24411 return result; 24412 24413 }); 24414 })($nesting[0]) 24415}; 24416 24417Opal.modules["corelib/comparable"] = function(Opal) {/* Generated by Opal 1.7.3 */ 24418 var $truthy = Opal.truthy, $module = Opal.module, $rb_gt = Opal.rb_gt, $rb_lt = Opal.rb_lt, $eqeqeq = Opal.eqeqeq, $Kernel = Opal.Kernel, $def = Opal.def, nil = Opal.nil, $$$ = Opal.$$$; 24419 24420 Opal.add_stubs('>,<,===,raise,class,<=>,equal?'); 24421 return (function($base) { 24422 var self = $module($base, 'Comparable'); 24423 24424 var $ret_or_1 = nil; 24425 24426 24427 24428 function normalize(what) { 24429 if (Opal.is_a(what, Opal.Integer)) { return what; } 24430 24431 if ($rb_gt(what, 0)) { return 1; } 24432 if ($rb_lt(what, 0)) { return -1; } 24433 return 0; 24434 } 24435 24436 function fail_comparison(lhs, rhs) { 24437 var class_name; 24438 (($eqeqeq(nil, ($ret_or_1 = rhs)) || (($eqeqeq(true, $ret_or_1) || (($eqeqeq(false, $ret_or_1) || (($eqeqeq($$$('Integer'), $ret_or_1) || ($eqeqeq($$$('Float'), $ret_or_1))))))))) ? (class_name = rhs.$inspect()) : (class_name = rhs.$$class)); 24439 $Kernel.$raise($$$('ArgumentError'), "comparison of " + ((lhs).$class()) + " with " + (class_name) + " failed"); 24440 } 24441 24442 function cmp_or_fail(lhs, rhs) { 24443 var cmp = (lhs)['$<=>'](rhs); 24444 if (!$truthy(cmp)) fail_comparison(lhs, rhs); 24445 return normalize(cmp); 24446 } 24447 24448 $def(self, '$==', function $Comparable_$eq_eq$1(other) { 24449 var self = this, cmp = nil; 24450 24451 24452 if ($truthy(self['$equal?'](other))) { 24453 return true 24454 } 24455 if (self["$<=>"] == Opal.Kernel["$<=>"]) { 24456 return false; 24457 } 24458 24459 // check for infinite recursion 24460 if (self.$$comparable) { 24461 self.$$comparable = false; 24462 return false; 24463 } 24464 if (!$truthy((cmp = self['$<=>'](other)))) { 24465 return false 24466 } return normalize(cmp) == 0; }); 24467 24468 $def(self, '$>', function $Comparable_$gt$2(other) { 24469 var self = this; 24470 24471 return cmp_or_fail(self, other) > 0; 24472 }); 24473 24474 $def(self, '$>=', function $Comparable_$gt_eq$3(other) { 24475 var self = this; 24476 24477 return cmp_or_fail(self, other) >= 0; 24478 }); 24479 24480 $def(self, '$<', function $Comparable_$lt$4(other) { 24481 var self = this; 24482 24483 return cmp_or_fail(self, other) < 0; 24484 }); 24485 24486 $def(self, '$<=', function $Comparable_$lt_eq$5(other) { 24487 var self = this; 24488 24489 return cmp_or_fail(self, other) <= 0; 24490 }); 24491 24492 $def(self, '$between?', function $Comparable_between$ques$6(min, max) { 24493 var self = this; 24494 24495 24496 if ($rb_lt(self, min)) { 24497 return false 24498 } if ($rb_gt(self, max)) { 24499 return false 24500 } return true; 24501 }); 24502 return $def(self, '$clamp', function $$clamp(min, max) { 24503 var self = this; 24504 24505 24506 if (max == null) max = nil; 24507 24508 var c, excl; 24509 24510 if (max === nil) { 24511 // We are dealing with a new Ruby 2.7 behaviour that we are able to 24512 // provide a single Range argument instead of 2 Comparables. 24513 24514 if (!Opal.is_a(min, Opal.Range)) { 24515 $Kernel.$raise($$$('TypeError'), "wrong argument type " + (min.$class()) + " (expected Range)"); 24516 } 24517 24518 excl = min.excl; 24519 max = min.end; 24520 min = min.begin; 24521 24522 if (max !== nil && excl) { 24523 $Kernel.$raise($$$('ArgumentError'), "cannot clamp with an exclusive range"); 24524 } 24525 } 24526 24527 if (min !== nil && max !== nil && cmp_or_fail(min, max) > 0) { 24528 $Kernel.$raise($$$('ArgumentError'), "min argument must be smaller than max argument"); 24529 } 24530 24531 if (min !== nil) { 24532 c = cmp_or_fail(self, min); 24533 24534 if (c == 0) return self; 24535 if (c < 0) return min; 24536 } 24537 24538 if (max !== nil) { 24539 c = cmp_or_fail(self, max); 24540 24541 if (c > 0) return max; 24542 } 24543 24544 return self; 24545 }, -2); 24546 })('::') 24547}; 24548 24549Opal.modules["pathname"] = function(Opal) {/* Generated by Opal 1.7.3 */ 24550 var $klass = Opal.klass, $const_set = Opal.const_set, $regexp = Opal.regexp, $eqeqeq = Opal.eqeqeq, $truthy = Opal.truthy, $eqeq = Opal.eqeq, $def = Opal.def, $defs = Opal.defs, $to_ary = Opal.to_ary, $slice = Opal.slice, $send = Opal.send, $to_a = Opal.to_a, $return_ivar = Opal.return_ivar, $neqeq = Opal.neqeq, $rb_plus = Opal.rb_plus, $not = Opal.not, $thrower = Opal.thrower, $alias = Opal.alias, $module = Opal.module, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 24551 24552 Opal.add_stubs('require,include,quote,===,to_s,path,respond_to?,to_path,is_a?,nil?,raise,class,==,new,pwd,attr_reader,!,relative?,chop_basename,basename,=~,source,[],rindex,sub,absolute?,expand_path,plus,unshift,length,!=,empty?,first,shift,+,join,dirname,pop,reverse_each,directory?,extname,<=>,nonzero?,proc,casecmp,cleanpath,inspect,include?,fill,map,entries'); 24553 24554 self.$require("corelib/comparable"); 24555 (function($base, $super, $parent_nesting) { 24556 var self = $klass($base, $super, 'Pathname'); 24557 24558 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype; 24559 24560 $proto.path = nil; 24561 24562 self.$include($$('Comparable')); 24563 $const_set($nesting[0], 'SEPARATOR_PAT', $regexp([$$('Regexp').$quote($$$($$('File'), 'SEPARATOR'))])); 24564 24565 $def(self, '$initialize', function $$initialize(path) { 24566 var self = this; 24567 24568 24569 if ($eqeqeq($$('Pathname'), path)) { 24570 self.path = path.$path().$to_s(); 24571 } else if ($truthy(path['$respond_to?']("to_path"))) { 24572 self.path = path.$to_path(); 24573 } else if ($truthy(path['$is_a?']($$('String')))) { 24574 self.path = path; 24575 } else if ($truthy(path['$nil?']())) { 24576 self.$raise($$('TypeError'), "no implicit conversion of nil into String"); 24577 } else { 24578 self.$raise($$('TypeError'), "no implicit conversion of " + (path.$class()) + " into String"); 24579 } if ($eqeq(self.path, "\u0000")) { 24580 return self.$raise($$('ArgumentError')) 24581 } else { 24582 return nil 24583 } }); 24584 $defs(self, '$pwd', function $$pwd() { 24585 var self = this; 24586 24587 return self.$new($$('Dir').$pwd()) 24588 }); 24589 self.$attr_reader("path"); 24590 24591 $def(self, '$==', function $Pathname_$eq_eq$1(other) { 24592 var self = this; 24593 24594 return other.$path()['$=='](self.path) 24595 }); 24596 24597 $def(self, '$absolute?', function $Pathname_absolute$ques$2() { 24598 var self = this; 24599 24600 return self['$relative?']()['$!']() 24601 }); 24602 24603 $def(self, '$relative?', function $Pathname_relative$ques$3() { 24604 var $a, $b, self = this, path = nil, r = nil; 24605 24606 24607 path = self.path; 24608 while ($truthy((r = self.$chop_basename(path)))) { 24609 $b = r, $a = $to_ary($b), (path = ($a[0] == null ? nil : $a[0])); 24610 } return path['$=='](""); 24611 }); 24612 24613 $def(self, '$chop_basename', function $$chop_basename(path) { 24614 var base = nil; 24615 24616 24617 base = $$('File').$basename(path); 24618 if ($truthy($$('Regexp').$new("^" + ($$$($$('Pathname'), 'SEPARATOR_PAT').$source()) + "?$")['$=~'](base))) { 24619 return nil 24620 } else { 24621 return [path['$[]'](0, path.$rindex(base)), base] 24622 } }); 24623 24624 $def(self, '$root?', function $Pathname_root$ques$4() { 24625 var self = this; 24626 24627 return self.path['$==']("/") 24628 }); 24629 24630 $def(self, '$parent', function $$parent() { 24631 var self = this, new_path = nil; 24632 24633 24634 new_path = self.path.$sub(/\/([^\/]+\/?$)/, ""); 24635 if ($eqeq(new_path, "")) { 24636 new_path = ($truthy(self['$absolute?']()) ? ("/") : (".")); 24637 } return $$('Pathname').$new(new_path); 24638 }); 24639 24640 $def(self, '$sub', function $$sub($a) { 24641 var $post_args, args, self = this; 24642 24643 24644 $post_args = $slice(arguments); 24645 args = $post_args; 24646 return $$('Pathname').$new($send(self.path, 'sub', $to_a(args))); 24647 }, -1); 24648 24649 $def(self, '$cleanpath', function $$cleanpath() { 24650 var self = this; 24651 24652 return Opal.normalize(self.path) 24653 }); 24654 24655 $def(self, '$to_path', $return_ivar("path")); 24656 24657 $def(self, '$hash', $return_ivar("path")); 24658 24659 $def(self, '$expand_path', function $$expand_path() { 24660 var self = this; 24661 24662 return $$('Pathname').$new($$('File').$expand_path(self.path)) 24663 }); 24664 24665 $def(self, '$+', function $Pathname_$plus$5(other) { 24666 var self = this; 24667 24668 24669 if (!$eqeqeq($$('Pathname'), other)) { 24670 other = $$('Pathname').$new(other); 24671 } return $$('Pathname').$new(self.$plus(self.path, other.$to_s())); 24672 }); 24673 24674 $def(self, '$plus', function $$plus(path1, path2) { 24675 var $a, $b, self = this, prefix2 = nil, index_list2 = nil, basename_list2 = nil, r2 = nil, basename2 = nil, prefix1 = nil, $ret_or_1 = nil, r1 = nil, basename1 = nil, suffix2 = nil; 24676 24677 24678 prefix2 = path2; 24679 index_list2 = []; 24680 basename_list2 = []; 24681 while ($truthy((r2 = self.$chop_basename(prefix2)))) { 24682 24683 $b = r2, $a = $to_ary($b), (prefix2 = ($a[0] == null ? nil : $a[0])), (basename2 = ($a[1] == null ? nil : $a[1])); 24684 index_list2.$unshift(prefix2.$length()); 24685 basename_list2.$unshift(basename2); 24686 } if ($neqeq(prefix2, "")) { 24687 return path2 24688 } prefix1 = path1; 24689 while ($truthy(true)) { 24690 24691 while ($truthy(($truthy(($ret_or_1 = basename_list2['$empty?']()['$!']())) ? (basename_list2.$first()['$=='](".")) : ($ret_or_1)))) { 24692 24693 index_list2.$shift(); 24694 basename_list2.$shift(); 24695 } if (!$truthy((r1 = self.$chop_basename(prefix1)))) { 24696 break 24697 } $b = r1, $a = $to_ary($b), (prefix1 = ($a[0] == null ? nil : $a[0])), (basename1 = ($a[1] == null ? nil : $a[1])); 24698 if ($eqeq(basename1, ".")) { 24699 continue 24700 } if ((($eqeq(basename1, "..") || ($truthy(basename_list2['$empty?']()))) || ($neqeq(basename_list2.$first(), "..")))) { 24701 24702 prefix1 = $rb_plus(prefix1, basename1); 24703 break; 24704 } index_list2.$shift(); 24705 basename_list2.$shift(); 24706 } r1 = self.$chop_basename(prefix1); 24707 if (($not(r1) && ($truthy($regexp([$$('SEPARATOR_PAT')])['$=~']($$('File').$basename(prefix1)))))) { 24708 while ($truthy(($truthy(($ret_or_1 = basename_list2['$empty?']()['$!']())) ? (basename_list2.$first()['$==']("..")) : ($ret_or_1)))) { 24709 24710 index_list2.$shift(); 24711 basename_list2.$shift(); 24712 } 24713 } if ($not(basename_list2['$empty?']())) { 24714 24715 suffix2 = path2['$[]'](Opal.Range.$new(index_list2.$first(), -1, false)); 24716 if ($truthy(r1)) { 24717 return $$('File').$join(prefix1, suffix2) 24718 } else { 24719 return $rb_plus(prefix1, suffix2) 24720 } } else if ($truthy(r1)) { 24721 return prefix1 24722 } else { 24723 return $$('File').$dirname(prefix1) 24724 } }); 24725 24726 $def(self, '$join', function $$join($a) {try { var $t_return = $thrower('return'); 24727 var $post_args, args, self = this, result = nil; 24728 24729 24730 $post_args = $slice(arguments); 24731 args = $post_args; 24732 if ($truthy(args['$empty?']())) { 24733 return self 24734 }; 24735 result = args.$pop(); 24736 if (!$eqeqeq($$('Pathname'), result)) { 24737 result = $$('Pathname').$new(result); 24738 }; 24739 if ($truthy(result['$absolute?']())) { 24740 return result 24741 }; 24742 $send(args, 'reverse_each', [], function $$6(arg){ 24743 24744 if (arg == null) arg = nil; 24745 if (!$eqeqeq($$('Pathname'), arg)) { 24746 arg = $$('Pathname').$new(arg); 24747 }; 24748 result = $rb_plus(arg, result); 24749 if ($truthy(result['$absolute?']())) { 24750 $t_return.$throw(result); 24751 } else { 24752 return nil 24753 };}, {$$ret: $t_return}); 24754 return $rb_plus(self, result);} catch($e) { 24755 if ($e === $t_return) return $e.$v; 24756 throw $e; 24757 } 24758 }, -1); 24759 24760 $def(self, '$split', function $$split() { 24761 var self = this; 24762 24763 return [self.$dirname(), self.$basename()] 24764 }); 24765 24766 $def(self, '$dirname', function $$dirname() { 24767 var self = this; 24768 24769 return $$('Pathname').$new($$('File').$dirname(self.path)) 24770 }); 24771 24772 $def(self, '$basename', function $$basename() { 24773 var self = this; 24774 24775 return $$('Pathname').$new($$('File').$basename(self.path)) 24776 }); 24777 24778 $def(self, '$directory?', function $Pathname_directory$ques$7() { 24779 var self = this; 24780 24781 return $$('File')['$directory?'](self.path) 24782 }); 24783 24784 $def(self, '$extname', function $$extname() { 24785 var self = this; 24786 24787 return $$('File').$extname(self.path) 24788 }); 24789 24790 $def(self, '$<=>', function $Pathname_$lt_eq_gt$8(other) { 24791 var self = this; 24792 24793 return self.$path()['$<=>'](other.$path()) 24794 }); 24795 $const_set($nesting[0], 'SAME_PATHS', ($truthy($$$($$('File'), 'FNM_SYSCASE')['$nonzero?']()) ? ($send(self, 'proc', [], function $Pathname$9(a, b){ 24796 24797 if (a == null) a = nil; 24798 if (b == null) b = nil; 24799 return a.$casecmp(b)['$=='](0);})) : ($send(self, 'proc', [], function $Pathname$10(a, b){ 24800 24801 if (a == null) a = nil; 24802 if (b == null) b = nil; 24803 return a['$=='](b);})))); 24804 24805 $def(self, '$relative_path_from', function $$relative_path_from(base_directory) { 24806 var $a, $b, self = this, dest_directory = nil, dest_prefix = nil, dest_names = nil, r = nil, basename = nil, base_prefix = nil, base_names = nil, $ret_or_1 = nil, $ret_or_2 = nil, relpath_names = nil; 24807 24808 24809 dest_directory = self.$cleanpath().$to_s(); 24810 base_directory = base_directory.$cleanpath().$to_s(); 24811 dest_prefix = dest_directory; 24812 dest_names = []; 24813 while ($truthy((r = self.$chop_basename(dest_prefix)))) { 24814 24815 $b = r, $a = $to_ary($b), (dest_prefix = ($a[0] == null ? nil : $a[0])), (basename = ($a[1] == null ? nil : $a[1])); 24816 if ($neqeq(basename, ".")) { 24817 dest_names.$unshift(basename); 24818 } } base_prefix = base_directory; 24819 base_names = []; 24820 while ($truthy((r = self.$chop_basename(base_prefix)))) { 24821 24822 $b = r, $a = $to_ary($b), (base_prefix = ($a[0] == null ? nil : $a[0])), (basename = ($a[1] == null ? nil : $a[1])); 24823 if ($neqeq(basename, ".")) { 24824 base_names.$unshift(basename); 24825 } } if (!$truthy($$('SAME_PATHS')['$[]'](dest_prefix, base_prefix))) { 24826 self.$raise($$('ArgumentError'), "different prefix: " + (dest_prefix.$inspect()) + " and " + (base_directory.$inspect())); 24827 } while ($truthy(($truthy(($ret_or_1 = ($truthy(($ret_or_2 = dest_names['$empty?']()['$!']())) ? (base_names['$empty?']()['$!']()) : ($ret_or_2)))) ? ($$('SAME_PATHS')['$[]'](dest_names.$first(), base_names.$first())) : ($ret_or_1)))) { 24828 24829 dest_names.$shift(); 24830 base_names.$shift(); 24831 } if ($truthy(base_names['$include?'](".."))) { 24832 self.$raise($$('ArgumentError'), "base_directory has ..: " + (base_directory.$inspect())); 24833 } base_names.$fill(".."); 24834 relpath_names = $rb_plus(base_names, dest_names); 24835 if ($truthy(relpath_names['$empty?']())) { 24836 return $$('Pathname').$new(".") 24837 } else { 24838 return $$('Pathname').$new($send($$('File'), 'join', $to_a(relpath_names))) 24839 } }); 24840 24841 $def(self, '$entries', function $$entries() { 24842 var self = this; 24843 24844 return $send($$('Dir').$entries(self.path), 'map', [], function $$11(f){var self = $$11.$$s == null ? this : $$11.$$s; 24845 24846 24847 if (f == null) f = nil; 24848 return self.$class().$new(f);}, {$$s: self}) 24849 }); 24850 $alias(self, "===", "=="); 24851 $alias(self, "eql?", "=="); 24852 $alias(self, "to_s", "to_path"); 24853 return $alias(self, "to_str", "to_path"); 24854 })($nesting[0], null, $nesting); 24855 return (function($base, $parent_nesting) { 24856 var self = $module($base, 'Kernel'); 24857 24858 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 24859 24860 return $def(self, '$Pathname', function $$Pathname(path) { 24861 24862 return $$('Pathname').$new(path) 24863 }) 24864 })($nesting[0], $nesting); 24865}; 24866 24867Opal.modules["nodejs/pathname"] = function(Opal) {/* Generated by Opal 1.7.3 */ 24868 var $klass = Opal.klass, $def = Opal.def, $return_ivar = Opal.return_ivar, self = Opal.top, $nesting = [], nil = Opal.nil; 24869 24870 Opal.add_stubs('require,include,to_str,!,absolute?'); 24871 24872 self.$require("pathname"); 24873 return (function($base, $super, $parent_nesting) { 24874 var self = $klass($base, $super, 'Pathname'); 24875 24876 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype; 24877 if (self.__path__ == null) self.__path__ = nil; 24878 24879 $proto.path = nil; 24880 24881 self.$include($$('Comparable')); 24882 self.__path__ = __path__; 24883 24884 $def(self, '$absolute?', function $Pathname_absolute$ques$1() { 24885 var self = this; 24886 24887 return __path__.isAbsolute(self.path.$to_str()) 24888 }); 24889 24890 $def(self, '$relative?', function $Pathname_relative$ques$2() { 24891 var self = this; 24892 24893 return self['$absolute?']()['$!']() 24894 }); 24895 return $def(self, '$to_path', $return_ivar("path")); 24896 })($nesting[0], null, $nesting); 24897}; 24898 24899Opal.modules["nodejs/env"] = function(Opal) {/* Generated by Opal 1.7.3 */ 24900 var $const_set = Opal.const_set, $def = Opal.def, $truthy = Opal.truthy, $return_val = Opal.return_val, $send = Opal.send, $alias = Opal.alias, $nesting = [], $$ = Opal.$r($nesting), nil = Opal.nil; 24901 24902 Opal.add_stubs('new,to_s,key?,[],raise,to_h,keys,merge'); 24903 24904 $const_set($nesting[0], 'ENV', $$('Object').$new()); 24905 return (function(self, $parent_nesting) { 24906 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 24907 24908 24909 24910 $def(self, '$[]', function $$$1(name) { 24911 24912 return process.env[name] || nil 24913 }); 24914 24915 $def(self, '$[]=', function $$$eq$2(name, value) { 24916 24917 return process.env[name.$to_s()] = value.$to_s() 24918 }); 24919 24920 $def(self, '$key?', function $key$ques$3(name) { 24921 24922 return process.env.hasOwnProperty(name) 24923 }); 24924 24925 $def(self, '$empty?', function $empty$ques$4() { 24926 24927 return Object.keys(process.env).length === 0; 24928 }); 24929 24930 $def(self, '$keys', function $$keys() { 24931 24932 return Object.keys(process.env); 24933 }); 24934 24935 $def(self, '$delete', function $delete$5(name) { 24936 24937 24938 var value = process.env[name] || nil; 24939 delete process.env[name]; 24940 return value; 24941 24942 }); 24943 24944 $def(self, '$fetch', function $$fetch(key, default_value) { 24945 var block = $$fetch.$$p || nil, self = this; 24946 24947 $$fetch.$$p = null; 24948 if ($truthy(self['$key?'](key))) { 24949 return self['$[]'](key) 24950 } if ((block !== nil)) { 24951 return Opal.yield1(block, key) 24952 } if (!$truthy(typeof(default_value) === 'undefined')) { 24953 return default_value 24954 } return self.$raise($$('KeyError'), "key not found"); 24955 }, -2); 24956 24957 $def(self, '$to_s', $return_val("ENV")); 24958 24959 $def(self, '$to_h', function $$to_h() { 24960 var self = this; 24961 24962 return $send(self.$keys(), 'to_h', [], function $$6(k){var self = $$6.$$s == null ? this : $$6.$$s; 24963 24964 24965 if (k == null) k = nil; 24966 return [k, self['$[]'](k)];}, {$$s: self}) 24967 }); 24968 24969 $def(self, '$merge', function $$merge(keys) { 24970 var self = this; 24971 24972 return self.$to_h().$merge(keys) 24973 }); 24974 $alias(self, "has_key?", "key?"); 24975 $alias(self, "include?", "key?"); 24976 $alias(self, "inspect", "to_s"); 24977 $alias(self, "member?", "key?"); 24978 return $alias(self, "to_hash", "to_h"); 24979 })(Opal.get_singleton_class($$('ENV')), $nesting); 24980}; 24981 24982Opal.modules["nodejs"] = function(Opal) {/* Generated by Opal 1.7.3 */ 24983 var self = Opal.top; Opal.nil; 24984 24985 Opal.add_stubs('require'); 24986 24987 self.$require("nodejs/base"); 24988 self.$require("nodejs/file"); 24989 self.$require("nodejs/dir"); 24990 self.$require("nodejs/io"); 24991 self.$require("nodejs/argf"); 24992 self.$require("nodejs/open-uri"); 24993 self.$require("nodejs/pathname"); 24994 return self.$require("nodejs/env"); 24995}; 24996 24997Opal.modules["corelib/comparable"] = function(Opal) {/* Generated by Opal 1.7.3 */ 24998 var $truthy = Opal.truthy, $module = Opal.module, $rb_gt = Opal.rb_gt, $rb_lt = Opal.rb_lt, $eqeqeq = Opal.eqeqeq, $Kernel = Opal.Kernel, $def = Opal.def, nil = Opal.nil, $$$ = Opal.$$$; 24999 25000 Opal.add_stubs('>,<,===,raise,class,<=>,equal?'); 25001 return (function($base) { 25002 var self = $module($base, 'Comparable'); 25003 25004 var $ret_or_1 = nil; 25005 25006 25007 25008 function normalize(what) { 25009 if (Opal.is_a(what, Opal.Integer)) { return what; } 25010 25011 if ($rb_gt(what, 0)) { return 1; } 25012 if ($rb_lt(what, 0)) { return -1; } 25013 return 0; 25014 } 25015 25016 function fail_comparison(lhs, rhs) { 25017 var class_name; 25018 (($eqeqeq(nil, ($ret_or_1 = rhs)) || (($eqeqeq(true, $ret_or_1) || (($eqeqeq(false, $ret_or_1) || (($eqeqeq($$$('Integer'), $ret_or_1) || ($eqeqeq($$$('Float'), $ret_or_1))))))))) ? (class_name = rhs.$inspect()) : (class_name = rhs.$$class)); 25019 $Kernel.$raise($$$('ArgumentError'), "comparison of " + ((lhs).$class()) + " with " + (class_name) + " failed"); 25020 } 25021 25022 function cmp_or_fail(lhs, rhs) { 25023 var cmp = (lhs)['$<=>'](rhs); 25024 if (!$truthy(cmp)) fail_comparison(lhs, rhs); 25025 return normalize(cmp); 25026 } 25027 25028 $def(self, '$==', function $Comparable_$eq_eq$1(other) { 25029 var self = this, cmp = nil; 25030 25031 25032 if ($truthy(self['$equal?'](other))) { 25033 return true 25034 } 25035 if (self["$<=>"] == Opal.Kernel["$<=>"]) { 25036 return false; 25037 } 25038 25039 // check for infinite recursion 25040 if (self.$$comparable) { 25041 self.$$comparable = false; 25042 return false; 25043 } 25044 if (!$truthy((cmp = self['$<=>'](other)))) { 25045 return false 25046 } return normalize(cmp) == 0; }); 25047 25048 $def(self, '$>', function $Comparable_$gt$2(other) { 25049 var self = this; 25050 25051 return cmp_or_fail(self, other) > 0; 25052 }); 25053 25054 $def(self, '$>=', function $Comparable_$gt_eq$3(other) { 25055 var self = this; 25056 25057 return cmp_or_fail(self, other) >= 0; 25058 }); 25059 25060 $def(self, '$<', function $Comparable_$lt$4(other) { 25061 var self = this; 25062 25063 return cmp_or_fail(self, other) < 0; 25064 }); 25065 25066 $def(self, '$<=', function $Comparable_$lt_eq$5(other) { 25067 var self = this; 25068 25069 return cmp_or_fail(self, other) <= 0; 25070 }); 25071 25072 $def(self, '$between?', function $Comparable_between$ques$6(min, max) { 25073 var self = this; 25074 25075 25076 if ($rb_lt(self, min)) { 25077 return false 25078 } if ($rb_gt(self, max)) { 25079 return false 25080 } return true; 25081 }); 25082 return $def(self, '$clamp', function $$clamp(min, max) { 25083 var self = this; 25084 25085 25086 if (max == null) max = nil; 25087 25088 var c, excl; 25089 25090 if (max === nil) { 25091 // We are dealing with a new Ruby 2.7 behaviour that we are able to 25092 // provide a single Range argument instead of 2 Comparables. 25093 25094 if (!Opal.is_a(min, Opal.Range)) { 25095 $Kernel.$raise($$$('TypeError'), "wrong argument type " + (min.$class()) + " (expected Range)"); 25096 } 25097 25098 excl = min.excl; 25099 max = min.end; 25100 min = min.begin; 25101 25102 if (max !== nil && excl) { 25103 $Kernel.$raise($$$('ArgumentError'), "cannot clamp with an exclusive range"); 25104 } 25105 } 25106 25107 if (min !== nil && max !== nil && cmp_or_fail(min, max) > 0) { 25108 $Kernel.$raise($$$('ArgumentError'), "min argument must be smaller than max argument"); 25109 } 25110 25111 if (min !== nil) { 25112 c = cmp_or_fail(self, min); 25113 25114 if (c == 0) return self; 25115 if (c < 0) return min; 25116 } 25117 25118 if (max !== nil) { 25119 c = cmp_or_fail(self, max); 25120 25121 if (c > 0) return max; 25122 } 25123 25124 return self; 25125 }, -2); 25126 })('::') 25127}; 25128 25129Opal.modules["pathname"] = function(Opal) {/* Generated by Opal 1.7.3 */ 25130 var $klass = Opal.klass, $const_set = Opal.const_set, $regexp = Opal.regexp, $eqeqeq = Opal.eqeqeq, $truthy = Opal.truthy, $eqeq = Opal.eqeq, $def = Opal.def, $defs = Opal.defs, $to_ary = Opal.to_ary, $slice = Opal.slice, $send = Opal.send, $to_a = Opal.to_a, $return_ivar = Opal.return_ivar, $neqeq = Opal.neqeq, $rb_plus = Opal.rb_plus, $not = Opal.not, $thrower = Opal.thrower, $alias = Opal.alias, $module = Opal.module, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$; 25131 25132 Opal.add_stubs('require,include,quote,===,to_s,path,respond_to?,to_path,is_a?,nil?,raise,class,==,new,pwd,attr_reader,!,relative?,chop_basename,basename,=~,source,[],rindex,sub,absolute?,expand_path,plus,unshift,length,!=,empty?,first,shift,+,join,dirname,pop,reverse_each,directory?,extname,<=>,nonzero?,proc,casecmp,cleanpath,inspect,include?,fill,map,entries'); 25133 25134 self.$require("corelib/comparable"); 25135 (function($base, $super, $parent_nesting) { 25136 var self = $klass($base, $super, 'Pathname'); 25137 25138 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype; 25139 25140 $proto.path = nil; 25141 25142 self.$include($$('Comparable')); 25143 $const_set($nesting[0], 'SEPARATOR_PAT', $regexp([$$('Regexp').$quote($$$($$('File'), 'SEPARATOR'))])); 25144 25145 $def(self, '$initialize', function $$initialize(path) { 25146 var self = this; 25147 25148 25149 if ($eqeqeq($$('Pathname'), path)) { 25150 self.path = path.$path().$to_s(); 25151 } else if ($truthy(path['$respond_to?']("to_path"))) { 25152 self.path = path.$to_path(); 25153 } else if ($truthy(path['$is_a?']($$('String')))) { 25154 self.path = path; 25155 } else if ($truthy(path['$nil?']())) { 25156 self.$raise($$('TypeError'), "no implicit conversion of nil into String"); 25157 } else { 25158 self.$raise($$('TypeError'), "no implicit conversion of " + (path.$class()) + " into String"); 25159 } if ($eqeq(self.path, "\u0000")) { 25160 return self.$raise($$('ArgumentError')) 25161 } else { 25162 return nil 25163 } }); 25164 $defs(self, '$pwd', function $$pwd() { 25165 var self = this; 25166 25167 return self.$new($$('Dir').$pwd()) 25168 }); 25169 self.$attr_reader("path"); 25170 25171 $def(self, '$==', function $Pathname_$eq_eq$1(other) { 25172 var self = this; 25173 25174 return other.$path()['$=='](self.path) 25175 }); 25176 25177 $def(self, '$absolute?', function $Pathname_absolute$ques$2() { 25178 var self = this; 25179 25180 return self['$relative?']()['$!']() 25181 }); 25182 25183 $def(self, '$relative?', function $Pathname_relative$ques$3() { 25184 var $a, $b, self = this, path = nil, r = nil; 25185 25186 25187 path = self.path; 25188 while ($truthy((r = self.$chop_basename(path)))) { 25189 $b = r, $a = $to_ary($b), (path = ($a[0] == null ? nil : $a[0])); 25190 } return path['$=='](""); 25191 }); 25192 25193 $def(self, '$chop_basename', function $$chop_basename(path) { 25194 var base = nil; 25195 25196 25197 base = $$('File').$basename(path); 25198 if ($truthy($$('Regexp').$new("^" + ($$$($$('Pathname'), 'SEPARATOR_PAT').$source()) + "?$")['$=~'](base))) { 25199 return nil 25200 } else { 25201 return [path['$[]'](0, path.$rindex(base)), base] 25202 } }); 25203 25204 $def(self, '$root?', function $Pathname_root$ques$4() { 25205 var self = this; 25206 25207 return self.path['$==']("/") 25208 }); 25209 25210 $def(self, '$parent', function $$parent() { 25211 var self = this, new_path = nil; 25212 25213 25214 new_path = self.path.$sub(/\/([^\/]+\/?$)/, ""); 25215 if ($eqeq(new_path, "")) { 25216 new_path = ($truthy(self['$absolute?']()) ? ("/") : (".")); 25217 } return $$('Pathname').$new(new_path); 25218 }); 25219 25220 $def(self, '$sub', function $$sub($a) { 25221 var $post_args, args, self = this; 25222 25223 25224 $post_args = $slice(arguments); 25225 args = $post_args; 25226 return $$('Pathname').$new($send(self.path, 'sub', $to_a(args))); 25227 }, -1); 25228 25229 $def(self, '$cleanpath', function $$cleanpath() { 25230 var self = this; 25231 25232 return Opal.normalize(self.path) 25233 }); 25234 25235 $def(self, '$to_path', $return_ivar("path")); 25236 25237 $def(self, '$hash', $return_ivar("path")); 25238 25239 $def(self, '$expand_path', function $$expand_path() { 25240 var self = this; 25241 25242 return $$('Pathname').$new($$('File').$expand_path(self.path)) 25243 }); 25244 25245 $def(self, '$+', function $Pathname_$plus$5(other) { 25246 var self = this; 25247 25248 25249 if (!$eqeqeq($$('Pathname'), other)) { 25250 other = $$('Pathname').$new(other); 25251 } return $$('Pathname').$new(self.$plus(self.path, other.$to_s())); 25252 }); 25253 25254 $def(self, '$plus', function $$plus(path1, path2) { 25255 var $a, $b, self = this, prefix2 = nil, index_list2 = nil, basename_list2 = nil, r2 = nil, basename2 = nil, prefix1 = nil, $ret_or_1 = nil, r1 = nil, basename1 = nil, suffix2 = nil; 25256 25257 25258 prefix2 = path2; 25259 index_list2 = []; 25260 basename_list2 = []; 25261 while ($truthy((r2 = self.$chop_basename(prefix2)))) { 25262 25263 $b = r2, $a = $to_ary($b), (prefix2 = ($a[0] == null ? nil : $a[0])), (basename2 = ($a[1] == null ? nil : $a[1])); 25264 index_list2.$unshift(prefix2.$length()); 25265 basename_list2.$unshift(basename2); 25266 } if ($neqeq(prefix2, "")) { 25267 return path2 25268 } prefix1 = path1; 25269 while ($truthy(true)) { 25270 25271 while ($truthy(($truthy(($ret_or_1 = basename_list2['$empty?']()['$!']())) ? (basename_list2.$first()['$=='](".")) : ($ret_or_1)))) { 25272 25273 index_list2.$shift(); 25274 basename_list2.$shift(); 25275 } if (!$truthy((r1 = self.$chop_basename(prefix1)))) { 25276 break 25277 } $b = r1, $a = $to_ary($b), (prefix1 = ($a[0] == null ? nil : $a[0])), (basename1 = ($a[1] == null ? nil : $a[1])); 25278 if ($eqeq(basename1, ".")) { 25279 continue 25280 } if ((($eqeq(basename1, "..") || ($truthy(basename_list2['$empty?']()))) || ($neqeq(basename_list2.$first(), "..")))) { 25281 25282 prefix1 = $rb_plus(prefix1, basename1); 25283 break; 25284 } index_list2.$shift(); 25285 basename_list2.$shift(); 25286 } r1 = self.$chop_basename(prefix1); 25287 if (($not(r1) && ($truthy($regexp([$$('SEPARATOR_PAT')])['$=~']($$('File').$basename(prefix1)))))) { 25288 while ($truthy(($truthy(($ret_or_1 = basename_list2['$empty?']()['$!']())) ? (basename_list2.$first()['$==']("..")) : ($ret_or_1)))) { 25289 25290 index_list2.$shift(); 25291 basename_list2.$shift(); 25292 } 25293 } if ($not(basename_list2['$empty?']())) { 25294 25295 suffix2 = path2['$[]'](Opal.Range.$new(index_list2.$first(), -1, false)); 25296 if ($truthy(r1)) { 25297 return $$('File').$join(prefix1, suffix2) 25298 } else { 25299 return $rb_plus(prefix1, suffix2) 25300 } } else if ($truthy(r1)) { 25301 return prefix1 25302 } else { 25303 return $$('File').$dirname(prefix1) 25304 } }); 25305 25306 $def(self, '$join', function $$join($a) {try { var $t_return = $thrower('return'); 25307 var $post_args, args, self = this, result = nil; 25308 25309 25310 $post_args = $slice(arguments); 25311 args = $post_args; 25312 if ($truthy(args['$empty?']())) { 25313 return self 25314 }; 25315 result = args.$pop(); 25316 if (!$eqeqeq($$('Pathname'), result)) { 25317 result = $$('Pathname').$new(result); 25318 }; 25319 if ($truthy(result['$absolute?']())) { 25320 return result 25321 }; 25322 $send(args, 'reverse_each', [], function $$6(arg){ 25323 25324 if (arg == null) arg = nil; 25325 if (!$eqeqeq($$('Pathname'), arg)) { 25326 arg = $$('Pathname').$new(arg); 25327 }; 25328 result = $rb_plus(arg, result); 25329 if ($truthy(result['$absolute?']())) { 25330 $t_return.$throw(result); 25331 } else { 25332 return nil 25333 };}, {$$ret: $t_return}); 25334 return $rb_plus(self, result);} catch($e) { 25335 if ($e === $t_return) return $e.$v; 25336 throw $e; 25337 } 25338 }, -1); 25339 25340 $def(self, '$split', function $$split() { 25341 var self = this; 25342 25343 return [self.$dirname(), self.$basename()] 25344 }); 25345 25346 $def(self, '$dirname', function $$dirname() { 25347 var self = this; 25348 25349 return $$('Pathname').$new($$('File').$dirname(self.path)) 25350 }); 25351 25352 $def(self, '$basename', function $$basename() { 25353 var self = this; 25354 25355 return $$('Pathname').$new($$('File').$basename(self.path)) 25356 }); 25357 25358 $def(self, '$directory?', function $Pathname_directory$ques$7() { 25359 var self = this; 25360 25361 return $$('File')['$directory?'](self.path) 25362 }); 25363 25364 $def(self, '$extname', function $$extname() { 25365 var self = this; 25366 25367 return $$('File').$extname(self.path) 25368 }); 25369 25370 $def(self, '$<=>', function $Pathname_$lt_eq_gt$8(other) { 25371 var self = this; 25372 25373 return self.$path()['$<=>'](other.$path()) 25374 }); 25375 $const_set($nesting[0], 'SAME_PATHS', ($truthy($$$($$('File'), 'FNM_SYSCASE')['$nonzero?']()) ? ($send(self, 'proc', [], function $Pathname$9(a, b){ 25376 25377 if (a == null) a = nil; 25378 if (b == null) b = nil; 25379 return a.$casecmp(b)['$=='](0);})) : ($send(self, 'proc', [], function $Pathname$10(a, b){ 25380 25381 if (a == null) a = nil; 25382 if (b == null) b = nil; 25383 return a['$=='](b);})))); 25384 25385 $def(self, '$relative_path_from', function $$relative_path_from(base_directory) { 25386 var $a, $b, self = this, dest_directory = nil, dest_prefix = nil, dest_names = nil, r = nil, basename = nil, base_prefix = nil, base_names = nil, $ret_or_1 = nil, $ret_or_2 = nil, relpath_names = nil; 25387 25388 25389 dest_directory = self.$cleanpath().$to_s(); 25390 base_directory = base_directory.$cleanpath().$to_s(); 25391 dest_prefix = dest_directory; 25392 dest_names = []; 25393 while ($truthy((r = self.$chop_basename(dest_prefix)))) { 25394 25395 $b = r, $a = $to_ary($b), (dest_prefix = ($a[0] == null ? nil : $a[0])), (basename = ($a[1] == null ? nil : $a[1])); 25396 if ($neqeq(basename, ".")) { 25397 dest_names.$unshift(basename); 25398 } } base_prefix = base_directory; 25399 base_names = []; 25400 while ($truthy((r = self.$chop_basename(base_prefix)))) { 25401 25402 $b = r, $a = $to_ary($b), (base_prefix = ($a[0] == null ? nil : $a[0])), (basename = ($a[1] == null ? nil : $a[1])); 25403 if ($neqeq(basename, ".")) { 25404 base_names.$unshift(basename); 25405 } } if (!$truthy($$('SAME_PATHS')['$[]'](dest_prefix, base_prefix))) { 25406 self.$raise($$('ArgumentError'), "different prefix: " + (dest_prefix.$inspect()) + " and " + (base_directory.$inspect())); 25407 } while ($truthy(($truthy(($ret_or_1 = ($truthy(($ret_or_2 = dest_names['$empty?']()['$!']())) ? (base_names['$empty?']()['$!']()) : ($ret_or_2)))) ? ($$('SAME_PATHS')['$[]'](dest_names.$first(), base_names.$first())) : ($ret_or_1)))) { 25408 25409 dest_names.$shift(); 25410 base_names.$shift(); 25411 } if ($truthy(base_names['$include?'](".."))) { 25412 self.$raise($$('ArgumentError'), "base_directory has ..: " + (base_directory.$inspect())); 25413 } base_names.$fill(".."); 25414 relpath_names = $rb_plus(base_names, dest_names); 25415 if ($truthy(relpath_names['$empty?']())) { 25416 return $$('Pathname').$new(".") 25417 } else { 25418 return $$('Pathname').$new($send($$('File'), 'join', $to_a(relpath_names))) 25419 } }); 25420 25421 $def(self, '$entries', function $$entries() { 25422 var self = this; 25423 25424 return $send($$('Dir').$entries(self.path), 'map', [], function $$11(f){var self = $$11.$$s == null ? this : $$11.$$s; 25425 25426 25427 if (f == null) f = nil; 25428 return self.$class().$new(f);}, {$$s: self}) 25429 }); 25430 $alias(self, "===", "=="); 25431 $alias(self, "eql?", "=="); 25432 $alias(self, "to_s", "to_path"); 25433 return $alias(self, "to_str", "to_path"); 25434 })($nesting[0], null, $nesting); 25435 return (function($base, $parent_nesting) { 25436 var self = $module($base, 'Kernel'); 25437 25438 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting); 25439 25440 return $def(self, '$Pathname', function $$Pathname(path) { 25441 25442 return $$('Pathname').$new(path) 25443 }) 25444 })($nesting[0], $nesting); 25445}; 25446 25447Opal.modules["stringio"] = function(Opal) {/* Generated by Opal 1.7.3 */ 25448 var $klass = Opal.klass, $defs = Opal.defs, $send2 = Opal.send2, $find_super = Opal.find_super, $def = Opal.def, $eqeqeq = Opal.eqeqeq, $truthy = Opal.truthy, $rb_ge = Opal.rb_ge, $rb_gt = Opal.rb_gt, $rb_plus = Opal.rb_plus, $rb_minus = Opal.rb_minus, $return_ivar = Opal.return_ivar, $eqeq = Opal.eqeq, $alias = Opal.alias, $nesting = [], $$ = Opal.$r($nesting), nil = Opal.nil, $$$ = Opal.$$$; 25449 25450 Opal.add_stubs('new,call,close,attr_accessor,check_readable,==,length,===,>=,raise,>,+,-,seek,check_writable,String,[],eof?,write,read,tell'); 25451 return (function($base, $super, $parent_nesting) { 25452 var self = $klass($base, $super, 'StringIO'); 25453 25454 var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype; 25455 25456 $proto.position = $proto.string = nil; 25457 25458 $defs(self, '$open', function $$open(string, mode) { 25459 var block = $$open.$$p || nil, self = this, io = nil, res = nil; 25460 25461 $$open.$$p = null; 25462 if (string == null) string = ""; 25463 if (mode == null) mode = nil; 25464 io = self.$new(string, mode); 25465 res = block.$call(io); 25466 io.$close(); 25467 return res; 25468 }, -1); 25469 self.$attr_accessor("string"); 25470 25471 $def(self, '$initialize', function $$initialize(string, mode) { 25472 var self = this; 25473 25474 $$initialize.$$p = null; 25475 25476 if (string == null) string = ""; 25477 if (mode == null) mode = "rw"; 25478 self.string = string; 25479 self.position = 0; 25480 return $send2(self, $find_super(self, 'initialize', $$initialize, false, true), 'initialize', [nil, mode], null); 25481 }, -1); 25482 25483 $def(self, '$eof?', function $StringIO_eof$ques$1() { 25484 var self = this; 25485 25486 25487 self.$check_readable(); 25488 return self.position['$=='](self.string.$length()); 25489 }); 25490 25491 $def(self, '$seek', function $$seek(pos, whence) { 25492 var self = this, $ret_or_1 = nil; 25493 25494 25495 if (whence == null) whence = $$$($$('IO'), 'SEEK_SET'); 25496 self.read_buffer = ""; 25497 if ($eqeqeq($$$($$('IO'), 'SEEK_SET'), ($ret_or_1 = whence))) { 25498 25499 if (!$truthy($rb_ge(pos, 0))) { 25500 self.$raise($$$($$('Errno'), 'EINVAL')); 25501 } self.position = pos; 25502 } else if ($eqeqeq($$$($$('IO'), 'SEEK_CUR'), $ret_or_1)) { 25503 if ($truthy($rb_gt($rb_plus(self.position, pos), self.string.$length()))) { 25504 self.position = self.string.$length(); 25505 } else { 25506 self.position = $rb_plus(self.position, pos); 25507 } 25508 } else if ($eqeqeq($$$($$('IO'), 'SEEK_END'), $ret_or_1)) { 25509 if ($truthy($rb_gt(pos, self.string.$length()))) { 25510 self.position = 0; 25511 } else { 25512 self.position = $rb_minus(self.position, pos); 25513 } 25514 } else ; return 0; 25515 }, -2); 25516 25517 $def(self, '$tell', $return_ivar("position")); 25518 25519 $def(self, '$rewind', function $$rewind() { 25520 var self = this; 25521 25522 return self.$seek(0) 25523 }); 25524 25525 $def(self, '$write', function $$write(string) { 25526 var self = this, before = nil, after = nil; 25527 25528 25529 self.$check_writable(); 25530 self.read_buffer = ""; 25531 string = self.$String(string); 25532 if ($eqeq(self.string.$length(), self.position)) { 25533 25534 self.string = $rb_plus(self.string, string); 25535 return (self.position = $rb_plus(self.position, string.$length())); 25536 } else { 25537 25538 before = self.string['$[]'](Opal.Range.$new(0, $rb_minus(self.position, 1), false)); 25539 after = self.string['$[]'](Opal.Range.$new($rb_plus(self.position, string.$length()), -1, false)); 25540 self.string = $rb_plus($rb_plus(before, string), after); 25541 return (self.position = $rb_plus(self.position, string.$length())); 25542 } }); 25543 25544 $def(self, '$read', function $$read(length, outbuf) { 25545 var self = this, string = nil, str = nil; 25546 25547 25548 if (length == null) length = nil; 25549 if (outbuf == null) outbuf = nil; 25550 self.$check_readable(); 25551 if ($truthy(self['$eof?']())) { 25552 return nil 25553 } string = ($truthy(length) ? (((str = self.string['$[]'](self.position, length)), (self.position = $rb_plus(self.position, length)), ($truthy($rb_gt(self.position, self.string.$length())) ? ((self.position = self.string.$length())) : nil), str)) : (((str = self.string['$[]'](Opal.Range.$new(self.position, -1, false))), (self.position = self.string.$length()), str))); 25554 if ($truthy(outbuf)) { 25555 return outbuf.$write(string) 25556 } else { 25557 return string 25558 } }, -1); 25559 25560 $def(self, '$sysread', function $$sysread(length) { 25561 var self = this; 25562 25563 25564 self.$check_readable(); 25565 return self.$read(length); 25566 }); 25567 $alias(self, "eof", "eof?"); 25568 $alias(self, "pos", "tell"); 25569 $alias(self, "pos=", "seek"); 25570 return $alias(self, "readpartial", "read"); 25571 })($nesting[0], $$('IO'), $nesting) 25572}; 25573 25574module.exports = Opal$1; 25575