Sha256: b66a46c31103ee07be14c6a81931c1de3428779b6dccd163eef76b62b774c3d0

Contents?: true

Size: 995 Bytes

Versions: 1

Compression:

Stored size: 995 Bytes

Contents

# frozen_string_literal: true

module Qi
  # The Action abstraction.
  class Action
    CAPTURE_CHAR = "&"
    DROP_CHAR    = "*"

    # Action initializer.
    def initialize(*captures, **squares)
      @captures = captures
      @squares  = squares
    end

    # Commit an action to the position.
    #
    # @return [Array] An action to change the position.
    def call(**diffs)
      captures = @captures
      squares  = @squares

      diffs.each do |k, v|
        case String(k)
        when CAPTURE_CHAR
          captures = capture(v, *captures)
        when DROP_CHAR
          captures = drop(v, *captures)
        else
          squares = squares.merge(k => v)
        end
      end

      [captures, squares.compact]
    end

    private

    def capture(item, *items)
      [item] + items
    end

    def drop(item, *items)
      item_id = items.index(item) || raise(::IndexError, "Piece #{item.inspect} not found!")
      items.delete_at(item_id)
      items
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
qi-10.0.0.beta2 lib/qi/action.rb