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,15 +1,15 @@
1
1
  require_relative '../core-ext/arrayfy'
2
2
  require_relative '../core-ext/smart-proc-binder'
3
3
 
4
+ require_relative 'base-series'
5
+
4
6
  using Musa::Extension::Arrayfy
5
7
  using Musa::Extension::ExplodeRanges
6
8
 
7
9
  # TODO: añadir en for: steps: (nº de pasos en los que repartir el incremento)
8
10
 
9
11
  module Musa
10
- module Series
11
- extend self
12
-
12
+ module Series::Constructors
13
13
  def NIL
14
14
  NilSerie.new
15
15
  end
@@ -18,10 +18,6 @@ module Musa
18
18
  FromArray.new values.explode_ranges
19
19
  end
20
20
 
21
- def _SE(values, extends:)
22
- FromArray.new values.explode_ranges, extends
23
- end
24
-
25
21
  def H(**series_hash)
26
22
  FromHashOfSeries.new series_hash, false
27
23
  end
@@ -63,8 +59,8 @@ module Musa
63
59
  end
64
60
  end
65
61
 
66
- def MERGE(*values)
67
- Sequence.new(values)
62
+ def MERGE(*series)
63
+ Sequence.new(series)
68
64
  end
69
65
 
70
66
  def RND1(*values, from: nil, to: nil, step: nil, random: nil)
@@ -104,33 +100,35 @@ module Musa
104
100
  ###
105
101
 
106
102
  class NilSerie
107
- include Serie
108
- def _next_value
109
- nil
110
- end
103
+ include Musa::Series::Serie.base
104
+
105
+ def _next_value; nil; end
111
106
  end
112
107
 
113
108
  private_constant :NilSerie
114
109
 
115
110
  class FromArray
116
- include Serie
117
-
118
- attr_reader :values
111
+ include Musa::Series::Serie.base
119
112
 
120
113
  def initialize(values = nil, extends = nil)
121
- @values = values.clone.freeze
122
- @index = 0
114
+ @values = values
115
+ mark_as_prototype!
123
116
 
124
- extends.arrayfy.each { |e| extend(e) }
117
+ x = self
118
+ extends.arrayfy.each do |e|
119
+ x.extend(e)
120
+ end
125
121
 
126
- mark_as_prototype!
122
+ init
127
123
  end
128
124
 
129
- def _restart
125
+ attr_accessor :values
126
+
127
+ private def _init
130
128
  @index = 0
131
129
  end
132
130
 
133
- def _next_value
131
+ private def _next_value
134
132
  if @values && @index < @values.size
135
133
  value = @values[@index]
136
134
  @index += 1
@@ -142,31 +140,30 @@ module Musa
142
140
  end
143
141
  end
144
142
 
145
- private_constant :FromArray
143
+ # private_constant :FromArray
146
144
 
147
145
  class Sequence
148
- include Serie
149
-
150
- attr_reader :sources
146
+ include Musa::Series::Serie.with(sources: true)
151
147
 
152
148
  def initialize(series)
153
- @sources = if series[0].prototype?
154
- series.collect(&:prototype).freeze
155
- else
156
- series.collect(&:instance)
157
- end
158
-
159
- _restart false
149
+ self.sources = series
160
150
 
161
- mark_regarding! series[0]
151
+ init
162
152
  end
163
153
 
164
- def _restart(restart_sources = true)
154
+ attr_accessor :sources
155
+
156
+ private def _init
165
157
  @index = 0
166
- @sources[@index].restart if restart_sources
158
+ @restart_sources = false
167
159
  end
168
160
 
169
- def _next_value
161
+ private def _restart
162
+ @sources[0].restart
163
+ @restart_sources = true
164
+ end
165
+
166
+ private def _next_value
170
167
  value = nil
171
168
 
172
169
  if @index < @sources.size
@@ -175,7 +172,7 @@ module Musa
175
172
  if value.nil?
176
173
  @index += 1
177
174
  if @index < @sources.size
178
- @sources[@index].restart
175
+ @sources[@index].restart if @restart_sources
179
176
  value = next_value
180
177
  end
181
178
  end
@@ -192,27 +189,40 @@ module Musa
192
189
  private_constant :Sequence
193
190
 
194
191
  class FromEvalBlockWithParameters
195
- include Serie
196
- include Musa::Extension::SmartProcBinder
192
+ include Musa::Series::Serie.with(smart_block: true)
197
193
 
198
194
  using Musa::Extension::DeepCopy
199
195
 
200
- attr_reader :block
201
-
202
- def initialize(*values, **key_values, &block)
196
+ def initialize(*parameters, **key_parameters, &block)
203
197
  raise ArgumentError, 'Yield block is undefined' unless block
204
198
 
205
- @original_value_parameters = values
206
- @original_key_parameters = key_values
207
-
208
- @block = SmartProcBinder.new(block)
199
+ @original_value_parameters = parameters
200
+ @original_key_parameters = key_parameters
209
201
 
210
- _restart
202
+ self.proc = block
211
203
 
212
204
  mark_as_prototype!
205
+
206
+ init
207
+ end
208
+
209
+ def parameters
210
+ @original_value_parameters
211
+ end
212
+
213
+ def parameters=(values)
214
+ @original_value_parameters = values
215
+ end
216
+
217
+ def key_parameters
218
+ @original_key_parameters
213
219
  end
214
220
 
215
- def _restart
221
+ def key_parameters=(key_values)
222
+ @original_key_parameters = key_values
223
+ end
224
+
225
+ private def _init
216
226
  @value_parameters = @original_value_parameters.clone(deep: true)
217
227
  @key_parameters = @original_key_parameters.clone(deep: true)
218
228
 
@@ -220,7 +230,7 @@ module Musa
220
230
  @value = nil
221
231
  end
222
232
 
223
- def _next_value
233
+ private def _next_value
224
234
  @value = if !@value.nil? || @value.nil? && @first
225
235
  @value = @block.call(*@value_parameters, last_value: @value, caller: self, **@key_parameters)
226
236
  else
@@ -235,9 +245,7 @@ module Musa
235
245
  private_constant :FromEvalBlockWithParameters
236
246
 
237
247
  class ForLoop
238
- include Serie
239
-
240
- attr_reader :from, :to, :step
248
+ include Musa::Series::Serie.base
241
249
 
242
250
  def initialize(from, to, step)
243
251
  @from = from
@@ -246,22 +254,39 @@ module Musa
246
254
 
247
255
  sign_adjust_step
248
256
 
249
- _restart
250
-
251
257
  mark_as_prototype!
258
+
259
+ init
260
+ end
261
+
262
+ attr_reader :from, :to, :step
263
+
264
+ def from=(value)
265
+ @from = value
266
+ sign_adjust_step
252
267
  end
253
268
 
254
- def _restart
255
- @value = @from
269
+ def to=(value)
270
+ @to = value
271
+ sign_adjust_step
256
272
  end
257
273
 
258
- def _next_value
274
+ def step=(value)
275
+ @step = value
276
+ sign_adjust_step
277
+ end
278
+
279
+ private def _init
280
+ @value = @from - @step
281
+ end
282
+
283
+ private def _next_value
259
284
  if @value
260
- value = @value
261
285
  @value += @step
286
+ value = @value
262
287
  end
263
288
 
264
- @value = nil if @to && @value && (@value > @to && @step.positive? || @value < @to && @step.negative?)
289
+ @value = nil if @to && @value && (@value >= @to && @step.positive? || @value <= @to && @step.negative?)
265
290
 
266
291
  value
267
292
  end
@@ -278,24 +303,24 @@ module Musa
278
303
  private_constant :ForLoop
279
304
 
280
305
  class RandomValueFromArray
281
- include Serie
282
-
283
- attr_reader :values, :random
306
+ include Musa::Series::Serie.base
284
307
 
285
308
  def initialize(values, random)
286
- @values = values.clone.freeze
309
+ @values = values
287
310
  @random = random
288
311
 
289
- _restart
290
-
291
312
  mark_as_prototype!
313
+
314
+ init
292
315
  end
293
316
 
294
- def _restart
317
+ attr_accessor :values, :random
318
+
319
+ private def _init
295
320
  @value = nil
296
321
  end
297
322
 
298
- def _next_value
323
+ private def _next_value
299
324
  if @value
300
325
  nil
301
326
  else
@@ -307,9 +332,7 @@ module Musa
307
332
  private_constant :RandomValueFromArray
308
333
 
309
334
  class RandomNumberFromRange
310
- include Serie
311
-
312
- attr_reader :from, :to, :step, :random
335
+ include Musa::Series::Serie.base
313
336
 
314
337
  def initialize(from, to, step, random)
315
338
  @from = from
@@ -320,16 +343,39 @@ module Musa
320
343
 
321
344
  @random = random
322
345
 
323
- _restart
324
-
325
346
  mark_as_prototype!
347
+
348
+ init
326
349
  end
327
350
 
328
- def _restart
351
+ attr_reader :from
352
+
353
+ def from=(value)
354
+ @from = value
355
+ sign_adjust_step
356
+ end
357
+
358
+ attr_reader :to
359
+
360
+ def to=(value)
361
+ @to = value
362
+ sign_adjust_step
363
+ end
364
+
365
+ attr_reader :step
366
+
367
+ def step=(value)
368
+ @step = value
369
+ sign_adjust_step
370
+ end
371
+
372
+ attr_accessor :random
373
+
374
+ private def _init
329
375
  @value = nil
330
376
  end
331
377
 
332
- def _next_value
378
+ private def _next_value
333
379
  if @value
334
380
  nil
335
381
  else
@@ -346,24 +392,25 @@ module Musa
346
392
  private_constant :RandomNumberFromRange
347
393
 
348
394
  class RandomValuesFromArray
349
- include Serie
350
-
351
- attr_reader :values, :random
395
+ include Musa::Series::Serie.base
352
396
 
353
397
  def initialize(values, random)
354
398
  @values = values.clone.freeze
355
399
  @random = random
356
400
 
357
- _restart
358
-
359
401
  mark_as_prototype!
402
+
403
+ init
360
404
  end
361
405
 
362
- def _restart
406
+ attr_accessor :values
407
+ attr_accessor :random
408
+
409
+ private def _init
363
410
  @available_values = @values.dup
364
411
  end
365
412
 
366
- def _next_value
413
+ private def _next_value
367
414
  value = nil
368
415
  unless @available_values.empty?
369
416
  i = @random.rand(0...@available_values.size)
@@ -377,9 +424,7 @@ module Musa
377
424
  private_constant :RandomValuesFromArray
378
425
 
379
426
  class RandomNumbersFromRange
380
- include Serie
381
-
382
- attr_reader :from, :to, :step, :random
427
+ include Musa::Series::Serie.base
383
428
 
384
429
  def initialize(from, to, step, random)
385
430
  @from = from
@@ -390,16 +435,39 @@ module Musa
390
435
 
391
436
  @random = random
392
437
 
393
- _restart
394
-
395
438
  mark_as_prototype!
439
+
440
+ init
396
441
  end
397
442
 
398
- def _restart
443
+ attr_reader :from
444
+
445
+ def from=(value)
446
+ @from = value
447
+ adjust_step
448
+ end
449
+
450
+ attr_reader :to
451
+
452
+ def to=(value)
453
+ @to = value
454
+ adjust_step
455
+ end
456
+
457
+ attr_reader :step
458
+
459
+ def step=(value)
460
+ @step = value
461
+ adjust_step
462
+ end
463
+
464
+ attr_accessor :random
465
+
466
+ private def _init
399
467
  @available_steps = (0..@step_count).to_a
400
468
  end
401
469
 
402
- def _next_value
470
+ private def _next_value
403
471
  value = nil
404
472
  unless @available_steps.empty?
405
473
  i = @random.rand(0...@available_steps.size)
@@ -418,37 +486,27 @@ module Musa
418
486
  private_constant :RandomNumbersFromRange
419
487
 
420
488
  class FromHashOfSeries
421
- include Serie
422
-
423
- attr_reader :sources, :cycle
489
+ include Musa::Series::Serie.with(sources: true)
424
490
 
425
491
  def initialize(hash_of_series, cycle_all_series)
426
- @sources = hash_of_series.clone.transform_values(&:prototype).freeze
427
- @cycle = cycle_all_series
428
-
429
- _restart false
492
+ self.sources = hash_of_series
493
+ self.cycle = cycle_all_series
430
494
 
431
- mark_as_prototype!
495
+ init
432
496
  end
433
497
 
434
- def _restart(restart_sources = true)
498
+ attr_accessor :cycle
499
+
500
+ private def _init
435
501
  @have_current = false
436
502
  @value = nil
437
-
438
- if restart_sources
439
- @sources.each do |_key, serie|
440
- serie.restart
441
- end
442
- end
443
503
  end
444
504
 
445
- def _soft_restart
446
- @sources.each do |_key, serie|
447
- serie.restart if serie.current_value.nil?
448
- end
505
+ private def _restart
506
+ @sources.values.each(&:restart)
449
507
  end
450
508
 
451
- def _next_value
509
+ private def _next_value
452
510
  unless @have_current && @value.nil?
453
511
  pre_value = @sources.collect { |key, serie| [key, serie.peek_next_value] }.to_h
454
512
 
@@ -476,42 +534,38 @@ module Musa
476
534
 
477
535
  @value
478
536
  end
537
+
538
+ private def _soft_restart
539
+ @sources.each do |_key, serie|
540
+ serie.restart if serie.current_value.nil?
541
+ end
542
+ end
479
543
  end
480
544
 
481
545
  private_constant :FromHashOfSeries
482
546
 
483
547
  class FromArrayOfSeries
484
- include Serie
485
-
486
- attr_reader :sources, :cycle
548
+ include Musa::Series::Serie.with(sources: true)
487
549
 
488
550
  def initialize(series_array, cycle_all_series)
489
- @sources = series_array.collect(&:prototype).freeze
490
- @cycle = cycle_all_series
551
+ self.sources = series_array
552
+ self.cycle = cycle_all_series
491
553
 
492
- _restart false
493
-
494
- mark_as_prototype!
554
+ init
495
555
  end
496
556
 
497
- def _restart(restart_sources = true)
557
+ attr_accessor :cycle
558
+
559
+ private def _init
498
560
  @have_current = false
499
561
  @value = nil
500
-
501
- if restart_sources
502
- @sources.each do |serie|
503
- serie.restart if serie.current_value.nil?
504
- end
505
- end
506
562
  end
507
563
 
508
- def _soft_restart
509
- @sources.each do |serie|
510
- serie.restart if serie.current_value.nil?
511
- end
564
+ private def _restart
565
+ @sources.each(&:restart)
512
566
  end
513
567
 
514
- def _next_value
568
+ private def _next_value
515
569
  unless @have_current && @value.nil?
516
570
  pre_value = @sources.collect(&:peek_next_value)
517
571
 
@@ -539,14 +593,18 @@ module Musa
539
593
 
540
594
  @value
541
595
  end
596
+
597
+ private def _soft_restart
598
+ @sources.each do |serie|
599
+ serie.restart if serie.current_value.nil?
600
+ end
601
+ end
542
602
  end
543
603
 
544
604
  private_constant :FromArrayOfSeries
545
605
 
546
606
  class SinFunction
547
- include Serie
548
-
549
- attr_reader :start, :steps, :amplitude, :center
607
+ include Musa::Series::Serie.base
550
608
 
551
609
  def initialize(start, steps, amplitude, center)
552
610
  @start = start.to_f
@@ -557,16 +615,44 @@ module Musa
557
615
 
558
616
  update
559
617
 
560
- _restart
561
-
562
618
  mark_as_prototype!
619
+
620
+ init
621
+ end
622
+
623
+ attr_reader :start
624
+
625
+ def start=(value)
626
+ @start = value.to_f
627
+ update
628
+ end
629
+
630
+ attr_reader :steps
631
+
632
+ def steps=(value)
633
+ @steps = value
634
+ update
635
+ end
636
+
637
+ attr_reader :amplitude
638
+
639
+ def amplitude=(value)
640
+ @amplitude = value
641
+ update
642
+ end
643
+
644
+ attr_reader :center
645
+
646
+ def center=(value)
647
+ @center = value
648
+ update
563
649
  end
564
650
 
565
- def _restart
651
+ private def _init
566
652
  @position = 0
567
653
  end
568
654
 
569
- def _next_value
655
+ private def _next_value
570
656
  value = nil
571
657
  unless @position >= @steps
572
658
  value = Math.sin(@offset + @step_size * @position) * (@amplitude / 2.0) + @center
@@ -575,13 +661,7 @@ module Musa
575
661
  value
576
662
  end
577
663
 
578
- def to_s
579
- "offset: #{@offset.round(3)}rd amplitude: #{@amplitude.round(3)} center: #{@center.round(3)} length: #{@length} step_size: #{@step_size.round(6)}"
580
- end
581
-
582
- private
583
-
584
- def update
664
+ private def update
585
665
  y = 2 * (@start - @center) / @amplitude
586
666
  warn "WARNING: value for offset calc #{y} is outside asin range" if y < -1 || y > 1
587
667
  y = 1.0 if y > 1.0 # por los errores de precisión infinitesimal en el cálculo de y cuando es muy próximo a 1.0
@@ -590,25 +670,28 @@ module Musa
590
670
  @offset = Math.asin(y)
591
671
  @step_size = 2.0 * Math::PI / @steps
592
672
  end
673
+
674
+ def to_s
675
+ "offset: #{@offset.round(3)}rd amplitude: #{@amplitude.round(3)} center: #{@center.round(3)} length: #{@length} step_size: #{@step_size.round(6)}"
676
+ end
593
677
  end
594
678
 
595
679
  private_constant :SinFunction
596
680
 
597
681
  class Fibonacci
598
- include Serie
682
+ include Musa::Series::Serie.base
599
683
 
600
684
  def initialize
601
- _restart
602
-
603
685
  mark_as_prototype!
686
+ init
604
687
  end
605
688
 
606
- def _restart
689
+ private def _init
607
690
  @a = 0
608
691
  @b = 1
609
692
  end
610
693
 
611
- def _next_value
694
+ private def _next_value
612
695
  initial_b = @b
613
696
  @b = @a + @b
614
697
  @a = initial_b
@@ -624,20 +707,30 @@ module Musa
624
707
  private_constant :Fibonacci
625
708
 
626
709
  class HarmonicNotes
627
- include Serie
628
-
629
- attr_reader :error, :extended
710
+ include Musa::Series::Serie.base
630
711
 
631
712
  def initialize(error, extended)
632
713
  @error = error
633
714
  @extended = extended
634
715
 
635
- _restart
636
-
637
716
  mark_as_prototype!
717
+
718
+ init
719
+ end
720
+
721
+ attr_reader :error
722
+
723
+ def error=(value)
724
+ @error = value
725
+ end
726
+
727
+ attr_reader :extended
728
+
729
+ def extended=(value)
730
+ @extended = value
638
731
  end
639
732
 
640
- def _restart
733
+ def _init
641
734
  @harmonic = 0
642
735
  end
643
736