Sha256: c4539e01d32bda53e0eda3fb03b954b9eaa08bd81ff0e33e24ade02abf182ecb

Contents?: true

Size: 1.72 KB

Versions: 15

Compression:

Stored size: 1.72 KB

Contents

# coding: utf-8
# frozen_string_literal: true

module Stealth
  module Flow
    class State

      include Comparable

      attr_accessor :name
      attr_reader :spec, :fails_to

      def initialize(name, spec, fails_to = nil)
        if fails_to.present? && !fails_to.is_a?(Stealth::Flow::State)
          raise(ArgumentError, 'fails_to state should be a Stealth::Flow::State')
        end

        @name, @spec, @fails_to = name, spec, fails_to
      end

      def <=>(other_state)
        state_position(self) <=> state_position(other_state)
      end

      def +(steps)
        if steps < 0
          new_position = state_position(self) + steps

          # we don't want to allow the array index to wrap here so we return
          # the first state instead
          if new_position < 0
            new_state = spec.states.keys.first
          else
            new_state = spec.states.keys.at(new_position)
          end
        else
          new_state = spec.states.keys[state_position(self) + steps]

          # we may have been told to access an out-of-bounds state
          # return the last state
          if new_state.blank?
            new_state = spec.states.keys.last
          end
        end

        new_state
      end

      def -(steps)
        if steps < 0
          return self + steps.abs
        else
          return self + (-steps)
        end
      end

      def to_s
        "#{name}"
      end

      def to_sym
        name.to_sym
      end

      private

        def state_position(state)
          states = spec.states.keys

          unless states.include?(state.to_sym)
            raise(ArgumentError, "state `#{state}' does not exist")
          end

          states.index(state.to_sym)
        end
    end
  end
end

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
stealth-1.0.4 lib/stealth/flow/state.rb
stealth-1.0.3 lib/stealth/flow/state.rb
stealth-1.0.2 lib/stealth/flow/state.rb
stealth-1.0.1 lib/stealth/flow/state.rb
stealth-1.0.0 lib/stealth/flow/state.rb
stealth-1.0.0.rc1 lib/stealth/flow/state.rb
stealth-1.0.0.pre2 lib/stealth/flow/state.rb
stealth-1.0.0.pre1 lib/stealth/flow/state.rb
stealth-0.10.6 lib/stealth/flow/state.rb
stealth-0.10.5 lib/stealth/flow/state.rb
stealth-0.10.4 lib/stealth/flow/state.rb
stealth-0.10.3 lib/stealth/flow/state.rb
stealth-0.10.2 lib/stealth/flow/state.rb
stealth-0.10.1 lib/stealth/flow/state.rb
stealth-0.10.0 lib/stealth/flow/state.rb