module Zakuro::Calculation::Range::Transfer::YearBoundary

YearBoundary 年境界

Public Class Methods

get(context:, annual_ranges:) click to toggle source

年間範囲内の年データの開始月を変更する

@param [Context] context 暦コンテキスト @param [Array<Year>] annual_ranges 年データ(冬至基準)

@return [Array<Year>] 年データ(元旦基準)

# File lib/zakuro/calculation/range/transfer/year_boundary.rb, line 28
def self.get(context:, annual_ranges:)
  categorize(context: context, annual_ranges: annual_ranges)
  rearranged_years(annual_ranges: annual_ranges)
end

Private Class Methods

categorize(context:, annual_ranges:) click to toggle source

年間範囲を昨年/今年で分類する

@param [Context] context 暦コンテキスト @param [Array<Year>] annual_range 1年データ

# File lib/zakuro/calculation/range/transfer/year_boundary.rb, line 58
def self.categorize(context:, annual_ranges:)
  annual_ranges.each do |annual_range|
    categorize_year(context: context, annual_range: annual_range)
  end
end
categorize_year(context:, annual_range:) click to toggle source

各月を昨年/今年で分類する

@param [Context] context 暦コンテキスト @param [Array<Month>] annual_range 1年データ

# File lib/zakuro/calculation/range/transfer/year_boundary.rb, line 71
def self.categorize_year(context:, annual_range:)
  is_last_year = true
  annual_range.each_with_index do |month, index|
    is_last_year = false if month.number == 1

    annual_range[index] = Monthly::InitializedMonth.new(
      context: context,
      month_label: month.month_label, first_day: month.first_day,
      solar_terms: month.solar_terms, phase_index: month.phase_index,
      is_last_year: is_last_year
    )
  end
end
push_current_year(annual_range:, year: Base::Year.new) click to toggle source

当年データを生成する

@param [Array<Year>] annual_ranges 年データ(冬至基準) @param [Year] year 対象年

@return [Year] 当年月ありの対象年

# File lib/zakuro/calculation/range/transfer/year_boundary.rb, line 113
def self.push_current_year(annual_range:, year: Base::Year.new)
  annual_range.each do |month|
    next if month.is_last_year

    year.push(month: month)
  end

  year
end
push_last_year(annual_range:, year: Base::Year.new) click to toggle source

昨年データを生成する

@param [Array<Year>] annual_ranges 年データ(冬至基準) @param [Year] year 対象年

@return [Year] 昨年月ありの対象年

# File lib/zakuro/calculation/range/transfer/year_boundary.rb, line 132
def self.push_last_year(annual_range:, year: Base::Year.new)
  annual_range.each do |month|
    next unless month.is_last_year

    year.push(month: month)
  end

  year
end
rearranged_year(annual_ranges:, index:) click to toggle source

年データの開始月を変更する

@param [Array<Year>] annual_ranges 年データ(冬至基準) @param [Integer] index 対象年の要素番号

@return [Year] 年データ(元旦基準)

# File lib/zakuro/calculation/range/transfer/year_boundary.rb, line 94
def self.rearranged_year(annual_ranges:, index:)
  current_annual_range = annual_ranges[index]
  next_annual_range = annual_ranges[index + 1]

  year = push_current_year(annual_range: current_annual_range)
  push_last_year(annual_range: next_annual_range, year: year)

  year
end
rearranged_years(annual_ranges:) click to toggle source

年間範囲内の年データの開始月を変更する

@param [Array<Year>] annual_ranges 年データ(冬至基準)

@return [Array<Year>] 年データ(元旦基準)

# File lib/zakuro/calculation/range/transfer/year_boundary.rb, line 40
def self.rearranged_years(annual_ranges:)
  years = []

  (0..(annual_ranges.size - 2)).each do |index|
    year = rearranged_year(annual_ranges: annual_ranges, index: index)
    years.push(year)
  end

  years
end