made it work, more or less, with ruby 1.9
[nyuron.git] / classes / extensions / numeric.rb
blobbe2bc334cca23eea5a920cc363a085f1f489e6b7
1 class Numeric
2         def between?(a, b)
3                 self >= a and self <= b
4         end
6         def ord
7                 self
8         end
10         def suffix
11                 case self % 10
12                 when 1; 'st'
13                 when 2; 'nd'
14                 when 3; 'rd'
15                 else 'th' end
16         end
18         ## TODO: i think it doesn't quite work with negative numbers
20         ## keeps a number inside a defined range and wraps it around
21         ## if it steps over the borders. accepts 1-2 integers or a range.
22         ##  for n in 0..8
23         ##    print n.wrap(4), ', '
24         ##  end
25         ##  # returns:
26         ##  0, 1, 2, 3, 0, 1, 2, 3, 0, 
27         def wrap(max, min = 0)
28                 ## if the argument is a range, use it :)
29                 if max.is_a? Range
30                         min = max.min
31                         max = max.max
32                 end
34                 ## swap min and max if min is larger than max
35                 if min > max
36                         min, max = max, min
37                 end
39                 ## if min is 0, this is the equivalent of a modulo.
40                 ## note that ruby's modulo wraps on negative
41                 ## numbers :) so there's nothing else to do.
42                 if min == 0
43                         return self % max
44                 end
45                 
46                 ## otherwise, substract min before, and add min after
47                 ## the modulo operation to get the correct result.
48                 return (self - min) % max + min
49         end
51         ## Units
52         def second()          1 * self end
53         def minute()         60 * self end
54         def   hour()       3600 * self end
55         def    day()      86400 * self end
56         def   week()     604800 * self end
57         def  month()    2629800 * self end
58         def   year()   31557600 * self end
60         alias   seconds   second
61         alias   minutes   minute
62         alias     hours     hour
63         alias      days      day
64         alias     weeks     week
65         alias    months    month
66         alias     years     year
67 end
69 ### generate the unit methods {{{
70 #values = {
71 #  'second' => 1,
72 #       'minute' => 60,
73 #       'hour' => 3600,
74 #       'day' => 3600 * 24,
75 #       'week' => 3600 * 24 * 7,
76 #       'month' => 3600 * 24 * 30.4375,
77 #       'year' => 3600 * 24 * 365.25,
79 #values.each do |key, val|
80 #       puts "  def %6s() %10d * self end" % [key, val, key, key]
81 #end
82 #values.each do |key, val|
83 #       puts "  alias %8ss %8s" % [key, key]
84 #end
85 ### }}}