-
Notifications
You must be signed in to change notification settings - Fork 2
/
days_from.rb
49 lines (37 loc) · 1.03 KB
/
days_from.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# frozen_string_literal: true
module Clavius
module Calculation
class DaysFrom
def initialize(schedule, number)
@schedule = schedule
@number = Integer(number)
fail ArgumentError, 'negative number' if @number.negative?
end
def before(origin)
calculated_day(:before, origin)
end
def after(origin)
calculated_day(:after, origin)
end
private
attr_reader :schedule,
:number
def calculated_day(direction, origin)
return zeroeth_day(direction, origin) if number.zero?
schedule.public_send(direction, origin).take(number).to_a.last
end
def zeroeth_day(direction, origin)
self
.class
.new(schedule, 1)
.public_send(direction, zeroeth_origin(direction, origin))
end
def zeroeth_origin(direction, origin)
case direction
when :before then origin.next_day
when :after then origin.prev_day
end
end
end
end
end