mirror of
https://github.com/jimeh/time_ext.git
synced 2026-02-19 13:26:39 +00:00
Added #of_the / #of range modifier which is used
like #until and #from. Except #of_the makes the
iteration walk through each unit of time passed to
the #each / #map method, from the beginning till
end of unit passed to #of_the.
Example:
Time.now.each_hour.of_the(:month) { |t puts t }
#=> iterates over each over of the whole current month
This commit is contained in:
@@ -8,12 +8,19 @@ module TimeExt
|
||||
if block_given?
|
||||
units = [:year, :month, :day, :hour, :min, :sec, :usec]
|
||||
parent_unit = units[units.index(unit)-1]
|
||||
@until ||= (!parent_unit.nil?) ? self.send("#{parent_unit}s_since", 1) : self.send("#{unit}s_since", 1)
|
||||
time = self.clone
|
||||
if @of_the.nil?
|
||||
time = self.clone
|
||||
@until ||= (!parent_unit.nil?) ? self.send("#{parent_unit}s_since", 1) : self.send("#{unit}s_since", 1)
|
||||
else
|
||||
time = self.beginning_of(@of_the)
|
||||
@until = self.end_of(@of_the)
|
||||
options.merge!(:beginning_of => true, :include_start => true)
|
||||
end
|
||||
direction = (self < @until) ? :f : :b
|
||||
succ_method = (direction == :f) ? "next_#{unit}" : "prev_#{unit}"
|
||||
time = time.beginning_of(unit) if options[:beginning_of]
|
||||
time = time.send(succ_method) if !options[:include_start]
|
||||
@until = @until.prev(unit).end_of(unit) if options[:include_start] && @of_the.nil?
|
||||
results = []
|
||||
while (direction == :f && time <= @until) || (direction == :b && time >= @until)
|
||||
options[:map_result] ? results << yield(time) : yield(time)
|
||||
@@ -46,6 +53,14 @@ module TimeExt
|
||||
end
|
||||
end
|
||||
|
||||
# Let's you iterate over every unit specified in the #each or #map call for the specified unit.
|
||||
def of_the(unit, &block)
|
||||
@of_the = unit
|
||||
return call_chain(block) if block_given?
|
||||
self
|
||||
end
|
||||
alias :of :of_the
|
||||
|
||||
# Executes passed block for each "unit" of time specified, with a new time object for each interval passed to the block.
|
||||
def each(unit, options = {}, &block)
|
||||
iterate(unit, options.merge(:map_result => false), &block)
|
||||
@@ -76,6 +91,13 @@ module TimeExt
|
||||
class_eval { alias :"#{method}_minute" :"#{method}_min" } if unit == :min
|
||||
class_eval { alias :"#{method}_second" :"#{method}_sec" } if unit == :sec
|
||||
end
|
||||
[:of_the, :of].each do |method|
|
||||
define_method "#{method}_#{unit}" do |*args, &block|
|
||||
send(method, unit, *args, &block)
|
||||
end
|
||||
class_eval { alias :"#{method}_minute" :"#{method}_min" } if unit == :min
|
||||
class_eval { alias :"#{method}_second" :"#{method}_sec" } if unit == :sec
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user