Class: Keisanjaku::RuleState

Inherits:
Object
  • Object
show all
Defined in:
lib/keisanjaku/rule_state.rb

Constant Summary collapse

FRONT_SLIDE_SCALES =
%w[B CI C].freeze
BACK_SLIDE_SCALES =
%w[S T].freeze
FIXED_SCALES =
%w[K A D L].freeze
SLIDE_SCALES =
(FRONT_SLIDE_SCALES + BACK_SLIDE_SCALES).freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(slide: 0.0, cursor: 0.0, face: :front) ⇒ RuleState

Returns a new instance of RuleState.



12
13
14
15
16
# File 'lib/keisanjaku/rule_state.rb', line 12

def initialize(slide: 0.0, cursor: 0.0, face: :front)
  self.slide = slide
  self.cursor = cursor
  self.face = face
end

Instance Attribute Details

#cursorObject

Returns the value of attribute cursor.



10
11
12
# File 'lib/keisanjaku/rule_state.rb', line 10

def cursor
  @cursor
end

#faceObject

Returns the value of attribute face.



10
11
12
# File 'lib/keisanjaku/rule_state.rb', line 10

def face
  @face
end

#slideObject

Returns the value of attribute slide.



10
11
12
# File 'lib/keisanjaku/rule_state.rb', line 10

def slide
  @slide
end

Instance Method Details

#align_slide_index(side) ⇒ Object



61
62
63
# File 'lib/keisanjaku/rule_state.rb', line 61

def align_slide_index(side)
  self.slide = cursor - index_position(side)
end

#align_slide_value(scale_name, value) ⇒ Object

Raises:



65
66
67
68
69
70
# File 'lib/keisanjaku/rule_state.rb', line 65

def align_slide_value(scale_name, value)
  scale = Scale.fetch(scale_name)
  raise ScaleError, "#{scale.name} is not on the slide" unless slide_scale?(scale.name)

  self.slide = cursor - scale.position(value)
end

#board_position(scale_name, value) ⇒ Object



51
52
53
54
55
# File 'lib/keisanjaku/rule_state.rb', line 51

def board_position(scale_name, value)
  scale = Scale.fetch(scale_name)
  local = scale.position(value)
  slide_scale?(scale.name) ? local + slide : local
end

#dupObject



33
34
35
# File 'lib/keisanjaku/rule_state.rb', line 33

def dup
  self.class.new(slide: slide, cursor: cursor, face: face)
end

#flip!Object



72
73
74
# File 'lib/keisanjaku/rule_state.rb', line 72

def flip!
  self.face = face == :front ? :back : :front
end

#local_position_for(scale_name) ⇒ Object



80
81
82
83
# File 'lib/keisanjaku/rule_state.rb', line 80

def local_position_for(scale_name)
  name = scale_name.to_s.upcase
  slide_scale?(name) ? cursor - slide : cursor
end

#move_cursor_to(scale_name, value) ⇒ Object



57
58
59
# File 'lib/keisanjaku/rule_state.rb', line 57

def move_cursor_to(scale_name, value)
  self.cursor = board_position(scale_name, value)
end

#read(scale_name) ⇒ Object



37
38
39
40
41
42
43
44
45
# File 'lib/keisanjaku/rule_state.rb', line 37

def read(scale_name)
  scale = Scale.fetch(scale_name)
  pos = local_position_for(scale.name)
  return nil unless pos && pos >= -1e-12 && pos <= 1.0 + 1e-12

  scale.value_at(pos.clamp(0.0, 1.0))
rescue ScaleError
  nil
end

#slide_scale?(scale_name) ⇒ Boolean

Returns:

  • (Boolean)


76
77
78
# File 'lib/keisanjaku/rule_state.rb', line 76

def slide_scale?(scale_name)
  SLIDE_SCALES.include?(scale_name.to_s.upcase)
end

#visible_scale_namesObject



47
48
49
# File 'lib/keisanjaku/rule_state.rb', line 47

def visible_scale_names
  face == :front ? %w[K A B CI C D L] : %w[K A S T D L]
end