Module: When::Coordinates::Temporal

Includes:
Spatial::Normalize, Parts::MethodCash
Defined in:
lib/when_exe/coordinates.rb

Overview

暦座標を扱う処理をまとめたモジュール

When::TM::Calendar と When::TM::Clock に共通する処理だが、ISO 19108 で両者の
直接の superclass である、When::TM::ReferenceSystem は、これらの処理を持たない
こととなっているため、When::TM::Calendar と When::TM::Clock の共通部分を
モジュールとしてまとめた。

Defined Under Namespace

Modules: IndexConversion, OriginAndUpperDigits, OriginOnly

Constant Summary collapse

HashProperty =
[[:origin_of_MSC, 0], [:origin_of_LSC, 0], [:index_of_MSC, 0], [:_diff_to_CE, 0], 
:unit, :base, :pair, :note,
:location, :timezone, :border, :formula]

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Parts::MethodCash

#method_missing_

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object (private)

その他のメソッド

When::Coordinates::Temporal で定義されていないメソッドは
処理を @note or @formula[0] (When::Ephemeris::Formula) に委譲する


1864
1865
1866
1867
1868
1869
# File 'lib/when_exe/coordinates.rb', line 1864

def method_missing(name, *args, &block)
  return @note.send(name.to_sym, *(args + [self]), &block) if note.respond_to?(name)
  forward = forwarded_formula(name, args[0]) if self.respond_to?(:forwarded_formula, true)
  return forward.send(name.to_sym, *args, &block) if forward
  _method_missing(name, *args, &block)
end

Instance Attribute Details

#baseArray<Integer, nil> (readonly)

日時要素の下限

Returns:

  • (Array<Integer, nil>)

    Ex. [nil, 1, 1], [nil, 0, 0, 0]

    初期化時に indices から自動生成する



1490
1491
1492
# File 'lib/when_exe/coordinates.rb', line 1490

def base
  @base
end

#index_of_MSCInteger (readonly)

年/日のインデクス(index of most significant coordinate)

Returns:

  • (Integer)


1470
1471
1472
# File 'lib/when_exe/coordinates.rb', line 1470

def index_of_MSC
  @index_of_MSC
end

#indicesArray<When::Coordinates::Index> (readonly)

インデクスオブジェクト



1464
1465
1466
# File 'lib/when_exe/coordinates.rb', line 1464

def indices
  @indices
end

#origin_of_LSCInteger (readonly)

日/秒の原点(origin of least significant coordinate)

Returns:

  • (Integer)


1458
1459
1460
# File 'lib/when_exe/coordinates.rb', line 1458

def origin_of_LSC
  @origin_of_LSC
end

#origin_of_MSCInteger (readonly)

年/日の原点(origin of most significant coordinate)

Returns:

  • (Integer)


1452
1453
1454
# File 'lib/when_exe/coordinates.rb', line 1452

def origin_of_MSC
  @origin_of_MSC
end

#pairArray<Boolean> (readonly)

日時要素がPairであるべきか

Returns:

  • (Array<Boolean>)

    Ex. [false] * 3, [false] * 4

    初期化時に indices から自動生成する



1500
1501
1502
# File 'lib/when_exe/coordinates.rb', line 1500

def pair
  @pair
end

#unitArray<Integer, nil> (readonly)

日時要素の要素数

Returns:

  • (Array<Integer, nil>)

    Ex. [nil, 12], [nil, 24, 60, 60]

    初期化時に indices から自動生成する



1480
1481
1482
# File 'lib/when_exe/coordinates.rb', line 1480

def unit
  @unit
end

Instance Method Details

#_arrange_length(period) ⇒ Array<Numeric>

期間指定用 Array の桁数合わせ

Parameters:

Returns:



1546
1547
1548
1549
1550
1551
# File 'lib/when_exe/coordinates.rb', line 1546

def _arrange_length(period)
  return period unless period.kind_of?(Array)
  diff = @indices.length - period.length + 1
  return period if (diff == 0)
  return (diff > 0) ? Array.new(diff, 0) + period : period[(-diff)..-1]
end

#_diff_to_CEInteger

西暦との差

Returns:

  • (Integer)

    暦法の年の桁と西暦とのずれ



1557
1558
1559
# File 'lib/when_exe/coordinates.rb', line 1557

def _diff_to_CE
  @_diff_to_CE ||= @epoch_in_CE ? @epoch_in_CE - @origin_of_MSC : 0
end

#_encode(source, border = @border) ⇒ Array<Numeric>

日時要素の encode

Parameters:

  • source (Array<Numeric>)

    日時要素の内部表現に対応する Array

Returns:

  • (Array<Numeric>)

    日時要素の外部表現に対応する Array



1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
# File 'lib/when_exe/coordinates.rb', line 1570

def _encode(source, border=@border)
  # source は非破壊
  date = source.dup

  # 外部表現に戻す
  date[0] = +date[0]
  (@base.length-1).downto(@unit.length-1) do |i|
    date[i] = _from_index(date[0..i]) || date[i] + (@base[i]||0)
  end
  date[0] = source[0]

  # 結果を反映
  date = border._adjust_epoch(date, self) if border
  _encode_upper_structure(date)
end

#_validate(source, other = nil, &block) ⇒ Array<Numeric>

Note:

日付要素と時刻要素に関連がある場合、block を指定して、両者の 情報をやり取りする( yield で通日を渡し、通日を返してもらう)。

例1: 夏時間制を採用している場合、日付によって時刻の正規化の仕方が影響を受ける

例2: 日の境界が日没の場合、当該時刻が日没の前か後かで日付が変わる

日時要素の正規化

Parameters:

  • source (Array<Numeric>)

    正規化しようとしている日時要素の Array

  • other (Array<Numeric>) (defaults to: nil)

    日時要素ごとに加減算を行う場合、加減算量の Array を指定する

  • block (Block)

Returns:

  • (Array<Numeric>)

    正規化された日時要素の Array

    日時要素は、それぞれの When::TM::Calendar や When::TM::Clock の実装に応じて有効な値となっている。



1536
1537
1538
# File 'lib/when_exe/coordinates.rb', line 1536

def _validate(source, other=nil, &block)
  return _encode(_decode(source, other, &block))
end

#noteWhen::CalendarTypes::CalendarNote, Array<Array<klass, Array<klass, method, block>>>

代表暦注

Returns:

  • (When::CalendarTypes::CalendarNote)
  • (Array<Array<klass, Array<klass, method, block>>>)

    最外側のArray要素は年・月・日に対応

    klass [String, When::CalendarTypes::CalendarNote, When::Coordinates::Residue]

    method [String, Symbol] (デフォルト ‘day’, ‘month’ or ‘year’ (対応する桁による))

    block [Block] (デフォルト なし)



1513
1514
1515
1516
# File 'lib/when_exe/coordinates.rb', line 1513

def note
  @note = When.CalendarNote(@note) if @note.kind_of?(String)
  @note
end