IceDragon200

IST - More Ruby Stuff

Nov 6th, 2011
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 14.08 KB | None | 0 0
  1. #==============================================================================#
  2. # ** IST - More Ruby Stuff
  3. #------------------------------------------------------------------------------#
  4. # ** Created by    : IceDragon (http://www.rpgmakervx.net/)
  5. # ** Version       : 1.8
  6. # ** Date Modified : 08/26/2011
  7. #------------------------------------------------------------------------------#
  8. # Adds some new methods to Ruby's default classes
  9. #==============================================================================#
  10. # // Features
  11. #==============================================================================#
  12. # // Object
  13. # //   deep_clone()
  14. # //
  15. # // Class
  16. # //   ref_accessor( accessor, pointer )
  17. # //   ref_reader( accessor, pointer )
  18. # //   ref_writer( accessor, pointer )
  19. # //   attr_boolean( accessors )
  20. # //
  21. # // Numeric
  22. # //   time_inject( inject_obj ) { |inject_obj, i| do_stuff }
  23. # //   nto_a( n )
  24. # //   to_roman()
  25. # //
  26. # // Enumerable
  27. # //   time_push( n ) { |obj, i| push_stuff }
  28. # //   time_push!( n ) { |obj, i| push_stuff }
  29. # //
  30. # // Array
  31. # //   rotate( n )
  32. # //   rotate!( n )
  33. # //   randomize()  or randomise()
  34. # //   randomize!() or randomise!()
  35. # //   any_match?( other_array )
  36. # //   all_match?( other_array )
  37. # //   count_match( other_array )
  38. # //   return_if() { |element| boolean_expression }
  39. # //   filter() { |element| boolean_expression }
  40. # //   filter!() { |element| boolean_expression }
  41. # //   build_from() { |element| pushable_object }
  42. # //   build_from!() { |element| pushable_object }
  43. # //   count() { |element| boolean_expression }
  44. # //   get_nth( n ) { |element| boolean_expression }
  45. # //   get_nth_index( n ) { |element| boolean_expression }
  46. # //   add_all()
  47. # //   average()
  48. # //   average() { |element| addable_value }
  49. # //   sync_sort( sync_array )
  50. # //   sync_sort!( sync_array )
  51. # //
  52. #==============================================================================#
  53. ($imported ||= {})["IST_MoreRubyStuff"] = true
  54. #==============================================================================#
  55. # ** Object
  56. #==============================================================================#
  57. class Object
  58.  
  59.   #--------------------------------------------------------------------------#
  60.   # * new-method :deep_clone
  61.   #--------------------------------------------------------------------------#
  62.   def deep_clone()
  63.     return Marshal.load( Marshal.dump(self) )
  64.   end unless method_defined? :deep_clone
  65.  
  66. end
  67.  
  68. #==============================================================================#
  69. # ** Class
  70. #==============================================================================#
  71. class Class
  72.  
  73.   def stat_accessor(*accessors)
  74.     accessors.each { |m|
  75.       define_method(m) do
  76.         instance_variable_get("@#{m}")
  77.       end
  78.      
  79.       define_method("#{m}_limit") do
  80.         instance_variable_get("@#{m}_limit")
  81.       end      
  82.      
  83.       define_method("#{m}=") do |val|
  84.         instance_variable_set("@#{m}",val)
  85.       end
  86.     }
  87.   end if false == true # // Yeah it never gonna happen
  88.   #--------------------------------------------------------------------------#
  89.   # * new-method :ref_accessor
  90.   #--------------------------------------------------------------------------#  
  91.   def ref_accessor( accessor, ref )
  92.     ref_reader accessor, ref
  93.     ref_writer accessor, ref
  94.   end unless method_defined? :ref_accessor
  95.  
  96.   #--------------------------------------------------------------------------#
  97.   # * new-method :ref_reader
  98.   #--------------------------------------------------------------------------#  
  99.   def ref_reader( accessor, ref )
  100.     define_method(accessor) {
  101.       self.send(ref)
  102.     }
  103.   end unless method_defined? :ref_reader
  104.  
  105.   #--------------------------------------------------------------------------#
  106.   # * new-method :ref_writer
  107.   #--------------------------------------------------------------------------#  
  108.   def ref_writer( accessor, ref )
  109.     define_method("#{accessor}=") { |val|
  110.       self.send("#{ref.to_s}=", val)
  111.     }
  112.   end unless method_defined? :ref_writer
  113.  
  114.   #--------------------------------------------------------------------------#
  115.   # * new-method :attr_boolean
  116.   #--------------------------------------------------------------------------#  
  117.   def attr_boolean( *accessors )
  118.     accessors.each { |a|
  119.       define_method(a.to_s+"?") {
  120.         instance_variable_get("@#{a}") == true
  121.       }
  122.     }  
  123.   end
  124.  
  125. end  
  126.  
  127. #==============================================================================#
  128. # ** Numeric
  129. #==============================================================================#
  130. class Numeric
  131.  
  132.   # // ROMAN and to_roman by Zetu
  133.   ROMAN = {
  134.        1  => "I",
  135.        5  => "V",
  136.       10  => "X",
  137.       50  => "L",
  138.      100  => "C",
  139.      500  => "D",
  140.     1000  => "M",
  141.     5000  => "",
  142.    10000  => ""
  143.   }
  144.  
  145.   #--------------------------------------------------------------------------#
  146.   # * new-method :time_inject
  147.   #--------------------------------------------------------------------------#  
  148.   def time_inject( obj )
  149.     result = obj ; self.times { |i| result = yield obj, i } ; return result
  150.   end unless method_defined? :time_inject
  151.  
  152.   #--------------------------------------------------------------------------#
  153.   # * new-method :nto_a
  154.   #--------------------------------------------------------------------------#  
  155.   def nto_a(n=0) ; ("%0#{n}d"%self).to_s.split(//).build_from { |s| s.to_i } ; end unless method_defined? :nto_a
  156.  
  157.   #--------------------------------------------------------------------------#
  158.   # * new-method :to_roman
  159.   #--------------------------------------------------------------------------#  
  160.   def to_roman()
  161.     value = self
  162.     if value < 4000
  163.       base = ""
  164.       for key in ROMAN.keys.sort.reverse
  165.         a = value / key
  166.         case a
  167.         when 0; next
  168.         when 1, 2, 3
  169.           base += ROMAN[key]*a
  170.         when 4
  171.           base += ROMAN[key]
  172.           base += ROMAN[key*5]
  173.         when 5, 6, 7, 8
  174.           base += ROMAN[key*5]
  175.           base += ROMAN[key]*a-5
  176.         when 9
  177.           base += ROMAN[key*10]
  178.           base += ROMAN[key]
  179.         end
  180.         value -= a * key
  181.       end
  182.       return base
  183.     else
  184.       return "---"
  185.     end
  186.   end unless method_defined? :to_roman
  187. end  
  188.  
  189. #==============================================================================#
  190. # ** Enumerable
  191. #==============================================================================#
  192. module Enumerable
  193.  
  194.   #--------------------------------------------------------------------------#
  195.   # * new-method :time_push
  196.   #--------------------------------------------------------------------------#  
  197.   def time_push( n )
  198.     n.time_inject( self ) { |obj, i| obj.push( (yield obj, i) ) }
  199.   end unless method_defined? :time_push
  200.  
  201.   #--------------------------------------------------------------------------#
  202.   # * new-method :time_push!
  203.   #--------------------------------------------------------------------------#  
  204.   def time_push!( n, &block )
  205.     self.concat( time_push( n, &block ) )
  206.   end unless method_defined? :time_push!
  207.  
  208. end  
  209.  
  210. #==============================================================================#
  211. # ** Array
  212. #==============================================================================#
  213. class Array
  214.  
  215.   #--------------------------------------------------------------------------#
  216.   # * new method :rotate
  217.   #--------------------------------------------------------------------------#  
  218.   def rotate( n=1 ) ; dup.rotate!( n ) ; end unless method_defined? :rotate
  219.  
  220.   #--------------------------------------------------------------------------#
  221.   # * new method :rotate!
  222.   #--------------------------------------------------------------------------#
  223.   def rotate!( n=1 )
  224.     return self if empty?
  225.     n %= size
  226.     concat( slice!( 0, n ) )
  227.   end unless method_defined? :rotate!
  228.  
  229.   #--------------------------------------------------------------------------#
  230.   # * new method :randomize
  231.   #--------------------------------------------------------------------------#
  232.   def randomize()
  233.     dup.randomize!()
  234.   end unless method_defined? :randomize
  235.  
  236.   #--------------------------------------------------------------------------#
  237.   # * new method :randomize!
  238.   #--------------------------------------------------------------------------#
  239.   def randomize!()
  240.     return self if empty?()
  241.     arra = sort_by { rand }
  242.     self.clear() ; self.concat arra
  243.   end unless method_defined? :randomize!
  244.  
  245.   #--------------------------------------------------------------------------#
  246.   # * new method :randomise/! (for spelling)
  247.   #--------------------------------------------------------------------------#
  248.   def randomise() ; randomize  ; end
  249.   def randomise!(); randomize! ; end
  250.  
  251.   #--------------------------------------------------------------------------#
  252.   # * new method :any_match?
  253.   #--------------------------------------------------------------------------#
  254.   def any_match?( match_array )
  255.     match_array.each { |e| return true if include?(e) } ; return false
  256.   end unless method_defined? :any_match?
  257.  
  258.   #--------------------------------------------------------------------------#
  259.   # * new method :all_match?
  260.   #--------------------------------------------------------------------------#
  261.   def all_match?( match_array )
  262.     return true if self == match_array
  263.     match_array.each { |e| return false unless include?(e) } ; return true
  264.   end unless method_defined? :all_match?
  265.  
  266.   #--------------------------------------------------------------------------#
  267.   # * new method :count_match
  268.   #--------------------------------------------------------------------------#
  269.   def count_match( match_array )
  270.     return match_array.inject(0) { |result, e| result + 1 if include?(e) ; result }
  271.   end unless method_defined? :count_match
  272.  
  273.   #--------------------------------------------------------------------------#
  274.   # * new method :return_if
  275.   #--------------------------------------------------------------------------#
  276.   def return_if()
  277.     each { |e| return e if yield e } ; return nil
  278.   end unless method_defined? :return_if
  279.  
  280.   #--------------------------------------------------------------------------#
  281.   # * new method :filter
  282.   #--------------------------------------------------------------------------#
  283.   def filter()
  284.     return inject([]) { |result, e| result << e if yield e ; result }
  285.   end unless method_defined? :filter
  286.  
  287.   #--------------------------------------------------------------------------#
  288.   # * new method :filter!
  289.   #--------------------------------------------------------------------------#
  290.   def filter!( &block )
  291.     result = filter( &block ) ; self.clear ; self.concat result
  292.   end unless method_defined? :filter!
  293.  
  294.   #--------------------------------------------------------------------------#
  295.   # * new method :build_from
  296.   #--------------------------------------------------------------------------#
  297.   def build_from()
  298.     return inject([]) { |result, element| result.push(yield element) }
  299.   end unless method_defined? :build_from
  300.  
  301.   #--------------------------------------------------------------------------#
  302.   # * new method :build_from!
  303.   #--------------------------------------------------------------------------#
  304.   def build_from!( &block )
  305.     bi = build_from( &block ) ; self.clear() ; self.concat(bi)
  306.   end unless method_defined? :build_from!
  307.  
  308.   #--------------------------------------------------------------------------#
  309.   # * new method :count
  310.   #--------------------------------------------------------------------------#  
  311.   def count()
  312.     return inject(0) { |result, element| result + 1 if yield e ; result }
  313.   end unless method_defined? :count
  314.  
  315.   #--------------------------------------------------------------------------#
  316.   # * new method :get_nth
  317.   #--------------------------------------------------------------------------#  
  318.   def get_nth( n )
  319.     inject(0) { |c, e| c + 1 if yield e ; return e if c == n ; c } ; return nil
  320.   end unless method_defined? :get_nth
  321.  
  322.   #--------------------------------------------------------------------------#
  323.   # * new method :get_nth_index
  324.   #--------------------------------------------------------------------------#  
  325.   def get_nth_index( n )
  326.     c = 0
  327.     for i in 0...size
  328.       e = self[i]
  329.       c += 1 if yield e ; return i if c == n
  330.     end
  331.     return nil
  332.   end unless method_defined? :get_nth_index
  333.  
  334.   #--------------------------------------------------------------------------#
  335.   # * new method :add_all
  336.   #--------------------------------------------------------------------------#  
  337.   def add_all()  
  338.     return inject(0) { |result, e| result + e }
  339.   end unless method_defined? :add_all
  340.  
  341.   #--------------------------------------------------------------------------#
  342.   # * new method :average
  343.   #--------------------------------------------------------------------------#  
  344.   def average()
  345.     if block_given?()
  346.       return (self.inject(0) { |result, e| result + (yield e) }) / [size, 1].max
  347.     else  
  348.       return add_all() / [size, 1].max
  349.     end  
  350.   end unless method_defined? :average
  351.  
  352.   #--------------------------------------------------------------------------#
  353.   # * new method :sync_sort
  354.   #--------------------------------------------------------------------------#  
  355.   def sync_sort( sync_array )
  356.     old_array = clone
  357.     return self.sort.inject([]) { |r, e| r << sync_array[old_array.index(e)] }
  358.   end unless method_defined? :sync_sort
  359.  
  360.   #--------------------------------------------------------------------------#
  361.   # * new method :sync_sort!
  362.   #--------------------------------------------------------------------------#  
  363.   def sync_sort!( sync_array )
  364.     old_array = clone ; self.sort!
  365.     res = inject([]) { |r, e| r << sync_array[old_array.index(e)] }
  366.     sync_array.clear() ; sync_array.concat( res )
  367.   end unless method_defined? :sync_sort!
  368.  
  369. end  
  370.  
  371. #=*==========================================================================*=#
  372. # ** END OF FILE
  373. #=*==========================================================================*=#
  374.  
Advertisement
Add Comment
Please, Sign In to add comment