musa-dsl 0.22.6 → 0.23.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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