musa-dsl 0.22.6 → 0.23.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.
@@ -1,6 +1,6 @@
1
1
  module Musa
2
2
  module Series
3
- module SerieOperations
3
+ module Operations
4
4
  def autorestart
5
5
  Autorestart.new self
6
6
  end
@@ -108,12 +108,12 @@ module Musa
108
108
 
109
109
  alias_method :eval, :with
110
110
 
111
- def map(&yield_block)
112
- ProcessWith.new self, &yield_block
111
+ def map(&block)
112
+ ProcessWith.new self, &block
113
113
  end
114
114
 
115
- def anticipate(&yield_block)
116
- Anticipate.new self, &yield_block
115
+ def anticipate(&block)
116
+ Anticipate.new self, &block
117
117
  end
118
118
 
119
119
  ###
@@ -121,34 +121,36 @@ module Musa
121
121
  ###
122
122
 
123
123
  class ProcessWith
124
- include Musa::Extension::SmartProcBinder
125
- include Serie
126
-
127
- attr_reader :source, :on_restart, :block
128
- def with_sources; @sources; end
124
+ include Serie.with(source: true, sources: true, sources_as: :with_sources, smart_block: true)
129
125
 
130
126
  def initialize(serie, with_series = nil, on_restart = nil, &block)
131
- @source = serie
132
- @sources = with_series || {}
133
- @on_restart = on_restart
134
- @block = SmartProcBinder.new(block) if block_given?
127
+ self.source = serie
128
+ self.with_sources = with_series || {}
129
+ self.on_restart = on_restart
130
+ self.proc = block if block
131
+
132
+ init
133
+ end
135
134
 
136
- if @source.prototype?
137
- @sources = @sources.transform_values { |s| s.prototype }.freeze
135
+ def on_restart(&block)
136
+ if block
137
+ @on_restart = block
138
138
  else
139
- @sources = @sources.transform_values { |s| s.instance }
139
+ @on_restart
140
140
  end
141
+ end
141
142
 
142
- mark_regarding! @source
143
+ def on_restart=(block)
144
+ @on_restart = block
143
145
  end
144
146
 
145
- def _restart
147
+ private def _restart
146
148
  @source.restart
147
- @sources.values.each { |s| s.restart }
149
+ @sources.values.each(&:restart)
148
150
  @on_restart.call if @on_restart
149
151
  end
150
152
 
151
- def _next_value
153
+ private def _next_value
152
154
  main = @source.next_value
153
155
  others = @sources.transform_values { |v| v.next_value }
154
156
 
@@ -173,23 +175,20 @@ module Musa
173
175
  private_constant :ProcessWith
174
176
 
175
177
  class Anticipate
176
- include Musa::Extension::SmartProcBinder
177
- include Serie
178
-
179
- attr_reader :source, :block
178
+ include Serie.with(source: true, block: true)
180
179
 
181
180
  def initialize(serie, &block)
182
- @source = serie
183
- @block = block
181
+ self.source = serie
182
+ self.proc = block
184
183
 
185
- mark_regarding! @source
184
+ init
186
185
  end
187
186
 
188
- def _restart
187
+ private def _restart
189
188
  @source.restart
190
189
  end
191
190
 
192
- def _next_value
191
+ private def _next_value
193
192
  previous_value = @source.current_value
194
193
  value = @source.next_value
195
194
  peek_next_value = @source.peek_next_value
@@ -209,30 +208,16 @@ module Musa
209
208
  private_constant :Anticipate
210
209
 
211
210
  class Switcher
212
- include Serie
213
-
214
- attr_accessor :sources
215
- def selector; @source; end
211
+ include Serie.with(source: true, sources: true, sources_as: :options)
216
212
 
217
213
  def initialize(selector, indexed_series, hash_series)
214
+ self.source = selector
215
+ self.options = indexed_series || hash_series
218
216
 
219
- @source = selector
220
- get = @source.prototype? ? :prototype : :instance
221
-
222
- if indexed_series && !indexed_series.empty?
223
- @sources = indexed_series.collect(&get)
224
- elsif hash_series && !hash_series.empty?
225
- @sources = hash_series.clone.transform_values(&get)
226
- end
227
-
228
- if get == :prototype!
229
- @sources.freeze
230
- end
231
-
232
- mark_regarding! @source
217
+ init
233
218
  end
234
219
 
235
- def _restart
220
+ private def _restart
236
221
  @source.restart
237
222
  if @sources.is_a? Array
238
223
  @sources.each(&:restart)
@@ -241,7 +226,7 @@ module Musa
241
226
  end
242
227
  end
243
228
 
244
- def _next_value
229
+ private def _next_value
245
230
  value = nil
246
231
 
247
232
  index_or_key = @source.next_value
@@ -259,46 +244,31 @@ module Musa
259
244
  private_constant :Switcher
260
245
 
261
246
  class MultiplexSelector
262
- include Serie
263
-
264
- def selector; @source; end
265
- attr_accessor :sources
247
+ include Serie.with(source: true, sources: true, sources_as: :options)
266
248
 
267
249
  def initialize(selector, indexed_series, hash_series)
268
- @source = selector
269
- get = @source.prototype? ? :prototype : :instance
270
-
271
- if indexed_series && !indexed_series.empty?
272
- @sources = indexed_series.collect(&get)
273
- elsif hash_series && !hash_series.empty?
274
- @sources = hash_series.clone.transform_values(&get)
275
- end
276
-
277
- _restart false
278
-
279
- if get == :prototype
280
- @sources.freeze
281
- end
250
+ self.source = selector
251
+ self.options = indexed_series || hash_series
282
252
 
283
- mark_regarding! @source
253
+ init
284
254
  end
285
255
 
286
- def _restart(restart_sources = true)
256
+ private def _init
287
257
  @current_value = nil
258
+ @first = true
259
+ end
288
260
 
289
- if restart_sources
290
- @source.restart
291
- if @sources.is_a? Array
292
- @sources.each(&:restart)
293
- elsif @sources.is_a? Hash
294
- @sources.each { |_key, serie| serie.restart }
295
- end
296
- end
261
+ private def _restart
262
+ @source.restart
297
263
 
298
- @first = true
264
+ if @sources.is_a? Array
265
+ @sources.each(&:restart)
266
+ elsif @sources.is_a? Hash
267
+ @sources.values.each(&:restart)
268
+ end
299
269
  end
300
270
 
301
- def _next_value
271
+ private def _next_value
302
272
  @current_value =
303
273
  if @first || !@current_value.nil?
304
274
  @first = false
@@ -318,34 +288,21 @@ module Musa
318
288
  private_constant :MultiplexSelector
319
289
 
320
290
  class SwitchFullSerie
321
- include Serie
322
-
323
- def selector; @source; end
324
- attr_accessor :sources
291
+ include Serie.with(source: true, sources: true, sources_as: :options)
325
292
 
326
293
  def initialize(selector, indexed_series, hash_series)
327
- @source = selector
328
- get = @source.prototype? ? :prototype : :instance
329
-
330
- if indexed_series && !indexed_series.empty?
331
- @sources = indexed_series.collect(&get)
332
- elsif hash_series && !hash_series.empty?
333
- @sources = hash_series.clone.transform_values(&get)
334
- end
335
-
336
- if get == :prototype
337
- @sources.freeze
338
- end
294
+ self.source = selector
295
+ self.options = indexed_series || hash_series
339
296
 
340
- mark_regarding! @source
297
+ init
341
298
  end
342
299
 
343
- def _restart
300
+ private def _restart
344
301
  @source.restart
345
302
  @sources.each(&:restart)
346
303
  end
347
304
 
348
- def _next_value
305
+ private def _next_value
349
306
  value = nil
350
307
 
351
308
  value = @sources[@index_or_key].next_value unless @index_or_key.nil?
@@ -367,21 +324,18 @@ module Musa
367
324
  private_constant :SwitchFullSerie
368
325
 
369
326
  class InfiniteRepeater
370
- include Serie
371
-
372
- attr_reader :source
327
+ include Serie.with(source: true)
373
328
 
374
329
  def initialize(serie)
375
- @source = serie
376
-
377
- mark_regarding! @source
330
+ self.source = serie
331
+ init
378
332
  end
379
333
 
380
- def _restart
334
+ private def _restart
381
335
  @source.restart
382
336
  end
383
337
 
384
- def _next_value
338
+ private def _next_value
385
339
  value = @source.next_value
386
340
 
387
341
  if value.nil?
@@ -400,38 +354,47 @@ module Musa
400
354
  private_constant :InfiniteRepeater
401
355
 
402
356
  class Repeater
403
- include Serie
404
-
405
- attr_reader :source, :times, :condition
357
+ include Serie.with(source: true)
406
358
 
407
359
  def initialize(serie, times = nil, &condition)
408
- @source = serie
360
+ self.source = serie
361
+ self.times = times
362
+ self.condition = condition
409
363
 
410
- @times = times
411
- @external_condition = condition
364
+ init
365
+ end
412
366
 
413
- _restart false
414
- @condition = calculate_condition
367
+ attr_reader :times
415
368
 
416
- mark_regarding! @source
369
+ def times=(value)
370
+ @times = value
371
+ calculate_condition
417
372
  end
418
373
 
419
- def _prototype!
420
- super
421
- @condition = calculate_condition
374
+ def condition(&block)
375
+ if block
376
+ @external_condition = block
377
+ calculate_condition
378
+ else
379
+ @external_condition
380
+ end
422
381
  end
423
382
 
424
- def _instance!
425
- super
426
- @condition = calculate_condition
383
+ def condition=(block)
384
+ @external_condition = block
385
+ calculate_condition
427
386
  end
428
387
 
429
- def _restart(restart_sources = true)
388
+ private def _init
430
389
  @count = 0
431
- @source.restart if restart_sources
390
+ calculate_condition
391
+ end
392
+
393
+ private def _restart
394
+ @source.restart
432
395
  end
433
396
 
434
- def _next_value
397
+ private def _next_value
435
398
  value = @source.next_value
436
399
 
437
400
  if value.nil?
@@ -451,38 +414,39 @@ module Musa
451
414
  end
452
415
 
453
416
  private def calculate_condition
454
- if @external_condition
455
- @external_condition
456
- elsif @times
457
- proc { @count < @times }
458
- else
459
- proc { false }
460
- end
417
+ @condition = if @external_condition
418
+ @external_condition
419
+ elsif @times
420
+ proc { @count < @times }
421
+ else
422
+ proc { false }
423
+ end
461
424
  end
462
425
  end
463
426
 
464
427
  private_constant :Repeater
465
428
 
466
429
  class LengthLimiter
467
- include Serie
468
-
469
- attr_reader :source, :length
430
+ include Serie.with(source: true)
470
431
 
471
432
  def initialize(serie, length)
472
- @source = serie
473
- @length = length
433
+ self.source = serie
434
+ self.length = length
474
435
 
475
- _restart false
476
-
477
- mark_regarding! @source
436
+ init
478
437
  end
479
438
 
480
- def _restart(restart_sources = true)
439
+ attr_accessor :length
440
+
441
+ private def _init
481
442
  @position = 0
482
- @source.restart if restart_sources
483
443
  end
484
444
 
485
- def _next_value
445
+ private def _restart
446
+ @source.restart
447
+ end
448
+
449
+ private def _next_value
486
450
  if @position < @length
487
451
  @position += 1
488
452
  @source.next_value
@@ -497,25 +461,26 @@ module Musa
497
461
  private_constant :LengthLimiter
498
462
 
499
463
  class Skipper
500
- include Serie
501
-
502
- attr_reader :source, :length
464
+ include Serie.with(source: true)
503
465
 
504
466
  def initialize(serie, length)
505
- @source = serie
506
- @length = length
467
+ self.source = serie
468
+ self.length = length
507
469
 
508
- _restart false
509
-
510
- mark_regarding! @source
470
+ init
511
471
  end
512
472
 
513
- def _restart(restart_sources = true)
514
- @source.restart if restart_sources
473
+ attr_accessor :length
474
+
475
+ private def _init
515
476
  @first = true
516
477
  end
517
478
 
518
- def _next_value
479
+ private def _restart
480
+ @source.restart
481
+ end
482
+
483
+ private def _next_value
519
484
  @length.times { @source.next_value } if @first
520
485
  @first = nil
521
486
 
@@ -530,40 +495,25 @@ module Musa
530
495
  private_constant :Skipper
531
496
 
532
497
  class Flattener
533
- include Serie
534
-
535
- attr_reader :source
498
+ include Serie.base
536
499
 
537
500
  def initialize(serie)
538
501
  @source = serie
539
-
540
- _restart false
541
-
542
502
  mark_regarding! @source
503
+ init
543
504
  end
544
505
 
545
- def _prototype!
546
- super
547
- _restart false
548
- end
549
-
550
- def _instance!
551
- super
552
- _restart false
506
+ private def _init
507
+ @stack = [@source]
508
+ @restart_each_serie = false
553
509
  end
554
510
 
555
- def _restart(restart_sources = true)
556
- if restart_sources
557
- @source.restart
558
- @restart_each_serie = true
559
- else
560
- @restart_each_serie = false
561
- end
562
-
563
- @stack = [@source]
511
+ private def _restart
512
+ @source.restart
513
+ @restart_each_serie = true
564
514
  end
565
515
 
566
- def _next_value
516
+ private def _next_value
567
517
  if @stack.last
568
518
  value = @stack.last.next_value
569
519
 
@@ -590,26 +540,24 @@ module Musa
590
540
  private_constant :Flattener
591
541
 
592
542
  class MergeSerieOfSeries
593
- include Serie
594
-
595
- attr_reader :source
543
+ include Serie.with(source: true)
596
544
 
597
545
  def initialize(serie)
598
- @source = serie
599
- _restart false
600
-
601
- mark_regarding! @source
546
+ self.source = serie
547
+ init
602
548
  end
603
549
 
604
- def _restart(restart_sources = true)
605
- if restart_sources
606
- @source.restart
607
- @restart_each_serie = true
608
- end
550
+ private def _init
609
551
  @current_serie = nil
552
+ @restart_each_serie = false
610
553
  end
611
554
 
612
- def _next_value
555
+ private def _restart
556
+ @source.restart
557
+ @restart_each_serie = true
558
+ end
559
+
560
+ private def _next_value
613
561
  value = nil
614
562
 
615
563
  restart_current_serie_if_needed = false
@@ -646,27 +594,28 @@ module Musa
646
594
  private_constant :MergeSerieOfSeries
647
595
 
648
596
  class Processor
649
- include Musa::Extension::SmartProcBinder
650
- include Serie
651
-
652
- attr_reader :source
597
+ include Serie.with(source: true, smart_block: true)
653
598
 
654
599
  def initialize(serie, parameters, &processor)
655
- @source = serie
656
- @parameters = parameters
657
- @processor = SmartProcBinder.new(processor)
600
+ self.source = serie
658
601
 
659
- _restart false
602
+ self.parameters = parameters
603
+ self.proc = processor if processor
660
604
 
661
- mark_regarding! @source
605
+ init
662
606
  end
663
607
 
664
- def _restart(restart_source = true)
665
- @source.restart if restart_source
608
+ attr_accessor :parameters
609
+
610
+ private def _init
666
611
  @pending_values = []
667
612
  end
668
613
 
669
- def _next_value
614
+ private def _restart
615
+ @source.restart
616
+ end
617
+
618
+ private def _next_value
670
619
  if @pending_values.empty?
671
620
 
672
621
  v = @source.next_value
@@ -674,7 +623,7 @@ module Musa
674
623
  if v.nil?
675
624
  nil
676
625
  else
677
- value = @processor.call(v, **@parameters)
626
+ value = @block.call(v, **@parameters)
678
627
 
679
628
  if value.is_a?(Array)
680
629
  @pending_values = value
@@ -700,23 +649,22 @@ module Musa
700
649
  end
701
650
 
702
651
  class Autorestart
703
- include Serie
704
-
705
- attr_reader :source
652
+ include Serie.with(source: true)
706
653
 
707
654
  def initialize(serie)
708
- @source = serie
655
+ self.source = serie
656
+ init
657
+ end
709
658
 
659
+ private def _init
710
660
  @restart_on_next = false
711
-
712
- mark_regarding! @source
713
661
  end
714
662
 
715
- def _restart
663
+ private def _restart
716
664
  @source.restart
717
665
  end
718
666
 
719
- def _next_value
667
+ private def _next_value
720
668
  if @restart_on_next
721
669
  @source.restart
722
670
  @restart_on_next = false
@@ -733,53 +681,59 @@ module Musa
733
681
  private_constant :Autorestart
734
682
 
735
683
  class Cutter
736
- include Serie
737
-
738
- attr_reader :source, :length
684
+ include Serie.with(source: true)
739
685
 
740
686
  def initialize(serie, length)
741
- @source = serie
742
- @length = length
687
+ self.source = serie
688
+ self.length = length
689
+ init
690
+ end
743
691
 
744
- mark_regarding! @source
692
+ def source=(serie)
693
+ super
694
+ @previous&.source = serie
745
695
  end
746
696
 
747
- def _restart
748
- @source.restart
697
+ attr_reader :length
698
+
699
+ def length=(value)
700
+ @length = value
701
+ @previous&.length = value
749
702
  end
750
703
 
751
- def _next_value
752
- @previous.materialize if @previous
704
+ private def _restart
705
+ @source.restart
706
+ end
753
707
 
708
+ private def _next_value
709
+ @previous&.materialize
754
710
  @previous = CutSerie.new @source, @length if @source.peek_next_value
755
711
  end
756
712
 
757
- private
758
-
759
713
  class CutSerie
760
- include Serie
714
+ include Serie.with(source: true)
761
715
 
762
716
  def initialize(serie, length)
763
- @source = serie
764
- @length = length
717
+ self.source = serie.instance
718
+ self.length = length
765
719
 
766
720
  @values = []
767
- _restart
768
-
769
- mark_as_instance!
721
+ init
770
722
  end
771
723
 
724
+ attr_accessor :length
725
+
772
726
  def _prototype!
773
727
  # TODO review why cannot get prototype of a cut serie
774
- raise PrototypingSerieError, 'Cannot get prototype of a cut serie'
728
+ raise PrototypingError, 'Cannot get prototype of a cut serie'
775
729
  end
776
730
 
777
- def _restart
731
+ private def _init
778
732
  @count = 0
779
733
  end
780
734
 
781
- def _next_value
782
- value ||= @values[@count]
735
+ private def _next_value
736
+ value = @values[@count]
783
737
  value ||= @values[@count] = @source.next_value if @count < @length
784
738
 
785
739
  @count += 1
@@ -791,30 +745,29 @@ module Musa
791
745
  (@values.size..@length - 1).each { |i| @values[i] = @source.next_value }
792
746
  end
793
747
  end
748
+
749
+ private_constant :CutSerie
794
750
  end
795
751
 
796
752
  private_constant :Cutter
797
753
 
798
754
  class Locker
799
- include Serie
800
-
801
- attr_reader :source
755
+ include Serie.with(source: true)
802
756
 
803
757
  def initialize(serie)
804
- @source = serie
758
+ self.source = serie
759
+
805
760
  @values = []
806
761
  @first_round = true
807
762
 
808
- _restart
809
-
810
- mark_regarding! @source
763
+ init
811
764
  end
812
765
 
813
- def _restart
766
+ private def _init
814
767
  @index = 0
815
768
  end
816
769
 
817
- def _next_value
770
+ private def _next_value
818
771
  if @first_round
819
772
  value = @source.next_value
820
773
 
@@ -836,34 +789,33 @@ module Musa
836
789
  private_constant :Locker
837
790
 
838
791
  class Reverser
839
- include Serie
840
-
841
- attr_reader :source
792
+ include Serie.with(source: true)
842
793
 
843
794
  def initialize(serie)
844
- @source = serie
845
- _restart false, false
846
-
847
- mark_regarding! @source
795
+ self.source = serie
796
+ init
848
797
  end
849
798
 
850
- def _instance!
799
+ def source=(serie)
800
+ raise ArgumentError, "A serie to reverse can't be infinite" if serie.infinite?
851
801
  super
852
- _restart false, true
802
+ init
853
803
  end
854
804
 
855
- def _restart(restart_sources = true, get_reversed = true)
856
- @source.restart if restart_sources
857
- @reversed = FromArray.new(next_values_array_of(@source).reverse).instance if get_reversed
805
+ private def _init
806
+ @reversed = nil
858
807
  end
859
808
 
860
- def _next_value
861
- @reversed.next_value
809
+ private def _restart
810
+ @source.restart
862
811
  end
863
812
 
864
- private
813
+ private def _next_value
814
+ @reversed ||= Constructors.S(*next_values_array_of(@source).reverse).instance
815
+ @reversed.next_value
816
+ end
865
817
 
866
- def next_values_array_of(serie)
818
+ private def next_values_array_of(serie)
867
819
  array = []
868
820
 
869
821
  until (value = serie.next_value).nil?
@@ -877,25 +829,27 @@ module Musa
877
829
  private_constant :Reverser
878
830
 
879
831
  class Randomizer
880
- include Serie
881
-
882
- attr_reader :source, :random
832
+ include Serie.with(source: true)
883
833
 
884
834
  def initialize(serie, random)
885
- @source = serie
886
- @random = random
835
+ self.source = serie
836
+ self.random = random
887
837
 
888
- _restart false
838
+ init
839
+ end
889
840
 
890
- mark_regarding! @source
841
+ attr_accessor :random
842
+
843
+ private def _init
844
+ @values = @source.to_a(duplicate: false, restart: false)
891
845
  end
892
846
 
893
- def _restart(restart_sources = true)
894
- @source.restart if restart_sources
895
- @values = @source.to_a
847
+ private def _restart
848
+ @source.restart
849
+ @values = @source.to_a(duplicate: false, restart: false)
896
850
  end
897
851
 
898
- def _next_value
852
+ private def _next_value
899
853
  if !@values.empty?
900
854
  position = @random.rand(0...@values.size)
901
855
  value = @values[position]
@@ -912,30 +866,46 @@ module Musa
912
866
  private_constant :Randomizer
913
867
 
914
868
  class Shifter
915
- include Serie
916
-
917
- attr_reader :source, :shift
869
+ include Serie.with(source: true)
918
870
 
919
871
  def initialize(serie, shift)
920
- raise ArgumentError, "cannot shift to right an infinite serie #{serie}" if shift > 0 && serie.infinite?
921
- raise ArgumentError, 'cannot shift to right: function not yet implemented' if shift > 0
872
+ self.source = serie
873
+ self.shift = shift
922
874
 
923
- @source = serie
924
- @shift = shift
925
-
926
- _restart false
875
+ init
876
+ end
927
877
 
928
- mark_regarding! @source
878
+ def source=(serie)
879
+ raise ArgumentError, "cannot shift to right an infinite serie" if @shift > 0 && serie.infinite?
880
+ super
881
+ # should _restart(false) ??? if so, we lost the shifted values of the previous serie; if not we don't shift the new serie values
882
+ # I think it's better to not _restart unless it's explicitly called by the caller
929
883
  end
930
884
 
931
- def _restart(restart_sources = true)
932
- @source.restart if restart_sources
885
+ attr_reader :shift
886
+
887
+ def shift=(value)
888
+ raise ArgumentError, "cannot shift to right an infinite serie" if value > 0 && @source&.infinite?
889
+ raise NotImplementedError, 'cannot shift to right: function not yet implemented' if value > 0
933
890
 
891
+ @shift = value
892
+ end
893
+
894
+ private def _init
934
895
  @shifted = []
935
- @shift.abs.times { @shifted << @source.next_value } if @shift < 0
896
+ @first = true
936
897
  end
937
898
 
938
- def _next_value
899
+ private def _restart
900
+ @source.restart
901
+ end
902
+
903
+ private def _next_value
904
+ if @first
905
+ @shift.abs.times { @shifted << @source.next_value } if @shift < 0
906
+ @first = false
907
+ end
908
+
939
909
  value = @source.next_value
940
910
  return value unless value.nil?
941
911
 
@@ -946,26 +916,26 @@ module Musa
946
916
  private_constant :Shifter
947
917
 
948
918
  class Remover
949
- include Serie
950
-
951
- attr_reader :source
919
+ include Serie.with(source: true, block: true)
952
920
 
953
921
  def initialize(serie, &block)
954
- @source = serie
955
- @block = block
956
- @history = []
922
+ self.source = serie
923
+ self.proc = block
957
924
 
958
- _restart false
925
+ @history = []
959
926
 
960
- mark_regarding! @source
927
+ init
961
928
  end
962
929
 
963
- def _restart(restart_sources = true)
964
- @source.restart if restart_sources
930
+ private def _init
965
931
  @history.clear
966
932
  end
967
933
 
968
- def _next_value
934
+ private def _restart
935
+ @source.restart
936
+ end
937
+
938
+ private def _next_value
969
939
  if value = @source.next_value
970
940
  while value && @block.call(value, @history)
971
941
  @history << value
@@ -980,24 +950,20 @@ module Musa
980
950
  private_constant :Remover
981
951
 
982
952
  class Selector
983
- include Serie
984
-
985
- attr_reader :source
953
+ include Serie.with(source: true, block: true)
986
954
 
987
955
  def initialize(serie, &block)
988
- @source = serie
989
- @block = block
990
-
991
- _restart false
956
+ self.source = serie
957
+ self.proc = block
992
958
 
993
- mark_regarding! @source
959
+ init
994
960
  end
995
961
 
996
- def _restart(restart_sources = true)
997
- @source.restart if restart_sources
962
+ private def _restart
963
+ @source.restart
998
964
  end
999
965
 
1000
- def _next_value
966
+ private def _next_value
1001
967
  value = @source.next_value
1002
968
  until value.nil? || @block.call(value)
1003
969
  value = @source.next_value
@@ -1009,23 +975,22 @@ module Musa
1009
975
  private_constant :Selector
1010
976
 
1011
977
  class HashFromSeriesArray
1012
- include Serie
1013
-
1014
- attr_reader :source, :keys
978
+ include Serie.with(source: true)
1015
979
 
1016
980
  def initialize(serie, keys)
1017
- @source = serie
1018
- @keys = keys
1019
- _restart false
981
+ self.source = serie
982
+ self.keys = keys
1020
983
 
1021
- mark_regarding! @source
984
+ init
1022
985
  end
1023
986
 
1024
- def _restart(restart_sources = true)
1025
- @source.restart if restart_sources
987
+ attr_accessor :keys
988
+
989
+ private def _restart
990
+ @source.restart
1026
991
  end
1027
992
 
1028
- def _next_value
993
+ private def _next_value
1029
994
  array = @source.next_value
1030
995
 
1031
996
  return nil unless array