Class: HeadMusic::Notation::ABC::VoltaPasses

Inherits:
Object
  • Object
show all
Defined in:
lib/head_music/notation/abc/volta_passes.rb

Overview

Interprets the digits of a volta bracket — “1”, “1,3”, “2-4” — as the pass numbers on which the bracketed bars play.

Class Method Summary collapse

Class Method Details

.ensure_unique(passes, digits, line_number) ⇒ Object (private)

Raises:



18
19
20
21
22
23
24
25
# File 'lib/head_music/notation/abc/volta_passes.rb', line 18

def self.ensure_unique(passes, digits, line_number)
  return if passes.uniq.length == passes.length

  raise ParseError.new(
    "Volta passes must be unique",
    line_number: line_number, snippet: digits
  )
end

.expand_range(part) ⇒ Object (private)



12
13
14
15
# File 'lib/head_music/notation/abc/volta_passes.rb', line 12

def self.expand_range(part)
  first, last = part.split("-", 2)
  last ? (first.to_i..last.to_i).to_a : [first.to_i]
end

.parse(digits, line_number) ⇒ Object



6
7
8
9
10
# File 'lib/head_music/notation/abc/volta_passes.rb', line 6

def self.parse(digits, line_number)
  passes = digits.split(",").flat_map { |part| expand_range(part) }.select(&:positive?)
  ensure_unique(passes, digits, line_number)
  passes
end