Class: StateJacket::StateTransitionSystem

Inherits:
Object
  • Object
show all
Defined in:
lib/state_jacket/state_transition_system.rb

Instance Method Summary collapse

Constructor Details

#initializeStateTransitionSystem

Returns a new instance of StateTransitionSystem.



3
4
5
# File 'lib/state_jacket/state_transition_system.rb', line 3

def initialize
  @transitions = {}
end

Instance Method Details

#add(state) ⇒ Object



11
12
13
14
15
16
17
18
19
# File 'lib/state_jacket/state_transition_system.rb', line 11

def add(state)
  raise "states cannot be added after locking" if is_locked?
  if state.is_a?(Hash)
    from = state.keys.first.to_s
    transitions[from] = make_states(state.values.first)
  else
    transitions[state.to_s] = nil
  end
end

#can_transition?(from_to) ⇒ Boolean

Returns:

  • (Boolean)

Raises:

  • (ArgumentError)


32
33
34
35
36
37
38
# File 'lib/state_jacket/state_transition_system.rb', line 32

def can_transition?(from_to)
  raise ArgumentError.new("from_to should contain a single transition") unless from_to.size == 1
  from = from_to.keys.first.to_s
  to = make_states(from_to.values.first)
  allowed_states =  transitions[from] || []
  (to & allowed_states).length == to.length
end

#is_locked?Boolean

Returns:

  • (Boolean)


28
29
30
# File 'lib/state_jacket/state_transition_system.rb', line 28

def is_locked?
  !!@locked
end

#is_state?(state) ⇒ Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/state_jacket/state_transition_system.rb', line 52

def is_state?(state)
  transitions.keys.include?(state.to_s)
end

#is_terminator?(state) ⇒ Boolean

Returns:

  • (Boolean)


56
57
58
# File 'lib/state_jacket/state_transition_system.rb', line 56

def is_terminator?(state)
  terminators.include?(state.to_s)
end

#is_transitioner?(state) ⇒ Boolean

Returns:

  • (Boolean)


60
61
62
# File 'lib/state_jacket/state_transition_system.rb', line 60

def is_transitioner?(state)
  transitioners.include?(state.to_s)
end

#lockObject



21
22
23
24
25
26
# File 'lib/state_jacket/state_transition_system.rb', line 21

def lock
  return true if is_locked?
  transitions.freeze
  transitions.values.each { |value| value.freeze unless value.nil? }
  @locked = true
end

#statesObject



40
41
42
# File 'lib/state_jacket/state_transition_system.rb', line 40

def states
  transitions.keys
end

#terminatorsObject



48
49
50
# File 'lib/state_jacket/state_transition_system.rb', line 48

def terminators
  transitions.keys.select { |state| transitions[state] == nil }
end

#to_hObject



7
8
9
# File 'lib/state_jacket/state_transition_system.rb', line 7

def to_h
  transitions.dup
end

#transitionersObject



44
45
46
# File 'lib/state_jacket/state_transition_system.rb', line 44

def transitioners
  transitions.keys.select { |state| transitions[state] != nil }
end