basic-sequencer 0.0.4 → 0.0.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 69fcf47b967d669ca28420c35c71dd4a642229da
4
- data.tar.gz: 96e296ed53e0f27a539dcfb8f32a9ebf461fc519
3
+ metadata.gz: 4893d5a6b3ec06799900f1b5b4e53303d35bc6c8
4
+ data.tar.gz: 943da273874a7d6f9ad2b38b9a34fa6ae4300eb3
5
5
  SHA512:
6
- metadata.gz: 79b566c5927160eead43d655a1a06c08eea322f63b6ec12bb1bcbf5ed64cfd48ad75aaa9210107829ef39fac244a42f6350278cd9fe3cc96d4084de9bc03d303
7
- data.tar.gz: dae58578dc14438b6133954e076679ad6bad8da0606ece4b222cf3488a80b7b934997ca93ffda0693425a8983f0e9286d0267ba5adb47da185e590e8c2286512
6
+ metadata.gz: 3bf48f0045b0f43c72f76ab778d0cafd1055cbafec7049eafa152ba036befeba9ffda0ba377b435ef4c9d50e22a6c485166d4447735602acd4da0aa17ca1fa13
7
+ data.tar.gz: 19668ba5050d6410ffada46a86282d6537beb6fc46b95bbcd9d422b1fad40107a62fae3459585cd28eb17694ef83155a83c2c0bbe4c4ce5d697373c3bd7a464c
data/lib/sequencer.rb CHANGED
@@ -19,6 +19,6 @@ require "sequencer/loop"
19
19
 
20
20
  module Sequencer
21
21
 
22
- VERSION = "0.0.4"
22
+ VERSION = "0.0.5"
23
23
 
24
24
  end
@@ -20,7 +20,7 @@ module Sequencer
20
20
  perform(sequence) && step(sequence)
21
21
  end
22
22
 
23
- # Step the sequencer and fire the step event
23
+ # Step the sequencer and fire Event#step event
24
24
  # @param [Array] sequence
25
25
  # @return [Boolean]
26
26
  def step(sequence)
@@ -33,10 +33,17 @@ module Sequencer
33
33
  true
34
34
  end
35
35
 
36
- # If a stop is triggered, stop. Otherwise if reset is triggered, reset. Finally,
37
- # fire the perform event on the current step of the sequence
36
+ # Represents performance of a single sequence frame
37
+ #
38
+ # Order of events:
39
+ #
40
+ # 1. If Event#next for the current pointer, fire
41
+ # 2. If EventTrigger#stop, fire Event#stop, otherwise:
42
+ # 3. If EventTrigger#reset, fire Event#reset
43
+ # 4. Fire Event#perform with the sequence frame
44
+ #
38
45
  # @param [Array] sequence
39
- # @return [Boolean] True if perform event was fired
46
+ # @return [Boolean] Whether Event#perform event was fired
40
47
  def perform(sequence)
41
48
  data = sequence.at(@pointer)
42
49
  @event.do_next(@pointer, data) if @event.next?(@pointer)
@@ -10,23 +10,33 @@ module Sequencer
10
10
  @stop = []
11
11
  end
12
12
 
13
+ # Fire an event the next time the pointer reaches the given number
14
+ # @param [Fixnum, nil] pointer The pointer number when the callback should be fired. If nil, it will be fired whenever Event#do_next is called.
15
+ # @param [Proc] block
16
+ # @return [Array<Proc>]
13
17
  def next(pointer = nil, &block)
18
+ @next[pointer] ||= []
14
19
  if block_given?
15
- @next[pointer] ||= []
20
+ @next[pointer].clear
16
21
  @next[pointer] << block
17
22
  end
18
- hash
23
+ @next[pointer]
19
24
  end
20
25
 
26
+ # Whether any callbacks exist for the given pointer (or nil)
27
+ # @param [Fixnum, nil] pointer
28
+ # @return [Boolean]
21
29
  def next?(pointer = nil)
22
30
  !@next[pointer].nil?
23
31
  end
24
32
 
33
+ # @param [Fixnum, nil] pointer The pointer number (or nil) to fire callbacks for.
34
+ # @param [Object] data The data for the current pointer
35
+ # @return [Array<Object>]
25
36
  def do_next(pointer, data)
26
37
  keys = [pointer, nil]
27
38
  callbacks = keys.map { |key| @next.delete(key) }.flatten.compact
28
- callbacks.each(&:call)
29
- true
39
+ callbacks.map(&:call)
30
40
  end
31
41
 
32
42
  # Set the step event
@@ -43,7 +53,7 @@ module Sequencer
43
53
  # Fire the step events
44
54
  # @return [Boolean]
45
55
  def do_step
46
- !@step.empty? && @step.map(:call)
56
+ @step.map(&:call)
47
57
  end
48
58
 
49
59
  # Access the stop events
@@ -1,5 +1,6 @@
1
1
  module Sequencer
2
2
 
3
+ # Define a looping behavior for the sequencer
3
4
  class Loop
4
5
 
5
6
  attr_reader :count, :range
@@ -17,35 +18,51 @@ module Sequencer
17
18
  @range = to_range(value)
18
19
  end
19
20
 
21
+ # The starting pointer position for this loop. For the default loop, position is 0
22
+ # @return [Fixnum]
20
23
  def start
21
24
  default? ? 0 : @range.begin
22
25
  end
23
26
 
27
+ # Mark a completed loop and return the start position
28
+ # @return [Fixnum] The loop start position (see Loop#start)
24
29
  def next
25
30
  @count += 1
26
31
  start
27
32
  end
28
33
 
34
+ # Is this a default loop? The default loops around the start and end of the sequence
35
+ # @return [Boolean]
29
36
  def default?
30
37
  @range.nil?
31
38
  end
32
39
 
40
+ # Is looping disabled?
41
+ # @return [Boolean]
33
42
  def disabled?
34
43
  @is_disabled
35
44
  end
36
45
 
46
+ # Disable looping
47
+ # @return [Boolean]
37
48
  def disable
38
49
  @is_disabled = true
39
50
  end
40
51
 
41
- def in_bounds?(num, options = {})
52
+ # Is the given pointer position in bounds of the loop?
53
+ # @param [Fixnum] pointer The pointer position to compare bounds to
54
+ # @param [Hash] options
55
+ # @option options [Fixnum] :length The sequence length (required if default loop is being used)
56
+ # @return [Boolean]
57
+ def in_bounds?(pointer, options = {})
42
58
  length = options[:length]
43
59
  range = default? ? 0..(length-1) : @range
44
- range.include?(num)
60
+ range.include?(pointer)
45
61
  end
46
62
 
47
63
  private
48
64
 
65
+ # Convert the given value to a range
49
66
  # @param [Array<Fixnum>, Fixnum, Range] value
50
67
  # @return [FalseClass, Range]
51
68
  def to_range(value)
@@ -0,0 +1,180 @@
1
+ require "helper"
2
+
3
+ class Sequencer::EventTriggerTest < Test::Unit::TestCase
4
+
5
+ context "EventTrigger" do
6
+
7
+ setup do
8
+ @trigger = Sequencer::Event.new
9
+ @cache = []
10
+ end
11
+
12
+ context "#next" do
13
+
14
+ should "fire callback" do
15
+ @trigger.next(3) do |p, d|
16
+ @cache << d
17
+ end
18
+ assert @cache.empty?
19
+ assert @trigger.next?(3)
20
+ refute @trigger.next?(2)
21
+ @trigger.do_next(3, true)
22
+ refute @cache.empty?
23
+ assert_equal 1, @cache.size
24
+ end
25
+
26
+ should "replace callback" do
27
+ @trigger.next(3) do |p, d|
28
+ @cache << d
29
+ end
30
+ assert @trigger.next?(3)
31
+ @trigger.next(3) do |p, d|
32
+ @cache << d
33
+ end
34
+ assert @cache.empty?
35
+ assert @trigger.next?(3)
36
+ refute @trigger.next?(2)
37
+ @trigger.do_next(3, true)
38
+ refute @cache.empty?
39
+ assert_equal 1, @cache.size
40
+ end
41
+
42
+ should "add callback" do
43
+ 3.times do
44
+ @trigger.next(3) << proc do |p, d|
45
+ @cache << d
46
+ end
47
+ end
48
+ assert @cache.empty?
49
+ assert @trigger.next?(3)
50
+ refute @trigger.next?(2)
51
+ @trigger.do_next(3, true)
52
+ refute @cache.empty?
53
+ assert_equal 3, @cache.size
54
+ end
55
+
56
+ end
57
+
58
+ context "#perform" do
59
+
60
+ should "fire callback" do
61
+ @trigger.perform do |d|
62
+ @cache << d
63
+ end
64
+ assert @cache.empty?
65
+ @trigger.do_perform(true)
66
+ refute @cache.empty?
67
+ assert_equal 1, @cache.size
68
+ end
69
+
70
+ should "replace callback" do
71
+ @trigger.perform do |d|
72
+ @cache << d
73
+ end
74
+ @trigger.perform do |d|
75
+ @cache << d
76
+ end
77
+ assert @cache.empty?
78
+ @trigger.do_perform(true)
79
+ refute @cache.empty?
80
+ assert_equal 1, @cache.size
81
+ end
82
+
83
+ should "add callback" do
84
+ 3.times do
85
+ @trigger.perform << proc do |p, d|
86
+ @cache << d
87
+ end
88
+ end
89
+ assert @cache.empty?
90
+ @trigger.do_perform(true)
91
+ refute @cache.empty?
92
+ assert_equal 3, @cache.size
93
+ end
94
+
95
+ end
96
+
97
+ context "#step" do
98
+
99
+ should "fire callback" do
100
+ @trigger.step do
101
+ @cache << true
102
+ end
103
+ assert @cache.empty?
104
+ @trigger.do_step
105
+ refute @cache.empty?
106
+ assert_equal 1, @cache.size
107
+ end
108
+
109
+ should "replace callback" do
110
+ @trigger.step do
111
+ @cache << true
112
+ end
113
+ @trigger.step do
114
+ @cache << true
115
+ end
116
+ assert @cache.empty?
117
+ @trigger.do_step
118
+ refute @cache.empty?
119
+ assert_equal 1, @cache.size
120
+ end
121
+
122
+ should "add callback" do
123
+ 3.times do
124
+ @trigger.step << proc do
125
+ @cache << true
126
+ end
127
+ end
128
+ assert @cache.empty?
129
+ @trigger.do_step
130
+ refute @cache.empty?
131
+ assert_equal 3, @cache.size
132
+ end
133
+
134
+ end
135
+
136
+ context "#stop" do
137
+
138
+ should "fire callback" do
139
+ @trigger.stop do
140
+ @cache << true
141
+ end
142
+ assert @cache.empty?
143
+ @trigger.do_stop
144
+ refute @cache.empty?
145
+ assert_equal 1, @cache.size
146
+ end
147
+
148
+ should "replace callback" do
149
+ @trigger.stop do
150
+ @cache << true
151
+ end
152
+ @trigger.stop do
153
+ @cache << true
154
+ end
155
+ assert @cache.empty?
156
+ @trigger.do_stop
157
+ refute @cache.empty?
158
+ assert_equal 1, @cache.size
159
+ end
160
+
161
+ should "add callback" do
162
+ 3.times do
163
+ @trigger.stop << proc do
164
+ @cache << true
165
+ end
166
+ end
167
+ assert @cache.empty?
168
+ @trigger.do_stop
169
+ refute @cache.empty?
170
+ assert_equal 3, @cache.size
171
+ end
172
+
173
+ end
174
+
175
+ end
176
+
177
+ end
178
+
179
+
180
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: basic-sequencer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ari Russo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-15 00:00:00.000000000 Z
11
+ date: 2014-09-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: midi-topaz
@@ -67,6 +67,7 @@ files:
67
67
  - lib/sequencer/loop.rb
68
68
  - test/clock_test.rb
69
69
  - test/core_test.rb
70
+ - test/event_test.rb
70
71
  - test/event_trigger_test.rb
71
72
  - test/helper.rb
72
73
  - test/loop_test.rb