when_exe 0.2.100 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. data/LICENSE.ja.txt +25 -25
  2. data/LICENSE.txt +31 -31
  3. data/bin/irb.rc +5 -0
  4. data/bin/locales.rb +2 -2
  5. data/bin/when.rb +16 -0
  6. data/bin/when.rb.config +7 -0
  7. data/lib/when_exe.rb +616 -14
  8. data/lib/when_exe/basictypes.rb +615 -0
  9. data/lib/when_exe/calendartypes.rb +1700 -0
  10. data/lib/when_exe/coordinates.rb +1936 -0
  11. data/lib/when_exe/core/compatibility.rb +54 -0
  12. data/lib/when_exe/core/duration.rb +72 -72
  13. data/lib/when_exe/core/extension.rb +382 -0
  14. data/lib/when_exe/ephemeris.rb +1845 -0
  15. data/lib/when_exe/googlecalendar.rb +140 -0
  16. data/lib/when_exe/icalendar.rb +1587 -0
  17. data/lib/when_exe/inspect.rb +1237 -0
  18. data/lib/when_exe/locales/af.rb +90 -0
  19. data/lib/when_exe/locales/ar.rb +145 -0
  20. data/lib/when_exe/locales/az.rb +90 -0
  21. data/lib/when_exe/locales/bg.rb +90 -0
  22. data/lib/when_exe/locales/bn.rb +94 -0
  23. data/lib/when_exe/locales/bs.rb +121 -0
  24. data/lib/when_exe/locales/ca.rb +92 -0
  25. data/lib/when_exe/locales/cs.rb +107 -0
  26. data/lib/when_exe/locales/cy.rb +150 -0
  27. data/lib/when_exe/locales/da.rb +84 -0
  28. data/lib/when_exe/locales/de.rb +92 -0
  29. data/lib/when_exe/locales/de_AT.rb +92 -0
  30. data/lib/when_exe/locales/de_CH.rb +92 -0
  31. data/lib/when_exe/locales/el.rb +93 -0
  32. data/lib/when_exe/locales/en.rb +88 -0
  33. data/lib/when_exe/locales/en_AU.rb +88 -0
  34. data/lib/when_exe/locales/en_CA.rb +88 -0
  35. data/lib/when_exe/locales/en_GB.rb +88 -0
  36. data/lib/when_exe/locales/en_IN.rb +88 -0
  37. data/lib/when_exe/locales/en_NZ.rb +88 -0
  38. data/lib/when_exe/locales/eo.rb +89 -0
  39. data/lib/when_exe/locales/es.rb +84 -0
  40. data/lib/when_exe/locales/es_419.rb +84 -0
  41. data/lib/when_exe/locales/es_AR.rb +84 -0
  42. data/lib/when_exe/locales/es_CL.rb +84 -0
  43. data/lib/when_exe/locales/es_CO.rb +84 -0
  44. data/lib/when_exe/locales/es_MX.rb +84 -0
  45. data/lib/when_exe/locales/es_PE.rb +85 -0
  46. data/lib/when_exe/locales/es_VE.rb +84 -0
  47. data/lib/when_exe/locales/et.rb +94 -0
  48. data/lib/when_exe/locales/eu.rb +95 -0
  49. data/lib/when_exe/locales/fa.rb +80 -0
  50. data/lib/when_exe/locales/fi.rb +89 -0
  51. data/lib/when_exe/locales/fr.rb +88 -0
  52. data/lib/when_exe/locales/fr_CA.rb +88 -0
  53. data/lib/when_exe/locales/fr_CH.rb +88 -0
  54. data/lib/when_exe/locales/gl.rb +81 -0
  55. data/lib/when_exe/locales/he.rb +84 -0
  56. data/lib/when_exe/locales/hi.rb +80 -0
  57. data/lib/when_exe/locales/hi_IN.rb +84 -0
  58. data/lib/when_exe/locales/hr.rb +128 -0
  59. data/lib/when_exe/locales/hu.rb +84 -0
  60. data/lib/when_exe/locales/id.rb +89 -0
  61. data/lib/when_exe/locales/is.rb +89 -0
  62. data/lib/when_exe/locales/it.rb +87 -0
  63. data/lib/when_exe/locales/it_CH.rb +87 -0
  64. data/lib/when_exe/locales/ja.rb +78 -0
  65. data/lib/when_exe/locales/kn.rb +86 -0
  66. data/lib/when_exe/locales/ko.rb +78 -0
  67. data/lib/when_exe/locales/links.rb +2342 -0
  68. data/lib/when_exe/locales/lo.rb +123 -0
  69. data/lib/when_exe/locales/locales.rb +91 -0
  70. data/lib/when_exe/locales/lt.rb +111 -0
  71. data/lib/when_exe/locales/lv.rb +118 -0
  72. data/lib/when_exe/locales/mk.rb +93 -0
  73. data/lib/when_exe/locales/mn.rb +80 -0
  74. data/lib/when_exe/locales/nb.rb +81 -0
  75. data/lib/when_exe/locales/ne.rb +81 -0
  76. data/lib/when_exe/locales/nl.rb +92 -0
  77. data/lib/when_exe/locales/nn.rb +73 -0
  78. data/lib/when_exe/locales/or.rb +84 -0
  79. data/lib/when_exe/locales/pl.rb +128 -0
  80. data/lib/when_exe/locales/pt.rb +88 -0
  81. data/lib/when_exe/locales/pt_BR.rb +88 -0
  82. data/lib/when_exe/locales/rm.rb +143 -0
  83. data/lib/when_exe/locales/ro.rb +105 -0
  84. data/lib/when_exe/locales/ru.rb +128 -0
  85. data/lib/when_exe/locales/sk.rb +109 -0
  86. data/lib/when_exe/locales/sl.rb +122 -0
  87. data/lib/when_exe/locales/sr.rb +122 -0
  88. data/lib/when_exe/locales/sv.rb +83 -0
  89. data/lib/when_exe/locales/sw.rb +89 -0
  90. data/lib/when_exe/locales/th.rb +78 -0
  91. data/lib/when_exe/locales/tl.rb +99 -0
  92. data/lib/when_exe/locales/tr.rb +96 -0
  93. data/lib/when_exe/locales/uk.rb +128 -0
  94. data/lib/when_exe/locales/uz.rb +128 -0
  95. data/lib/when_exe/locales/vi.rb +94 -0
  96. data/lib/when_exe/locales/wo.rb +82 -0
  97. data/lib/when_exe/locales/zh_CN.rb +77 -0
  98. data/lib/when_exe/locales/zh_HK.rb +77 -0
  99. data/lib/when_exe/locales/zh_TW.rb +77 -0
  100. data/lib/when_exe/mini_application.rb +252 -0
  101. data/lib/when_exe/parts/enumerator.rb +472 -0
  102. data/lib/when_exe/parts/geometric_complex.rb +379 -0
  103. data/lib/when_exe/parts/locale.rb +513 -0
  104. data/lib/when_exe/parts/method_cash.rb +207 -0
  105. data/lib/when_exe/parts/resource.rb +806 -0
  106. data/lib/when_exe/parts/timezone.rb +182 -0
  107. data/lib/when_exe/region/bahai.rb +145 -0
  108. data/lib/when_exe/region/balinese.rb +627 -0
  109. data/lib/when_exe/region/chinese.rb +896 -0
  110. data/lib/when_exe/region/chinese_calendar.rb +919 -0
  111. data/lib/when_exe/region/chinese_epoch.rb +1245 -0
  112. data/lib/when_exe/region/christian.rb +644 -0
  113. data/lib/when_exe/region/far_east.rb +192 -0
  114. data/lib/when_exe/region/french.rb +66 -0
  115. data/lib/when_exe/region/geologicalage.rb +639 -0
  116. data/lib/when_exe/region/indian.rb +1066 -0
  117. data/lib/when_exe/region/iranian.rb +66 -0
  118. data/lib/when_exe/region/islamic.rb +105 -0
  119. data/lib/when_exe/region/japanese.rb +851 -0
  120. data/lib/when_exe/region/japanese_notes.rb +964 -0
  121. data/lib/when_exe/region/japanese_residues.rb +1149 -0
  122. data/lib/when_exe/region/javanese.rb +228 -0
  123. data/lib/when_exe/region/jewish.rb +127 -0
  124. data/lib/when_exe/region/korean.rb +267 -0
  125. data/lib/when_exe/region/m17n.rb +115 -0
  126. data/lib/when_exe/region/martian.rb +215 -0
  127. data/lib/when_exe/region/mayan.rb +122 -0
  128. data/lib/when_exe/region/moon.rb +333 -0
  129. data/lib/when_exe/region/nihon_shoki.rb +73 -0
  130. data/lib/when_exe/region/planets.rb +585 -0
  131. data/lib/when_exe/region/pope.rb +298 -0
  132. data/lib/when_exe/region/residue.rb +229 -0
  133. data/lib/when_exe/region/roman.rb +325 -0
  134. data/lib/when_exe/region/ryukyu.rb +98 -0
  135. data/lib/when_exe/region/shire.rb +254 -0
  136. data/lib/when_exe/region/sun.rb +210 -0
  137. data/lib/when_exe/region/thai.rb +227 -0
  138. data/lib/when_exe/region/tibetan.rb +233 -0
  139. data/lib/when_exe/region/v50.rb +111 -0
  140. data/lib/when_exe/region/vietnamese.rb +173 -0
  141. data/lib/when_exe/region/world.rb +197 -0
  142. data/lib/when_exe/timestandard.rb +547 -0
  143. data/lib/when_exe/tmduration.rb +330 -330
  144. data/lib/when_exe/tmobjects.rb +1295 -0
  145. data/lib/when_exe/tmposition.rb +1955 -0
  146. data/lib/when_exe/tmreference.rb +1547 -0
  147. data/lib/when_exe/version.rb +10 -3
  148. data/link_to_online_documents +4 -0
  149. data/test/examples/JapanHolidays.ics +456 -0
  150. data/test/examples/Millennium.ics +17 -0
  151. data/test/examples/NewYork.ics +61 -0
  152. data/test/examples/Residue.m17n +135 -0
  153. data/test/examples/Spatial.m17n +179 -0
  154. data/test/examples/Terms.m17n +39 -0
  155. data/test/examples/Test.ics +53 -0
  156. data/test/examples/USA-DST.ics +61 -0
  157. data/test/examples/geometric_complex.rb +41 -0
  158. data/test/examples/sample.xml +14 -0
  159. data/test/examples/today.rb +61 -0
  160. data/test/test.rb +54 -19
  161. data/test/test.rb.config +1 -0
  162. data/test/test/basictypes.rb +368 -0
  163. data/test/test/calendartypes.rb +57 -0
  164. data/test/test/coordinates.rb +380 -0
  165. data/test/test/ephemeris.rb +127 -0
  166. data/test/test/googlecalendar.rb +167 -0
  167. data/test/test/icalendar.rb +848 -0
  168. data/test/test/inspect.rb +115 -0
  169. data/test/test/parts.rb +480 -0
  170. data/test/test/region/chinese.rb +161 -0
  171. data/test/test/region/french.rb +33 -0
  172. data/test/test/region/geologicalage.rb +14 -0
  173. data/test/test/region/indian.rb +55 -0
  174. data/test/test/region/iran.rb +54 -0
  175. data/test/test/region/islamic.rb +18 -0
  176. data/test/test/region/japanese.rb +62 -0
  177. data/test/test/region/jewish.rb +61 -0
  178. data/test/test/region/m17n.rb +181 -0
  179. data/test/test/region/mayan.rb +78 -0
  180. data/test/test/region/moon.rb +14 -0
  181. data/test/test/region/planets.rb +14 -0
  182. data/test/test/region/residue.rb +123 -0
  183. data/test/test/region/sun.rb +14 -0
  184. data/test/test/region/thai.rb +94 -0
  185. data/test/test/region/tibetan.rb +30 -0
  186. data/test/test/tmobjects.rb +356 -57
  187. data/test/test/tmposition.rb +237 -0
  188. data/test/test/tmreference.rb +95 -0
  189. data/when_exe.gemspec +2 -2
  190. metadata +187 -7
  191. data/doc/COPYING +0 -31
  192. data/doc/COPYING.ja +0 -25
  193. data/doc/document_url +0 -1
@@ -0,0 +1,472 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2011-2012 Takashi SUGA
4
+
5
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
+ =end
7
+
8
+ #
9
+ # 本ライブラリのための諸々の部品
10
+ #
11
+ module When::Parts
12
+
13
+ #
14
+ # v1.8.x のための互換性確保用
15
+ #
16
+ # @private
17
+ class Enumerator < ::Enumerator ; end if Object.const_defined?(:Enumerator)
18
+
19
+ #
20
+ # 本ライブラリ用の Enumerator の雛形
21
+ #
22
+ class Enumerator
23
+
24
+ # @private
25
+ def self._options(args)
26
+ options = args[-1].kind_of?(Hash) ? args.pop.dup : {}
27
+ options[:exdate] =
28
+ case options[:exdate]
29
+ when GeometricComplex ; options[:exdate].dup
30
+ when nil ; GeometricComplex.new()
31
+ else ; GeometricComplex.new(options[:exdate])
32
+ end
33
+ return options
34
+ end
35
+
36
+ # 生成元オブジェクト
37
+ # @return [Comparable]
38
+ attr_reader :parent
39
+
40
+ # オプション
41
+ # @return [Hash]
42
+ # @private
43
+ attr_accessor :options
44
+ protected :options=
45
+
46
+ # 除外要素
47
+ # @return [When::Parts::GeometricComplex]
48
+ attr_accessor :exdate
49
+ protected :exdate=
50
+
51
+ # 処理済み要素
52
+ # @return [When::Parts::GeometricComplex]
53
+ attr_accessor :processed
54
+ protected :processed=
55
+
56
+ # 最初の要素
57
+ # @return [Comparable]
58
+ attr_accessor :first
59
+ protected :first=
60
+
61
+ # 最後の要素
62
+ # @return [Comparable]
63
+ attr_accessor :last
64
+ protected :last=
65
+
66
+ # 繰り返し方向
67
+ # @return [Symbol]
68
+ # [ :forward - 昇順 ]
69
+ # [ :reverse - 降順 ]
70
+ attr_reader :direction
71
+
72
+ # 最大繰り返し回数
73
+ # @return [Integer]
74
+ attr_reader :count_limit
75
+
76
+ # 現在の繰り返し回数
77
+ # @return [Integer]
78
+ attr_reader :count
79
+
80
+ # 現在の要素
81
+ # @return [Comparable]
82
+ attr_accessor :current
83
+ protected :current=
84
+
85
+ # 現在のインデックス
86
+ # @return [Integer]
87
+ # @private
88
+ attr_reader :index
89
+
90
+ # with_object メソッドで渡すインスタンス
91
+ # @return [Comparable]
92
+ # @private
93
+ attr_accessor :object
94
+ protected :object=
95
+
96
+ #
97
+ # ブロックを評価する
98
+ #
99
+ # @return [rewind された self]
100
+ #
101
+ def each
102
+ return self unless block_given?
103
+ while (has_next?) do
104
+ if @index
105
+ yield(succ, @index)
106
+ @index += 1
107
+ elsif @object
108
+ yield(succ, @object)
109
+ else
110
+ yield(succ)
111
+ end
112
+ end
113
+ @index = @object = nil
114
+ rewind
115
+ end
116
+
117
+ #
118
+ # index をブロックに渡して評価する
119
+ #
120
+ # @param [Integer] offset index の初期値
121
+ #
122
+ # @return [When::Parts:Enumerator]
123
+ # [ ブロックあり - rewind された self ]
124
+ # [ ブロックなし - copy ]
125
+ #
126
+ def with_index(offset=0, &block)
127
+ if block_given?
128
+ @index = offset||@count
129
+ return each(block)
130
+ else
131
+ copy = _copy
132
+ copy.object = nil
133
+ copy.index = offset||@count
134
+ return copy
135
+ end
136
+ end
137
+
138
+ #
139
+ # index をブロックに渡して評価する
140
+ #
141
+ # @param [Comparable] object ブロックに渡す Object
142
+ #
143
+ # @return [When::Parts:Enumerator]
144
+ # [ ブロックあり - rewind された self ]
145
+ # [ ブロックなし - copy ]
146
+ #
147
+ def with_object(object, &block)
148
+ if block_given?
149
+ @object = object
150
+ each(block)
151
+ return object
152
+ else
153
+ copy = _copy
154
+ copy.object = object
155
+ copy.index = nil
156
+ return copy
157
+ end
158
+ end
159
+
160
+ #
161
+ # 巻き戻す
162
+ #
163
+ # @return [rewind された self]
164
+ #
165
+ def _rewind
166
+ @processed = @exdate.dup
167
+ @count = 0
168
+ @current = :first
169
+ succ
170
+ self
171
+ end
172
+ alias :rewind :_rewind
173
+
174
+ #
175
+ # 次の要素があるか?
176
+ #
177
+ # @return [Boolean]
178
+ # [ true - ある ]
179
+ # [ false - ない ]
180
+ #
181
+ def has_next?
182
+ return (@current != nil)
183
+ end
184
+
185
+ #
186
+ # 次の要素を取り出す
187
+ #
188
+ # @return [Comparable] 次の要素
189
+ # @raise [StopIteration] 次の要素がない場合 rewind して例外を発生
190
+ #
191
+ def next
192
+ return succ if has_next?
193
+ rewind
194
+ raise StopIteration, "Iteration Stopped"
195
+ end
196
+
197
+ #
198
+ # 次の要素を取り出す
199
+ #
200
+ # @return [Comparable]
201
+ # [ 次の要素あり - 次の要素 ]
202
+ # [ 次の要素なし - nil ]
203
+ #
204
+ # @note
205
+ # 次の要素がない場合 rewind や、StopIteration例外発生は行わない
206
+ #
207
+ def succ
208
+ value = @current
209
+ if (@count_limit.kind_of?(Numeric) && @count >= @count_limit)
210
+ @current = nil
211
+ else
212
+ loop do
213
+ @current = _succ
214
+ break unless (@current)
215
+ next if (@current == :next)
216
+ @current = GeometricComplex.new(@current, @duration) if @duration
217
+ next if _exclude(@current)
218
+ case @direction
219
+ when :reverse
220
+ next if (@current > @first)
221
+ @current = nil if (@last && @current < @last)
222
+ break
223
+ else
224
+ next if (@current < @first)
225
+ @current = nil if (@last && @current > @last)
226
+ break
227
+ end
228
+ end
229
+ @count += 1
230
+ _exclude(@current) if (@current)
231
+ end
232
+ return value
233
+ end
234
+
235
+ # オブジェクトの生成
236
+ #
237
+ # @overload initialize(parent, range, count_limit=nil))
238
+ # @param [Comparable] parent 生成元
239
+ # @param [Range, When::Parts::GeometricComplex] range
240
+ # [ 始点 - range.first ]
241
+ # [ 終点 - range.last ]
242
+ # @param [Integer] count_limit 繰り返し回数(デフォルトは指定なし)
243
+ #
244
+ # @param [Comparable] parent 生成元
245
+ # @param [When::TM::TemporalPosition] first 始点
246
+ # @param [Symbol] direction
247
+ # [ :forward - 昇順 ]
248
+ # [ :reverse - 降順 ]
249
+ # @param [Integer] count_limit 繰り返し回数(デフォルトは指定なし)
250
+ #
251
+ def initialize(*args)
252
+ @options = self.class._options(args)
253
+ @exdate = @options.delete(:exdate)
254
+ @exevent = @options.delete(:exevent)
255
+ @parent, *rest = args
256
+ _range(rest)
257
+ _rewind
258
+ end
259
+
260
+ private
261
+
262
+ def _range(args)
263
+ if (args[0].instance_of?(Range))
264
+ range, @count_limit, others = args
265
+ raise ArgumentError, "Too many arguments" if (others)
266
+ @first = When.when?(range.first)
267
+ @last = When.when?(range.last)
268
+ @exdate |= @last if (range.exclude_end?)
269
+ if (@first > @last)
270
+ @first, @last = @last, @first
271
+ @direction = :reverse
272
+ else
273
+ @direction = :forward
274
+ end
275
+ else
276
+ @first, @direction, @count_limit, others = args
277
+ raise ArgumentError, "Too many arguments" if (others)
278
+ raise ArgumentError, "Too few arguments" unless (@first)
279
+ @direction ||= :forward
280
+ @last = nil
281
+ end
282
+ end
283
+
284
+ def _exclude(value)
285
+ if @exevent
286
+ @exevent.each do |ev|
287
+ return true if ev.include?(value)
288
+ end
289
+ end
290
+ previous = @processed._include?(value)
291
+ @processed |= value if previous == false
292
+ registered = (previous==value) ? previous : value
293
+ registered = registered.first if registered.kind_of?(GeometricComplex)
294
+ registered.events ||=[]
295
+ registered.events << self.parent
296
+ registered.events.uniq!
297
+ return previous != false
298
+ end
299
+
300
+ def _copy
301
+ copy = dup
302
+ copy.options = @options.dup if @options
303
+ copy.exdate = @exdate.dup if @exdate
304
+ copy.exevent = @exevent.dup if @exevent
305
+ copy.processed = @processed.dup if @processed
306
+ copy.first = @first.dup if @first
307
+ copy.last = @last.dup if @last
308
+ copy.current = @current.dup if @current.respond_to?(:dup)
309
+ copy.object = @object.dup if @object.respond_to?(:dup)
310
+ return copy
311
+ end
312
+
313
+ #
314
+ # 時間位置の Array を順に取り出す Enumerator
315
+ #
316
+ class Array < Enumerator
317
+
318
+ # 整列して、重複した候補を削除
319
+ #
320
+ # @param list [Array]
321
+ # @param [Symbol] direction
322
+ # [ :forward - 昇順 ]
323
+ # [ :reverse - 降順 ]
324
+ #
325
+ # @param [Array]
326
+ # @note
327
+ # eql? はオーバーライドしない
328
+ #
329
+ def self._sort(list, direction)
330
+ list = list.sort
331
+ prev = nil
332
+ list.delete_if do |x|
333
+ if (x == prev)
334
+ true
335
+ else
336
+ prev = x
337
+ false
338
+ end
339
+ end
340
+ list.reverse! if (direction == :reverse)
341
+ return list
342
+ end
343
+
344
+ # 初期リスト
345
+ # @return [Array]
346
+ # @private
347
+ attr_accessor :initial_list
348
+ protected :initial_list=
349
+
350
+ # 現在リスト
351
+ # @return [Array]
352
+ # @private
353
+ attr_accessor :current_list
354
+ protected :current_list=
355
+
356
+ #
357
+ # 巻き戻す
358
+ #
359
+ # @return [rewind された self]
360
+ # @private
361
+ def _rewind
362
+ @current_list = @initial_list.dup
363
+ super
364
+ end
365
+
366
+ # オブジェクトの生成
367
+ #
368
+ # @overload initialize(parent, list, count_limit=nil))
369
+ # @param [Comparable] parent 生成元
370
+ # @param [Array<When::TM::TemporalPosition>] list 順に取り出す時間位置の Array
371
+ # @param [Symbol] direction
372
+ # [ :forward - 昇順 ]
373
+ # [ :reverse - 降順 ]
374
+ # @param [Integer] count_limit 繰り返し回数(デフォルトは指定なし)
375
+ #
376
+ def initialize(*args)
377
+ parent, list, direction, *args = args
378
+ raise ArgumentError, "Too few arguments" unless list
379
+ @initial_list = self.class._sort(list, direction||:forward)
380
+ super(parent, @initial_list[0], direction, *args)
381
+ end
382
+
383
+ private
384
+
385
+ def _succ
386
+ return @current_list.shift
387
+ end
388
+
389
+ def _copy
390
+ copy = super
391
+ copy.initial_list = @initial_list.dup
392
+ copy.current_list = @current_list.dup
393
+ return copy
394
+ end
395
+ end
396
+
397
+ #
398
+ # 複数の下位 Enumerator の結果を順に取り出す Enumerator
399
+ #
400
+ class Integrated < Enumerator
401
+
402
+ #
403
+ # 下位 Enumerator
404
+ #
405
+ # @return [Array<When::Parts::Enumerator>]
406
+ #
407
+ attr_accessor :enumerators
408
+ protected :enumerators=
409
+
410
+ #
411
+ # 巻き戻す
412
+ #
413
+ # @return [rewind された self]
414
+ #
415
+ def rewind
416
+ @enumerators.each do |enum|
417
+ enum._rewind
418
+ end
419
+ super
420
+ end
421
+
422
+ # オブジェクトの生成
423
+ #
424
+ # @overload initialize(parent, enumerators, first, count_limit=nil))
425
+ # @param [Comparable] parent 生成元
426
+ # @param [Array<When::Parts::Enumerator>] list 順に取り出す下位 Enumeratorの Array
427
+ # @param [When::TM::TemporalPosition] first 始点
428
+ # @param [Symbol] direction
429
+ # [ :forward - 昇順 ]
430
+ # [ :reverse - 降順 ]
431
+ # @param [Integer] count_limit 繰り返し回数(デフォルトは指定なし)
432
+ #
433
+ def initialize(*args)
434
+ parent, @enumerators, *rest = args
435
+ raise ArgumentError, "Too few arguments" unless @enumerators.kind_of?(::Array)
436
+ super(parent, *rest)
437
+ end
438
+
439
+ private
440
+
441
+ def _copy
442
+ copy = super
443
+ copy.enumerators = @enumerators.map {|e| e._copy}
444
+ return copy
445
+ end
446
+
447
+ def _succ
448
+ current = nil
449
+ selected = nil
450
+ @enumerators.each_index do |i|
451
+ value = @enumerators[i].current
452
+ next unless (value)
453
+ if (current)
454
+ verify = current <=> value
455
+ case @direction
456
+ when :reverse ; next if (verify > 0)
457
+ else ; next if (verify < 0)
458
+ end
459
+ if (verify == 0)
460
+ next if current.kind_of?(GeometricComplex) && current.include?(value)
461
+ #next if current.precision <= value.precision # TODO
462
+ end
463
+ end
464
+ current = value
465
+ selected = i
466
+ end
467
+ @enumerators[selected].succ if (selected)
468
+ return current
469
+ end
470
+ end
471
+ end
472
+ end