Sha256: ab47af04f75dd6892b3c62cff8c2a9c9b39287f09fd35bc2362e9cc21f0071e4

Contents?: true

Size: 1.95 KB

Versions: 16

Compression:

Stored size: 1.95 KB

Contents

class TrueClass
  # Return 1
  def to_i
    1
  end
end
class FalseClass
  # Return 0
  def to_i
    0
  end
end

# :stopdoc:
unless Object.public_method_defined? :instance_exec
  class Object
    module InstanceExecHelper; end
    include InstanceExecHelper
    def instance_exec(*args, &block) # :nodoc:
      begin
        old_critical, Thread.critical = Thread.critical, true
        n = 0
        n += 1 while respond_to?(mname="__instance_exec#{n}")
        InstanceExecHelper.module_eval{ define_method(mname, &block) }
      ensure
        Thread.critical = old_critical
      end
      begin
        ret = send(mname, *args)
      ensure
        InstanceExecHelper.module_eval{ remove_method(mname) } rescue nil
      end
      ret
    end
  end
end
# :startdoc:

# Add javascript-like +apply+ and +call+ methods to Proc,
# called +js_apply+ and +js_call+, respectivly.
class Proc
  # Used on Rubyvis::Nest
  attr_accessor :order # :nodoc:
  
  # Emulation of +apply+ javascript method.
  # +apply+ has this signature
  #   my_proc.apply(my_obj, args)
  # where
  # [+my_proc+] a proc
  # [+my_obj+]  object inside proc is eval'ed
  # [args]      array of arguments for proc
  # 
  # +apply+ on javascript is very flexible. Can accept more or less
  # variables than explicitly defined parameters on lambda, so this
  # method adds or remove elements according to lambda arity
  #
  def js_apply(obj,args)
    arguments=args.dup
    # Modify numbers of args to works with arity
    min_args=self.arity > 0 ? self.arity : (-self.arity)-1
    
    if args.size > min_args and self.arity>0
      arguments=arguments[0,self.arity]
    elsif args.size < min_args
      arguments+=[nil]*(min_args-args.size)
    end
    #puts "#{args}->#{arguments} (#{self.arity})"
    if self.arity==0
        obj.instance_exec(&self)
    else
      obj.instance_exec(*arguments, &self)
    end
  end
  # Same as js_apply, but using explicit arguments
  def js_call(obj, *args)
    js_apply(obj,args)
  end
end

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
rubyvis-0.7.0 lib/rubyvis/javascript_behaviour.rb
rubyvis-0.6.1 lib/rubyvis/javascript_behaviour.rb
rubyvis-0.6.0 lib/rubyvis/javascript_behaviour.rb
rubyvis-0.5.2 lib/rubyvis/javascript_behaviour.rb
rubyvis-0.5.1 lib/rubyvis/javascript_behaviour.rb
rubyvis-0.5.0 lib/rubyvis/javascript_behaviour.rb
rubyvis-0.4.1 lib/rubyvis/javascript_behaviour.rb
rubyvis-0.4.0 lib/rubyvis/javascript_behaviour.rb
rubyvis-0.3.6 lib/rubyvis/javascript_behaviour.rb
rubyvis-0.3.5 lib/rubyvis/javascript_behaviour.rb
rubyvis-0.3.4 lib/rubyvis/javascript_behaviour.rb
rubyvis-0.3.3 lib/rubyvis/javascript_behaviour.rb
rubyvis-0.3.2 lib/rubyvis/javascript_behaviour.rb
rubyvis-0.3.1 lib/rubyvis/javascript_behaviour.rb
rubyvis-0.3.0 lib/rubyvis/javascript_behaviour.rb
rubyvis-0.2.2 lib/rubyvis/javascript_behaviour.rb