YkLib 0.1.0

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 (125) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +7 -0
  7. data/Gemfile.lock +34 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +44 -0
  10. data/Rakefile +6 -0
  11. data/YkLib.gemspec +29 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/lib/YkLib/Yk/__advance__.rb +151 -0
  15. data/lib/YkLib/Yk/__defun__.rb +44 -0
  16. data/lib/YkLib/Yk/__hook__.rb +244 -0
  17. data/lib/YkLib/Yk/__minmax__.rb +123 -0
  18. data/lib/YkLib/Yk/__stdlog.rb +329 -0
  19. data/lib/YkLib/Yk/adhocLiterals/email.rb +119 -0
  20. data/lib/YkLib/Yk/adhocLiterals/path.rb +402 -0
  21. data/lib/YkLib/Yk/adhocLiterals/tag.rb +19 -0
  22. data/lib/YkLib/Yk/adhocLiterals/url.rb +36 -0
  23. data/lib/YkLib/Yk/adhocLiterals.rb +199 -0
  24. data/lib/YkLib/Yk/auto_escseq.rb +5 -0
  25. data/lib/YkLib/Yk/auto_pstore.rb +179 -0
  26. data/lib/YkLib/Yk/bsearch.rb +120 -0
  27. data/lib/YkLib/Yk/clambda.rb +309 -0
  28. data/lib/YkLib/Yk/confLine.rb +423 -0
  29. data/lib/YkLib/Yk/create_tty_width_available.rb +24 -0
  30. data/lib/YkLib/Yk/crypt.rb +26 -0
  31. data/lib/YkLib/Yk/debug2 +1 -0
  32. data/lib/YkLib/Yk/debug2.rb +473 -0
  33. data/lib/YkLib/Yk/debugout.rb +139 -0
  34. data/lib/YkLib/Yk/email_tz.rb +533 -0
  35. data/lib/YkLib/Yk/enum_expect.rb +170 -0
  36. data/lib/YkLib/Yk/errlog.rb +5 -0
  37. data/lib/YkLib/Yk/escseq.rb +59 -0
  38. data/lib/YkLib/Yk/eval_alt.rb +281 -0
  39. data/lib/YkLib/Yk/expector.rb +93 -0
  40. data/lib/YkLib/Yk/fetch.rb +556 -0
  41. data/lib/YkLib/Yk/fetch_old.rb +290 -0
  42. data/lib/YkLib/Yk/fib.rb +158 -0
  43. data/lib/YkLib/Yk/file_aux.rb +843 -0
  44. data/lib/YkLib/Yk/file_aux2.rb +919 -0
  45. data/lib/YkLib/Yk/file_aux_old.rb +160 -0
  46. data/lib/YkLib/Yk/filemod.rb +19 -0
  47. data/lib/YkLib/Yk/force_escseq.rb +3 -0
  48. data/lib/YkLib/Yk/generator__.rb +144 -0
  49. data/lib/YkLib/Yk/generator__.rb.org +139 -0
  50. data/lib/YkLib/Yk/indenter/argless_case.rb +46 -0
  51. data/lib/YkLib/Yk/indenter/each_token.rb +671 -0
  52. data/lib/YkLib/Yk/indenter/free_case.rb +313 -0
  53. data/lib/YkLib/Yk/indenter/if_less.rb +53 -0
  54. data/lib/YkLib/Yk/indenter/independent_ensure.rb +23 -0
  55. data/lib/YkLib/Yk/indenter/independent_rescue.rb +23 -0
  56. data/lib/YkLib/Yk/indenter/operand_circumflex.rb +0 -0
  57. data/lib/YkLib/Yk/indenter/operand_period.rb +16 -0
  58. data/lib/YkLib/Yk/indenter/parenless_and.rb +37 -0
  59. data/lib/YkLib/Yk/indenter/post_test.rb +48 -0
  60. data/lib/YkLib/Yk/indenter/token.rb +1525 -0
  61. data/lib/YkLib/Yk/indenter.rb +1382 -0
  62. data/lib/YkLib/Yk/inot.rb +265 -0
  63. data/lib/YkLib/Yk/intf.rb +815 -0
  64. data/lib/YkLib/Yk/io_aux.rb +1332 -0
  65. data/lib/YkLib/Yk/ioctl.rb +60 -0
  66. data/lib/YkLib/Yk/ipcc.rb +87 -0
  67. data/lib/YkLib/Yk/ipcountry.rb +207 -0
  68. data/lib/YkLib/Yk/ipv4adr.rb +318 -0
  69. data/lib/YkLib/Yk/localmail.rb +276 -0
  70. data/lib/YkLib/Yk/method_chain.rb +359 -0
  71. data/lib/YkLib/Yk/misc_tz.rb +1716 -0
  72. data/lib/YkLib/Yk/missing_method.rb +50 -0
  73. data/lib/YkLib/Yk/mojiConv.rb +257 -0
  74. data/lib/YkLib/Yk/nostdlog.rb +4 -0
  75. data/lib/YkLib/Yk/on_marshal.rb +20 -0
  76. data/lib/YkLib/Yk/overrider.rb +47 -0
  77. data/lib/YkLib/Yk/path.rb +293 -0
  78. data/lib/YkLib/Yk/path_aux.rb +883 -0
  79. data/lib/YkLib/Yk/path_aux_alt.rb +0 -0
  80. data/lib/YkLib/Yk/path_rep.rb +1267 -0
  81. data/lib/YkLib/Yk/pg_setup.rb +917 -0
  82. data/lib/YkLib/Yk/procinfo.rb +314 -0
  83. data/lib/YkLib/Yk/proclist.rb +492 -0
  84. data/lib/YkLib/Yk/property.rb +863 -0
  85. data/lib/YkLib/Yk/ranger.rb +606 -0
  86. data/lib/YkLib/Yk/resolv_tz.rb +88 -0
  87. data/lib/YkLib/Yk/rlprompt.rb +73 -0
  88. data/lib/YkLib/Yk/rootexec.rb +48 -0
  89. data/lib/YkLib/Yk/rpm-packageproxy.rb +784 -0
  90. data/lib/YkLib/Yk/rpm-packageproxy2.rb +1430 -0
  91. data/lib/YkLib/Yk/rwhen.rb +21 -0
  92. data/lib/YkLib/Yk/selector.rb +124 -0
  93. data/lib/YkLib/Yk/set.rb +170 -0
  94. data/lib/YkLib/Yk/shellquote.rb +300 -0
  95. data/lib/YkLib/Yk/sio.rb +1001 -0
  96. data/lib/YkLib/Yk/sio0.rb +835 -0
  97. data/lib/YkLib/Yk/sio_aux.rb +1524 -0
  98. data/lib/YkLib/Yk/sio_inot.rb +86 -0
  99. data/lib/YkLib/Yk/sock_aux.rb +42 -0
  100. data/lib/YkLib/Yk/spipe.rb +843 -0
  101. data/lib/YkLib/Yk/sql_table.rb +565 -0
  102. data/lib/YkLib/Yk/stdlog.rb +4 -0
  103. data/lib/YkLib/Yk/syscommand.rb +173 -0
  104. data/lib/YkLib/Yk/sysinit.rb +75 -0
  105. data/lib/YkLib/Yk/ttyFontWidth.rb +46113 -0
  106. data/lib/YkLib/Yk/tty_char.dump +0 -0
  107. data/lib/YkLib/Yk/tty_char.rb +47 -0
  108. data/lib/YkLib/Yk/tty_char_create.rb +437031 -0
  109. data/lib/YkLib/Yk/tty_char_static.rb +437016 -0
  110. data/lib/YkLib/Yk/tty_rewrite.rb +142 -0
  111. data/lib/YkLib/Yk/tty_str.rb +461 -0
  112. data/lib/YkLib/Yk/tty_width.dat.rb +114 -0
  113. data/lib/YkLib/Yk/tty_width.rb +180 -0
  114. data/lib/YkLib/Yk/tty_width_available +569 -0
  115. data/lib/YkLib/Yk/tty_width_list +0 -0
  116. data/lib/YkLib/Yk/tty_width_list.linux +280 -0
  117. data/lib/YkLib/Yk/tty_width_list.windows +324 -0
  118. data/lib/YkLib/Yk/tz_tty +0 -0
  119. data/lib/YkLib/Yk/tz_tty.rb +0 -0
  120. data/lib/YkLib/Yk/uprepos.rb +94 -0
  121. data/lib/YkLib/Yk/userinfo.rb +91 -0
  122. data/lib/YkLib/Yk/with.rb +109 -0
  123. data/lib/YkLib/version.rb +3 -0
  124. data/lib/YkLib.rb +6 -0
  125. metadata +170 -0
@@ -0,0 +1,556 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ require 'continuation'
5
+
6
+
7
+ class Fetch
8
+ def self.caller_binding
9
+ cc = nil # must be present to work within lambda
10
+ count = 0 # counter of returns
11
+
12
+ set_trace_func lambda { |event, file, lineno, id, binding, klass|
13
+ # First return gets to the caller of this method
14
+ # (which already know its own binding).
15
+ # Second return gets to the caller of the caller.
16
+ # That's we want!
17
+ if count == 2
18
+ set_trace_func nil
19
+ # Will return the binding to the callcc below.
20
+ cc.call binding
21
+ elsif event == "return"
22
+ count += 1
23
+ end
24
+ }
25
+ # First time it'll set the cc and return nil to the caller.
26
+ # So it's important to the caller to return again
27
+ # if it gets nil, then we get the second return.
28
+ # Second time it'll return the binding.
29
+ return callcc { |cont| cc = cont ; nil}
30
+ end
31
+ #module_function :caller_binding
32
+
33
+ BlockStrList = Hash.new
34
+ ANON = Object.new
35
+ attr :direct_mode, true
36
+ def initialize obj
37
+ @obj = obj
38
+ end
39
+ class BlockInfo
40
+ class Select < Array
41
+ def initialize *args
42
+ args.each do |e|
43
+ push e
44
+ end
45
+ end
46
+ end
47
+ attr :params, true
48
+ def self.each_match item, pat
49
+ if pat == ANON
50
+ true
51
+ elsif pat.is_a? Select
52
+ pat.each do |e|
53
+ if each_match(item, e)
54
+ return true
55
+ end
56
+ end
57
+ return false
58
+ elsif !item.is_a?(Array) || !pat.is_a?(Array)
59
+ item == pat
60
+ else # both is array
61
+ if pat.size <= item.size
62
+ pat.each_with_index do |e, i|
63
+ if !each_match(item[i], e)
64
+ return false
65
+ end
66
+ end
67
+ #pp ["item", item]
68
+ #pp ["pat", pat]
69
+ true
70
+ else
71
+ false
72
+ end
73
+ end
74
+ end
75
+ def self.rec_find_match sexe, pat
76
+ return sexe if each_match sexe, pat
77
+ case sexe.size
78
+ when 0
79
+ pat == []
80
+ when 1
81
+ item = sexe[0]
82
+ if each_match item, pat
83
+ item
84
+ elsif item.is_a?(Array) || (item.respond_to?(:to_ary) && (item = item.to_ary))
85
+ rec_find_match item, pat
86
+ end
87
+ else
88
+ m = sexe.size.div(2)
89
+ rec_find_match(sexe[0 ... m], pat) or rec_find_match(sexe[m .. -1], pat)
90
+ end
91
+ end
92
+ def self.rec_find_match_all sexe, pat, ret = []
93
+ case sexe.size
94
+ when 0
95
+ ret
96
+ when 1
97
+ item = sexe[0]
98
+ if each_match item, pat
99
+ ret.push item
100
+ elsif item.is_a?(Array) || (item.respond_to(:to_ary) && (item = item.to_ary))
101
+ rec_find_match_all item, pat, ret
102
+ end
103
+ else
104
+ m = sexe.size.div(2)
105
+ rec_find_match_all(sexe[0 ... m], pat, ret)
106
+ rec_find_match_all(sexe[m .. -1], pat, ret)
107
+ end
108
+ ret
109
+ end
110
+ def self.dosexp path
111
+ require 'ripper'
112
+ sexpBuilder2 = Ripper.new(path, "-", 1)
113
+ (class << sexpBuilder2; self; end).module_eval do #:nodoc:
114
+ private
115
+
116
+ ::Ripper::PARSER_EVENT_TABLE.each do |event, arity|
117
+ if /_new\z/ =~ event.to_s and arity == 0
118
+ module_eval(<<-End, __FILE__, __LINE__ + 1)
119
+ def on_#{event}
120
+ []
121
+ end
122
+ End
123
+ elsif /_add\z/ =~ event.to_s
124
+ module_eval(<<-End, __FILE__, __LINE__ + 1)
125
+ def on_#{event}(list, item)
126
+ list.push item
127
+ list
128
+ end
129
+ End
130
+ else
131
+ module_eval(<<-End, __FILE__, __LINE__ + 1)
132
+ def on_#{event}(*args)
133
+ [[:#{event}, [lineno(), column()]], *args]
134
+ end
135
+ End
136
+ end
137
+ end
138
+
139
+ ::Ripper::SCANNER_EVENTS.each do |event|
140
+ module_eval(<<-End, __FILE__, __LINE__ + 1)
141
+ def on_#{event}(tok)
142
+ [:@#{event}, tok, [lineno(), column()]]
143
+ end
144
+ End
145
+ end
146
+ self
147
+ end
148
+ sexpBuilder2.parse
149
+ end
150
+
151
+ List = Hash.new
152
+ def self.getPosAfter all, lno, expr
153
+ i = 0
154
+ all.each_line do |ln|
155
+ i += 1
156
+ if lno == i && ln =~ expr
157
+ return [i, $`.size + $&.size + 1]
158
+ end
159
+ end
160
+ return nil
161
+ end
162
+ def self.getContent all, from, to
163
+ if from[0] > to[0] || (from[0] == to[0] && from[1] > to[1])
164
+ raise Exception.new "range error"
165
+ end
166
+ i = 0
167
+ lns = ""
168
+ all.each_line do |ln|
169
+ i += 1
170
+ if i == from[0]
171
+ if from[0] != to[0]
172
+ lns += ln[from[1] - 1 .. -1]
173
+ else
174
+ lns += ln[from[1] - 1 .. to[1] - 1]
175
+ if lns[-1] == "d"
176
+ lns = lns[0..-4]
177
+ elsif lns[-1] == "}"
178
+ lns = lns[0..-2]
179
+ end
180
+ if lns[0] == "|"
181
+ lns = lns[1..-1]
182
+ end
183
+ return lns
184
+ end
185
+ elsif i == to[0]
186
+ lns += ln[0 .. to[1] - 1]
187
+ if lns[-1] == "d"
188
+ lns = lns[0..-4]
189
+ elsif lns[-1] == "}"
190
+ lns = lns[0..-2]
191
+ end
192
+ if lns[0] == "|"
193
+ lns = lns[1..-1]
194
+ end
195
+ return lns
196
+ elsif from[0] < i && i < to[0]
197
+ lns += ln
198
+ end
199
+ end
200
+ raise Exception.new "range error"
201
+ end
202
+ attr :blockBody
203
+ def initialize params, path, lno, bstr
204
+ @params = params
205
+ @path = path
206
+ @lineNo = lno
207
+ if bstr
208
+ @blockBody = %{
209
+ Proc.new do |#{["_f", *params].join(", ")}|
210
+ #{bstr}
211
+ end
212
+ }
213
+ end
214
+ List[path + ":#{lno}"] = self
215
+ end
216
+ FILE_CONTENT = Hash.new
217
+ FILE_SEXP = Hash.new
218
+ OldCleared = Hash.new
219
+ def self.clearOld ph, t, forceTrue = true
220
+ found = false
221
+ if File.directory? ph
222
+ Dir.open ph do |d|
223
+ d.each do |f|
224
+ if f != "." && f != ".."
225
+ f = ph + "/" + f
226
+ if File.directory?(f)
227
+ if !clearOld f, t, false
228
+ require "fileutils"
229
+ FileUtils.rmdir f
230
+ end
231
+ elsif File.mtime(f) < t
232
+ File.unlink f
233
+ else
234
+ found = true
235
+ end
236
+ end
237
+ end
238
+ end
239
+ end
240
+ return forceTrue ? true: found
241
+ end
242
+ def self.createFromFiles path, lno, pth, ph
243
+ params = nil
244
+ blockContent = nil
245
+ w = pth + "/" + ".params"
246
+ t = File.mtime(path)
247
+ if File.exist?(w) && File.mtime(w) > t
248
+ File.open w do |f|
249
+ f.flock File::LOCK_SH
250
+ params = f.read.split /\s+/
251
+ end
252
+ end
253
+ w = pth + "/" + ".blockContent"
254
+ if File.exist?(w) && File.mtime(w) > t
255
+ File.open w do |f|
256
+ f.flock File::LOCK_SH
257
+ blockContent = f.read
258
+ end
259
+ end
260
+ if !params
261
+ OldCleared[path] ||= clearOld(ph, t)
262
+ return nil
263
+ end
264
+ self.new params, path, lno, blockContent
265
+ end
266
+ def self.getBlockInfo path, lno, key, label, blKey
267
+ label = label.to_s
268
+ pth = (ph = File.expand_path("~/.tmp") + "/Yk/site_ruby/fetch.rb/" + path) + "/" + lno.to_s + "/" + key + "/" + label
269
+ item = List[path + ":#{lno}"] || createFromFiles(path, lno, pth, ph)
270
+ if item
271
+ return item
272
+ end
273
+ all = FILE_CONTENT[path] ||= IO.read(path)
274
+ sexp = FILE_SEXP[path] ||= dosexp(all)
275
+ lst = rec_find_match sexp,
276
+ [[:method_add_block],
277
+ [[:call],
278
+ [[:call],
279
+ ANON,
280
+ :".",
281
+ [:@ident, key]
282
+ ],
283
+ :".",
284
+ [:@ident, label, [lno]]
285
+ ],
286
+ [[Select.new(:do_block, :brace_block)]]
287
+ ]
288
+ if lst
289
+ pLst = rec_find_match lst,
290
+ [ [:method_add_block],
291
+ [[:call],
292
+ [[:call],
293
+ ANON,
294
+ :".",
295
+ [:@ident, key]
296
+ ],
297
+ :".",
298
+ [:@ident, label, [lno]]
299
+ ],
300
+ [[Select.new(:do_block, :brace_block)],
301
+ [[:block_var], [[:params]]]
302
+ ]
303
+ ]
304
+ params = []
305
+ if pLst
306
+ if pLst[2][1][1][1]
307
+ pLst[2][1][1][1].each do |e|
308
+ params.push e[1]
309
+ end
310
+ end
311
+ pLst[2][1][1].each do |e|
312
+ if e.is_a?(Array) && e[0].is_a?(Array) && e[0][0] == :rest_param
313
+ params.push "*" + e[1][1]
314
+ end
315
+ end
316
+ end
317
+ require "pathname"
318
+ Pathname.new(pth).mkpath
319
+ File.open pth + "/.params", "w" do |fw|
320
+ fw.flock File::LOCK_EX
321
+ fw.write params.join(" ")
322
+ end
323
+ if params[0] =~ /^_f/
324
+ self.new params, path, lno, nil
325
+ else
326
+ c = pLst && getContent(all, pLst[2][1][0][1], pLst[2][0][1])
327
+ c ||= getContent(all, getPosAfter(all, lno, /\b#{key}\s*\.\s*#{label}\b.*(\bdo\b|\{)/), lst[2][0][1])
328
+ File.open pth + "/.blockContent", "w" do |fw|
329
+ fw.flock File::LOCK_EX
330
+ fw.write c
331
+ end
332
+ self.new params, path, lno, c
333
+ end
334
+ else
335
+ nil
336
+ end
337
+
338
+ end
339
+ end
340
+ def method_missing label, *fargs, &bl
341
+ @label = label
342
+ super if !@obj.respond_to? @label
343
+ loc = caller_locations(1)[0]
344
+ if @blockInfo = BlockInfo.getBlockInfo(loc.path, loc.lineno, "__fetch__", @label, "fetch")
345
+ bd = @blockInfo.blockBody
346
+ if bd
347
+ return unless bnd = Fetch.caller_binding
348
+ @block = bnd.eval(bd)
349
+ end
350
+ end
351
+ @block ||= bl
352
+ entity *fargs
353
+ end
354
+ def normArray a
355
+ if a.size == 1
356
+ if a[0].is_a?(Array)
357
+ return a[0]
358
+ elsif a[0].respond_to? :to_ary
359
+ return a.to_ary
360
+ end
361
+ end
362
+ return a
363
+ end
364
+ def entity *fargs
365
+ if callcc{|cc| @start = cc; true}
366
+ @iter_rval = iterate *fargs
367
+ @setup_iter_rval.call false
368
+ else
369
+ @start = nil
370
+ @bl_rval = nil
371
+ loop do
372
+ count = 0
373
+ a = @args
374
+ if @blockInfo.params.size > (@blockInfo.blockBody ? 1 : 2)
375
+ a = normArray(a)
376
+ end
377
+ #p [__LINE__, @args, a]
378
+ set_trace_func lambda { |event, file, lineno, id, binding, klass|
379
+ if event == "line"
380
+ count += 1
381
+ if count == 2
382
+ @blBind = binding
383
+ set_trace_func nil
384
+ end
385
+ end
386
+ }
387
+ @bl_rval = @block.call self, *a
388
+ if !callcc{|cc| @setup_iter_rval = cc; true}
389
+ break @iter_rval
390
+ end
391
+ if callcc{|cc| @block_cont = cc; true}
392
+ @iterate_cont.call false;
393
+ end
394
+ end
395
+ end
396
+ end
397
+ def iterate *fargs
398
+ @obj.__send__(@label, *fargs, &self)
399
+ end
400
+ def evaluate
401
+ if @blockInfo.params.size > (@blockInfo.blockBody ? 1 : 2)
402
+ @args = normArray(@args)
403
+ end
404
+ @blockInfo.params.each_with_index do |vl, im|
405
+ i = @blockInfo.blockBody ? im : im - 1
406
+ if i == -1
407
+ @blBind.eval("#{vl} = ObjectSpace._id2ref(#{self.__id__})");
408
+ else
409
+ if @args.size <= i
410
+ if vl[0..0] == "*"
411
+ @blBind.eval("#{vl} = []")
412
+ else
413
+ @blBind.eval("#{vl} = nil")
414
+ end
415
+ else
416
+ if vl[0..0] == "*"
417
+ estr = "#{vl[1..-1]} = ["
418
+ i.upto @args.size - 1 do |j|
419
+ if j != i
420
+ estr += ","
421
+ end
422
+ estr += "ObjectSpace._id2ref(#{@args[j].__id__})"
423
+ end
424
+ estr += "]"
425
+ @blBind.eval estr
426
+ else
427
+ @blBind.eval("#{vl} = ObjectSpace._id2ref(#{@args[i].__id__})");
428
+ end
429
+ end
430
+ end
431
+ end
432
+ end
433
+ def fetch fret = nil
434
+ if callcc{|cc| @fetch = cc; true}
435
+ @bl_rval = fret
436
+ @iterate_cont.call false
437
+ else
438
+ @fetch = nil
439
+ evaluate
440
+ end
441
+ true
442
+ end
443
+ def call *args
444
+ @args = args
445
+ if callcc{|cc| @iterate_cont = cc; true}
446
+ if @start
447
+ @start.call false
448
+ elsif @fetch
449
+ @fetch.call false
450
+ else
451
+ @block_cont.call false
452
+ end
453
+ else
454
+ @bl_rval
455
+ end
456
+ end
457
+ def to_proc
458
+ Proc.new do |*args|
459
+ call *args
460
+ end
461
+ end
462
+ def self.find
463
+ loc = caller_locations(2)[0]
464
+ FetchRangeList.find loc
465
+ end
466
+ end
467
+
468
+
469
+ def fetch *frets
470
+ return unless bnd = Fetch.caller_binding
471
+ f = bnd.eval("_f")
472
+ if !f.is_a? Fetch
473
+ raise Exception.new("JumpError")
474
+ end
475
+ case frets.size
476
+ when 0
477
+ fret = nil
478
+ when 1
479
+ fret = frets[0]
480
+ else
481
+ fret = frets
482
+ end
483
+ f.fetch fret
484
+ end
485
+
486
+
487
+ class Object
488
+ def __fetch__ &bl
489
+ f = Fetch.new self
490
+ if bl
491
+ f.direct_mode = true
492
+ bl.call f
493
+ else
494
+ f
495
+ end
496
+ end
497
+ end
498
+
499
+
500
+ if File.expand_path($0) == __FILE__
501
+
502
+ # [1, 2, 3, 4, 5].__fetch__.each do |e|
503
+ # if e == 3
504
+ # print "[#{e}, #{(fetch and e)}], "
505
+ # else
506
+ # print "#{e}, "
507
+ # end
508
+ # end
509
+
510
+ def test
511
+ [1, 2, 3, 4, 5].__fetch__.each { |_f, e|
512
+ if e == 3
513
+ print "[#{e}, #{(fetch and e)}], "
514
+ else
515
+ print "#{e}, "
516
+ end
517
+ }
518
+ end
519
+
520
+ print "\n"
521
+ test
522
+ print "\n"
523
+ test
524
+ test
525
+
526
+
527
+ i = 0
528
+ [[1, 2, 3], 4, 5, [6, 7], [8, 9, 10, 11], 12, 13].__fetch__.each do |*j|
529
+ if i == 3
530
+ print "("
531
+ end
532
+ print "[#{j}]"
533
+ if i == 3
534
+ fetch
535
+ print ", [#{j}])"
536
+ end
537
+ print "\n"
538
+ i += 1
539
+ end
540
+
541
+ [[1, 2, 3], 4, 5, [6, 7], [8, 9, 10, 11], 12, 13].each do |*j|
542
+ if i == 3
543
+ print "["
544
+ end
545
+ print "[#{j}]"
546
+ print "\n"
547
+ i += 1
548
+ end
549
+
550
+ end
551
+
552
+
553
+ print "\n"
554
+
555
+
556
+