Class: When::Coordinates::Residue
- Inherits:
-
BasicTypes::Object
- Object
- BasicTypes::Object
- When::Coordinates::Residue
- Defined in:
- lib/when_exe/coordinates.rb,
lib/when_exe/inspect.rb
Overview
剰余類
Direct Known Subclasses
Branch, Kyusei, Stem, StemBranch, Wuku
Defined Under Namespace
Classes: BestRationalApproximations, Enumerator
Constant Summary collapse
- LabelProperty =
'label'
- HashProperty =
[:label, :remainder, :divisor]
Constants included from Parts::Resource
Parts::Resource::ConstList, Parts::Resource::ConstTypes, Parts::Resource::IRIDecode, Parts::Resource::IRIDecodeTable, Parts::Resource::IRIEncode, Parts::Resource::IRIEncodeTable, Parts::Resource::IRIHeader
Constants included from Namespace
Namespace::DC, Namespace::DCQ, Namespace::DCT, Namespace::FOAF, Namespace::OWL, Namespace::RDF, Namespace::RDFC, Namespace::RDFS, Namespace::RSS, Namespace::XSD
Instance Attribute Summary collapse
-
#carry ⇒ Integer
readonly
繰り上がり.
-
#divisor ⇒ Integer
readonly
法.
-
#remainder ⇒ Numeric
readonly
剰余.
-
#shifted ⇒ Boolean
readonly
周期分の補正の有無.
-
#units ⇒ Hash
readonly
単位.
Attributes inherited from BasicTypes::Object
Attributes included from Parts::Resource
#_pool, #child, #keys, #locale, #namespace
Class Method Summary collapse
-
._china(a, b) ⇒ Array<Numeric>
中国剰余.
- ._day_of_week(day, dow) ⇒ Object
-
.day_of_week(day) ⇒ When::Coordinates::Residue
(also: to_residue)
曜日(剰余類).
-
.mod(nn, &dd) ⇒ Array<Numeric>
汎用の mod.
Instance Method Summary collapse
-
#%(other) ⇒ 'other' と同じクラス
剰余.
-
#&(other) ⇒ When::Coordinates::Residue
剰余類の共通集合.
-
#+(other) ⇒ When::Coordinates::Residue
remainderの加算.
-
#-(other) ⇒ When::Coordinates::Residue
remainderの減算.
-
#<<(other) ⇒ When::Coordinates::Residue
carryの減算.
-
#>>(other) ⇒ When::Coordinates::Residue
carryの加算.
-
#[](remainder) ⇒ When::Coordinates::Residue
remainder の指定.
-
#_column_for_week_included(base, range, opt, &block) ⇒ Array<Object>
week_included のためのコラムの生成.
-
#_enumerator(*args) ⇒ When::Coordinates::Residue::BestRationalApproximations, When::Coordinates::Residue::Enumerator
(also: #to_enum, #enum_for)
Enumerator の生成.
-
#_range_for_week_included(date, first, length, block_given = false) ⇒ Array<Range>
week_included のための range の決定.
-
#difference ⇒ Integer
派生オブジェクトと元オブジェクトの remainder の差 (派生オブジェクトとは、元オブジェクトに[]演算を施して @remainder を変えたオブジェクト).
-
#duration(event = self.event) ⇒ When::TM::PeriodDuration
典型的なイベントの発生間隔.
-
#event ⇒ String
オブジェクトの単位.
-
#initialize(remainder, divisor, carry = 0, label = nil, format = nil, units = {}) ⇒ Residue
constructor
オブジェクトの生成.
-
#to(arg) ⇒ When::Coordinates::Residue
(also: #/)
units の指定.
-
#to_m17n ⇒ When::BasicTypes::M17n
多言語対応文字列化.
-
#to_s ⇒ String
文字列化.
Methods included from Parts::Resource
#^, _abbreviation_to_iri, _decode, _encode, _extract_prefix, _instance, _instantiate, _parse, _path_with_prefix, _replace_tags, _setup_, _setup_info, _simplify_path, base_uri, #each, #hierarchy, #include?, #included?, #iri, #leaf?, #m17n, #map, #parent, #registered?, root_dir
Methods included from Parts::Resource::Pool
#[]=, #_pool, #_setup_, #pool_keys
Methods included from Parts::Resource::Synchronize
Constructor Details
#initialize(remainder, divisor, carry = 0, label = nil, format = nil, units = {}) ⇒ Residue
オブジェクトの生成
472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 |
# File 'lib/when_exe/coordinates.rb', line 472 def initialize(*args) # units の取得 =(args).dup units = {} list = [] .each_pair do |key, value| if (PRECISION[key.upcase]) list << key units[key.downcase] = _to_num(value) end end list.each do |key| .delete(key) end ['units'] ||= {} ['units'].update(units) _set_variables() @units ||= {} # その他の変数 remainder, divisor, carry, label, format = args @label = label || @label @label = m17n(@label, nil, nil, ) if (@label) @format = format || @format @format = m17n(@format, nil, nil, ) if (@format) _sequence @remainder = _to_num(remainder || @remainder) @divisor = _to_num(divisor || @divisor ) @carry = _to_num(carry || @carry ) raise RangeError, "Divisor shoud be Positive Numeric" if (@divisor <= 0) carry, @remainder = @remainder.divmod(@divisor) @carry += carry @shifted = @carry != 0 end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &block) ⇒ Object (private)
その他のメソッド
When::Coordinate::Residue で定義されていないメソッドは
指定の桁での剰余算とみなす
516 517 518 519 520 521 522 523 524 525 |
# File 'lib/when_exe/coordinates.rb', line 516 def method_missing(name, *args, &block) return _method_missing(name, *args, &block) if When::Parts::MethodCash::Escape.key?(name) || !@units.key?(name.to_s.downcase) instance_eval %Q{ def #{name}(*args, &block) self[args[0] % self.to("#{name.to_s.downcase}")] end } unless When::Parts::MethodCash.escape(name) self[args[0] % self.to(name.to_s.downcase)] end |
Instance Attribute Details
#carry ⇒ Integer
繰り上がり
240 241 242 |
# File 'lib/when_exe/coordinates.rb', line 240 def carry @carry end |
#divisor ⇒ Integer (readonly)
法
234 235 236 |
# File 'lib/when_exe/coordinates.rb', line 234 def divisor @divisor end |
#remainder ⇒ Numeric
剰余
227 228 229 |
# File 'lib/when_exe/coordinates.rb', line 227 def remainder @remainder end |
#shifted ⇒ Boolean
周期分の補正の有無
247 248 249 |
# File 'lib/when_exe/coordinates.rb', line 247 def shifted @shifted end |
#units ⇒ Hash (readonly)
単位
260 261 262 |
# File 'lib/when_exe/coordinates.rb', line 260 def units @units end |
Class Method Details
._china(a, b) ⇒ Array<Numeric>
中国剰余
189 190 191 192 193 194 195 196 197 198 199 |
# File 'lib/when_exe/coordinates.rb', line 189 def _china(a, b) b, a = a, b if (a[1] <= b[1]) g, p, q = _gcd(a[1], b[1]) return [((b[0]*a[1]*q-a[0]*b[1]*p)*(a[1]*q-b[1]*p)) % (a[1]*b[1]), a[1]*b[1]] if (g == 1) r = a[0] % g s = b[0] % g return nil unless (r == s) m = _china([(a[0]-r).div(g), a[1].div(g)], [(b[0]-s).div(g), b[1].div(g)]) return nil unless (m) return [m[0]*g+r, m[1]*g] end |
._day_of_week(day, dow) ⇒ Object
139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
# File 'lib/when_exe/coordinates.rb', line 139 def _day_of_week(day, dow) match = day[/\A...|^.{1,2}\z/] if match dow.size.times do |i| return dow[i] if dow[i].label.=~(/\A#{match}/i) end end ObjectSpace.each_object(self) do |object| return object if object.registered? && object.label.=~(/\A#{day}\z/) end return nil end |
.day_of_week(day) ⇒ When::Coordinates::Residue Also known as: to_residue
曜日(剰余類)
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
# File 'lib/when_exe/coordinates.rb', line 112 def day_of_week(day) return day if day.kind_of?(self) day ||= 0 week = When.Resource('_co:Common::Week') dow = week.child case day when Numeric ; return dow[day] when /\AWeek\z/ ; return week when String ; day = When::EncodingConversion.to_internal_encoding(day) else ; return nil end day, shift = day =~ /\A([-+\d]+)(.+)/ ? [$2, $1] : day.split(':', 2) residue = day.split('&').inject(nil) {|res,d| r = _day_of_week(d.strip, dow) return nil unless r res ? res & r : r } return residue unless shift shift << '1' unless shift =~ /\d/ shift = shift.to_i shift -= 1 if shift > 0 residue >> shift end |
.mod(nn, &dd) ⇒ Array<Numeric>
汎用の mod
170 171 172 173 174 175 176 177 178 179 180 |
# File 'lib/when_exe/coordinates.rb', line 170 def mod(nn, &dd) u = dd.call(0) y = ((nn-u)*256).divmod(dd.call(256)-u)[0] - 1 w1, w2 = dd.call(y), dd.call(y+1) until w1 <= nn && nn < w2 if w2 <= nn then y, w1, w2 = y+1, w2, dd.call(y+2) else y, w1, w2 = y-1, dd.call(y-1), w1 end end return y, nn-w1, w2-w1 end |
Instance Method Details
#%(other) ⇒ 'other' と同じクラス
剰余
420 421 422 423 424 425 426 427 428 429 430 431 432 433 |
# File 'lib/when_exe/coordinates.rb', line 420 def %(other) case other when Pair return Pair.new(self % other.trunk, other.branch) when Numeric keys = @units.keys d = (keys.size == 1) ? @units[keys[0]] : (@units['day']||0) return (other-d) % @divisor else position = When::TM::Position.any_other(other) raise TypeError, "Can't convert #{other.class} to When::TM::TemporalPosition" unless position return self[position % self] end end |
#&(other) ⇒ When::Coordinates::Residue
剰余類の共通集合
381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 |
# File 'lib/when_exe/coordinates.rb', line 381 def &(other) case other when Residue if self.units == other.units m = self.class._china([@remainder, @divisor], [other.remainder, other.divisor]) u = units.dup else keys = units.keys & other.units.keys keys = ['day'] if keys == [] return nil unless (keys.size==1) self_base = self.units[keys[0]] || 0 other_base = other.units[keys[0]] || 0 m = self.class._china([@remainder, @divisor], [(other.remainder+other_base-self_base) % other.divisor, other.divisor]) u = {keys[0]=>self_base} end return nil unless (m) return self.class.new(m[0], m[1], @carry, u) when Pair return Pair.new(self & other.trunk, other.branch) when Numeric keys = @units.keys d = (keys.size == 1) ? @units[keys[0]] : (@units['day']||0) c, m = (other-d).divmod(@divisor) c += 1 if (m > @remainder) return (c + @carry) * @divisor + @remainder + d else position = When::TM::Position.any_other(other) raise TypeError, "Can't convert #{other.class} to When::TM::TemporalPosition" unless position return position & self end end |
#+(other) ⇒ When::Coordinates::Residue
remainderの加算
other : Numeric
335 336 337 338 |
# File 'lib/when_exe/coordinates.rb', line 335 def +(other) carry, remainder = (@remainder + other).divmod(@divisor) return self.class.new(remainder, @divisor, @carry+carry, @units) end |
#-(other) ⇒ When::Coordinates::Residue
remainderの減算
346 347 348 349 |
# File 'lib/when_exe/coordinates.rb', line 346 def -(other) carry, remainder = (@remainder - other).divmod(@divisor) return self.class.new(remainder, @divisor, @carry+carry, @units) end |
#<<(other) ⇒ When::Coordinates::Residue
carryの減算
369 370 371 372 373 |
# File 'lib/when_exe/coordinates.rb', line 369 def <<(other) result = self.class.new(@remainder, @divisor, @carry-other, @units) result.shifted = true result end |
#>>(other) ⇒ When::Coordinates::Residue
carryの加算
357 358 359 360 361 |
# File 'lib/when_exe/coordinates.rb', line 357 def >>(other) result = self.class.new(@remainder, @divisor, @carry+other, @units) result.shifted = true result end |
#[](remainder) ⇒ When::Coordinates::Residue
remainder の指定
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 |
# File 'lib/when_exe/coordinates.rb', line 290 def [](remainder) return super if !remainder.kind_of?(Numeric) || (child && child.length == @divisor) return self if remainder == 0 && !child remainder *= 1 return self.class.new(@remainder+remainder, @divisor, @carry, @label, @format, @units) unless (child && child.length > 0) carry, remainder = (@remainder+remainder).divmod(@divisor) base = child.reverse.each do |residue| break residue if residue.remainder <= remainder end raise ArgumentError, "remainder out of range: #{remainder}" unless base.kind_of?(self.class) base = base.dup base.remainder = remainder base.carry += carry return base end |
#_column_for_week_included(base, range, opt, &block) ⇒ Array<Object>
week_included のためのコラムの生成
231 232 233 234 235 |
# File 'lib/when_exe/inspect.rb', line 231 def _column_for_week_included(base, range, opt, &block) range.inject([]) {|s,r| s + r.map { |date| yield(date, !opt.key?(:Range) || opt[:Range].include?(date.to_i) ? DAY : nil) }} end |
#initialize ⇒ When::Coordinates::Residue::BestRationalApproximations, When::Coordinates::Residue::Enumerator #initialize(range, count_limit = nil) ⇒ When::Coordinates::Residue::BestRationalApproximations, When::Coordinates::Residue::Enumerator #initialize(first, direction, count_limit) ⇒ When::Coordinates::Residue::BestRationalApproximations, When::Coordinates::Residue::Enumerator Also known as: to_enum, enum_for
Enumerator の生成
451 452 453 454 455 456 |
# File 'lib/when_exe/coordinates.rb', line 451 def _enumerator(*args) length = args.length length -= 1 if args[-1].kind_of?(Hash) args.unshift(self) (length==0) ? BestRationalApproximations.new(self, *args) : Enumerator.new(*args) end |
#_range_for_week_included(date, first, length, block_given = false) ⇒ Array<Range>
week_included のための range の決定
214 215 216 217 218 219 220 221 222 223 |
# File 'lib/when_exe/inspect.rb', line 214 def _range_for_week_included(date, first, length, block_given=false) today = date.floor begun = today.succ & self >> first-1 unless date.frame.equal?(begun.frame) begun = (date.frame ^ today).succ & self >> first-1 middle = today end ended = begun.succ & self >> length-1 middle && block_given ? [begun...middle, middle...ended] : [begun...ended] end |
#difference ⇒ Integer
派生オブジェクトと元オブジェクトの remainder の差 (派生オブジェクトとは、元オブジェクトに[]演算を施して @remainder を変えたオブジェクト)
325 326 327 |
# File 'lib/when_exe/coordinates.rb', line 325 def difference @difference ||= (registered? || iri !~ /:/) ? @remainder : @remainder - When.Resource(iri).remainder end |
#duration(event = self.event) ⇒ When::TM::PeriodDuration
典型的なイベントの発生間隔
312 313 314 |
# File 'lib/when_exe/coordinates.rb', line 312 def duration(event=self.event) When::TM::PeriodDuration.new(@divisor, When::Coordinates::PRECISION[event.upcase]) end |
#event ⇒ String
オブジェクトの単位
278 279 280 281 |
# File 'lib/when_exe/coordinates.rb', line 278 def event keys = @units.keys return (keys.size == 1) ? keys[0] : 'day' end |
#to(arg) ⇒ When::Coordinates::Residue Also known as: /
units の指定
268 269 270 271 |
# File 'lib/when_exe/coordinates.rb', line 268 def to(arg) return nil unless @units[arg] self.class.new(@remainder, @divisor, @carry, {arg=>@units[arg]}) end |
#to_m17n ⇒ When::BasicTypes::M17n
多言語対応文字列化
192 193 194 195 196 |
# File 'lib/when_exe/inspect.rb', line 192 def to_m17n return m17n(@remainder.to_s) unless label return label + "(#{difference})" unless @format (label[0...0] + @format) % [label, difference, difference+1] end |
#to_s ⇒ String
文字列化
202 203 204 205 206 |
# File 'lib/when_exe/inspect.rb', line 202 def to_s return @remainder.to_s unless label return label.to_s + "(#{difference})" unless @format @format.to_s % [label.to_s, difference, difference+1] end |